rsmith added a comment.

In D106994#2911903 <https://reviews.llvm.org/D106994#2911903>, @vsapsai wrote:

> In D106994#2911508 <https://reviews.llvm.org/D106994#2911508>, @rsmith wrote:
>
>> For what it's worth, I think the right way to handle this in C is to 
>> properly implement the "compatible types" rule instead of trying to invent 
>> something ODR-ish: in C, struct definitions in different translation units 
>> are different types, but if they're structurally equivalent then they're 
>> compatible and you can implicitly pass an object of some type to a function 
>> accepting a compatible type. This would mean that we could have multiple, 
>> different types with the same name, and we'd need name lookup to deduplicate 
>> compatible types, but we wouldn't need to do any cross-module ODR-like 
>> struct merging.
>
> I agree that implementing the "compatible types" looks better as it models 
> the language more faithfully. And in the long run we might need to do that 
> anyway. Is there any work done for "compatible types" already? Or I can start 
> by creating a new type for a new definition with the same name and see how it 
> breaks the lookup?
>
> From pragmatic perspective we are pretty invested into this ODR-ish approach 
> and it's not clear how much work switching to "compatible types" would take. 
> So I'd like to continue with the definition merging and evaluate the effort 
> for "compatible types". That's why I'm curious what work is done already.

I don't think there's been any real work done on a cross-TU implementation of 
compatible types. I also don't want that idea to get in the way of this patch, 
which seems like a clear improvement following our current approach.

>> But assuming we want to keep the current ODR-in-C approach, this looks OK. 
>> There might be some places that assume the lexical and semantic 
>> `DeclContext` for a C `FieldDecl` are the same (etc) but I don't think 
>> there's a good way to find such things other than by testing this patch 
>> broadly.
>
> Are there any known signs for mixing lexical and semantic `DeclContext`? I 
> plan to test the change on our internal codebase, hopefully it'll help to 
> catch any remaining issues.

The kinds of things I saw go wrong when we were bringing this up on the C++ 
side were generally in code that would walk the list of (say) fields of a 
record building up some information, and then attempt to look up a given 
`FieldDecl*` in that data structure. That can fail if fields get merged, 
because the lookup key may be a different redeclaration of the same field than 
the one found by walking the class's members.  The fix is usually to add 
`getCanonicalDecl` calls in the right places. The sign of this kind of bug 
happening was usually a crash or assert, usually pretty close to where the 
problem was.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106994/new/

https://reviews.llvm.org/D106994

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to