Author: Mariya Podchishchaeva Date: 2023-10-23T10:43:47+02:00 New Revision: 5b189d6f5606b051667b363f7430a7b990afab34
URL: https://github.com/llvm/llvm-project/commit/5b189d6f5606b051667b363f7430a7b990afab34 DIFF: https://github.com/llvm/llvm-project/commit/5b189d6f5606b051667b363f7430a7b990afab34.diff LOG: [clang] Fix designated initializers inside templates (#69712) Skip anonymous members when rebuilding `DesignatedInitExpr` since designated inits for them are meant to be created during `InitListChecker::CheckDesignatedInitializer` routine. Fixes https://github.com/llvm/llvm-project/issues/65143 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/TreeTransform.h clang/test/SemaCXX/cxx2b-designated-initializers.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index de1ab29d3182f20..d697259f6f5eb9f 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -442,6 +442,9 @@ Bug Fixes in This Version - Clang no longer permits using the `_BitInt` types as an underlying type for an enumeration as specified in the C23 Standard. Fixes (`#69619 <https://github.com/llvm/llvm-project/issues/69619>`_) +- Clang now accepts anonymous members initialized with designated initializers + inside templates. + Fixes (`#65143 <https://github.com/llvm/llvm-project/issues/65143>`_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 8fafdd4f5caa1ed..094e5efa939f4d1 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -11783,8 +11783,6 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { bool ExprChanged = false; for (const DesignatedInitExpr::Designator &D : E->designators()) { if (D.isFieldDesignator()) { - Desig.AddDesignator(Designator::CreateFieldDesignator( - D.getFieldName(), D.getDotLoc(), D.getFieldLoc())); if (D.getFieldDecl()) { FieldDecl *Field = cast_or_null<FieldDecl>( getDerived().TransformDecl(D.getFieldLoc(), D.getFieldDecl())); @@ -11792,12 +11790,16 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { // Rebuild the expression when the transformed FieldDecl is // diff erent to the already assigned FieldDecl. ExprChanged = true; + if (Field->isAnonymousStructOrUnion()) + continue; } else { // Ensure that the designator expression is rebuilt when there isn't // a resolved FieldDecl in the designator as we don't want to assign // a FieldDecl to a pattern designator that will be instantiated again. ExprChanged = true; } + Desig.AddDesignator(Designator::CreateFieldDesignator( + D.getFieldName(), D.getDotLoc(), D.getFieldLoc())); continue; } diff --git a/clang/test/SemaCXX/cxx2b-designated-initializers.cpp b/clang/test/SemaCXX/cxx2b-designated-initializers.cpp index 5588926f419a932..1d9b9183b3679f1 100644 --- a/clang/test/SemaCXX/cxx2b-designated-initializers.cpp +++ b/clang/test/SemaCXX/cxx2b-designated-initializers.cpp @@ -9,17 +9,36 @@ union S { }; void f(int x, auto) { - const S result { // expected-error {{field designator (null) does not refer to any field in type 'const S'}} + const S result { .a = x }; } void g(void) { - f(0, 0); // expected-note {{in instantiation of function template specialization 'PR61118::f<int>' requested here}} + f(0, 0); } } // end namespace PR61118 +namespace GH65143 { +struct Inner { + int a; +}; + +struct Outer { + struct { + Inner inner; + }; +}; + +template <int val> void f() { + constexpr Outer x{.inner = {val}}; + static_assert(x.inner.a == val); +} + +void bar() { f<4>(); } +} + namespace GH62156 { union U1 { int x; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits