rsmith added a comment.

In http://reviews.llvm.org/D17407#385208, @hintonda wrote:

> I'm probably missing something, but isn't 
> InitListChecker::CheckStructUnionTypes() called recursively, if indirectly?  
> In which case we'd want to start from the Field iterator we were given, not 
> the look at all the fields.


No: if `CheckDesignatedInitializer` finds a top-level designator (denoting a 
field in the same struct for which it was called, rather than a subobject of 
that field), it just returns. `CheckStructUnionTypes` should never recursively 
re-enter the same subobject.

However, you do make a good point: we *can* enter `CheckStructUnionTypes` 
multiple times for the same subobject, in a case like

  struct Q { Q(int); }
  struct A { Q x, y; };
  struct B { A a; int k; };
  B b = { .a.y = 0, 0, .a.x = 0 };

... and we should not `CheckEmptyInitializable` in that case, nor warn that an 
initializer for `a.x` is missing. (But we should do so if the final initializer 
for `a.x` is not present.)

It looks like we need to do all this checking as a separate pass after checking 
the initialization, even in `VerifyOnly` mode.


http://reviews.llvm.org/D17407



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

Reply via email to