>>! In D2498#4, @jyoti.yalamanchili wrote:
> This bug appears only when typedef is used.
Doesn't look like it.
Changing the code to cast to (S*) instead of (T) still demonstrates the bug and
is still present even with this patch applied.
The problem is more general than typedefs and casts - arguably we should get
this (C++11) case too:
struct S { int i; };
void func(S);
void func() {
func(S{42});
}
but GCC doesn't get this either, so I'm less concerned.
GCC does get the cast case - with or without a typedef. So perhaps we can just
deal with casts for now...
The only other thing I can think of is far more invasive/more work - to get
this all right, what we really need is a tree of "completeness" - keeping track
of any time a type is required to be complete (not just a single bit that says
"this has been required to be complete") & then emitting any type for which it
was requried to be complete during a function we codegen'd.
This infrastructure would also allow us to do a better job minimizing debug
info for the limited debug info optimization where we currently fail:
struct foo { ... };
inline void unused() { foo f; } // 'f' is required to be complete here, but
the function is never called
foo *f; // but that required completeness is never relied upon for this TU -
a declaration would've sufficed
This hurts us in, for example, Clang's own Sema.h - the giant Sema class has a
single non-member inline function right after it that has dereferences a Sema
pointer, thus requiring Sema to be complete. From then on, if anything else in
the TU including Sema.h requires Sema (evern just a pointer to it it) the debug
info for the entire class will be emitted.
http://reviews.llvm.org/D2498
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits