AaronBallman wrote:

> However, we do have some prior art -- we're not inventing the whole idea of 
> decl-merging from scratch right now. So maybe we can follow that prior art? 
> For example, top-level attributes on a struct's definition can be inherited 
> from a declaration in the same scope. It seems plausible that the same would 
> be true for redefinition, and then maybe we'd also extend that same 
> declaration-attribute-merging to fields within the struct.

Well, yes and no. We have prior art of doing this when we are checking valid 
redeclaration, but this is also about type merging as much as declaration 
merging. And with redefinitions, you run into problems you wouldn't be able to 
run into with redeclarations. e.g.,
```
struct S {
  char c;
  int x;
};

void func(struct S s) { ... } // Expects an unpacked structure

struct S {
  [[gnu::packed]] char c;
  [[gnu::packed]] int x;
};

int main() {
  struct S s = {};
  func(s); // Passes a packed structure
}
```
You couldn't run into this situation with redeclarations because you previously 
could not redeclare the structure fields.

The logic would sort of work out for standard attributes, at least by 
happenstance. There could be observable differences with `[[reproducible]]` and 
`[[unsequenced]]` but those are much more contrived situations given the nature 
of the attributes.

> So...yeah...

Yeah, there's a fair amount of moving parts. This is why I want to go with the 
most conservative approach of rejecting unless the attributes are the same. At 
some point, we'll get around to being able to tablegen more of this logic 
(likely leaning on the existing tablegen for some things like inheritable 
declaration attributes, and introducing new concepts like inheritable type 
attributes) and we can then relax the restrictions. But if we release in an 
unrestricted form, users *will* begin to rely on invalid code being accepted 
and we'll be in a pickle.

Curiously, GCC doesn't merge the standard attributes either, it seems to do 
last-one-wins: https://godbolt.org/z/j3W7ej5Kq

https://github.com/llvm/llvm-project/pull/132939
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to