From 2cbf5127d58553fd6224a1ec809536bccc5b8510 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Fri, 7 Apr 2023 11:35:29 -0700 Subject: [PATCH] [Clang] Improve designated inits diagnostic location A "null" designator won't have a valid location. Try to approximate this location as best we can in that situation. Closes 61118 Closes 46132 Reviewed By: shafik Differential Revision: https://reviews.llvm.org/D147673 --- clang/lib/Sema/SemaInit.cpp | 11 +++++++++-- .../test/SemaCXX/cxx2b-designated-initializers.cpp | 21 +++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 clang/test/SemaCXX/cxx2b-designated-initializers.cpp diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 5fe417f..be46191 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -2641,8 +2641,15 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 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 index 0000000..3cddb5d --- /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 -- 2.7.4