>>! 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

Reply via email to