diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -2170,11 +2170,6 @@ continue; } - if (Field == FieldEnd) { - // We've run out of fields. We're done. - break; - } - // Check if this is an initializer of forms: // // struct foo f = {}; @@ -2204,6 +2199,11 @@ break; } + if (Field == FieldEnd) { + // We've run out of fields. We're done. + break; + } + // We've already initialized a member of a union. We're done. if (InitializedSomething && DeclType->isUnionType()) break; diff --git a/clang/test/Sema/init-randomized-struct.c b/clang/test/Sema/init-randomized-struct.c --- a/clang/test/Sema/init-randomized-struct.c +++ b/clang/test/Sema/init-randomized-struct.c @@ -1,6 +1,13 @@ -// RUN: %clang_cc1 -triple=x86_64-unknown-linux -frandomize-layout-seed=1234567890abcdef \ +// RUN: %clang_cc1 -triple=x86_64-unknown-linux -frandomize-layout-seed=1234567890abcded \ // RUN: -verify -fsyntax-only -Werror %s +// NOTE: The current seed (1234567890abcded) is specifically chosen because it +// uncovered a bug in diagnostics. With it the randomization of "t9" places the +// "a" element at the end of the record. When that happens, the clang complains +// about excessive initializers, which is confusing, because there aren't +// excessive initializers. It should instead complain about using a +// non-designated initializer on a raqndomized struct. + // Initializing a randomized structure requires a designated initializer, // otherwise the element ordering will be off. The only exceptions to this rule // are: