[PATCH] D17407: [Sema] PR25755 Fix crash when initializing out-of-order struct references

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 7 18:23:44 PDT 2016

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.


More information about the cfe-commits mailing list