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 @@ -2641,8 +2641,15 @@ hadError = true; } else { // Typo correction didn't find anything. - SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown) - << FieldName << CurrentObjectType; + SourceLocation Loc = D->getFieldLoc(); + + // The loc can be invalid with a "null" designator (i.e. an anonymous + // union/struct). Do our best to approximate the location. + if (Loc.isInvalid()) + Loc = IList->getBeginLoc(); + + SemaRef.Diag(Loc, diag::err_field_designator_unknown) + << FieldName << CurrentObjectType << DIE->getSourceRange(); ++Index; return true; } diff --git a/clang/test/SemaCXX/cxx2b-designated-initializers.cpp b/clang/test/SemaCXX/cxx2b-designated-initializers.cpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaCXX/cxx2b-designated-initializers.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -std=c++2b -fsyntax-only -verify %s + +namespace PR61118 { + +union S { + struct { + int a; + }; +}; + +void f(int x, auto) { + const S result { // expected-error {{field designator (null) does not refer to any field in type 'const S'}} + .a = x + }; +} + +void g(void) { + f(0, 0); // expected-note {{in instantiation of function template specialization 'PR61118::f' requested here}} +} + +} // end namespace PR61118