llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Younan Zhang (zyn0217) <details> <summary>Changes</summary> The instantiation of a VarDecl's initializer might be deferred until the variable is actually used. However, we were still building the DeclRefExpr with a type that could later be changed by the initializer's instantiation, which is incorrect when incomplete arrays are involved. Fixes #<!-- -->79750 Fixes #<!-- -->113936 Fixes #<!-- -->133047 --- Full diff: https://github.com/llvm/llvm-project/pull/133212.diff 3 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+1) - (modified) clang/lib/Sema/SemaExpr.cpp (+7-4) - (modified) clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp (+26) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 8182bccdd2da8..6749369c91559 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -355,6 +355,7 @@ Bug Fixes to C++ Support - Correctly diagnoses if unresolved using declarations shadows template paramters (#GH129411) - Clang was previously coalescing volatile writes to members of volatile base class subobjects. The issue has been addressed by propagating qualifiers during derived-to-base conversions in the AST. (#GH127824) +- Correctly propagates the instantiated array type to the ``DeclRefExpr`` that refers to it. (#GH79750), (#GH113936), (#GH133047) - Fixed a Clang regression in C++20 mode where unresolved dependent call expressions were created inside non-dependent contexts (#GH122892) - Clang now emits the ``-Wunused-variable`` warning when some structured bindings are unused and the ``[[maybe_unused]]`` attribute is not applied. (#GH125810) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..f837b047ddfb4 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -19849,11 +19849,14 @@ static void DoMarkVarDeclReferenced( SemaRef.InstantiateVariableDefinition(PointOfInstantiation, Var); }); - // Re-set the member to trigger a recomputation of the dependence bits - // for the expression. - if (auto *DRE = dyn_cast_or_null<DeclRefExpr>(E)) + if (auto *DRE = dyn_cast_or_null<DeclRefExpr>(E)) { + // Re-set the member to trigger a recomputation of the dependence bits + // for the expression. DRE->setDecl(DRE->getDecl()); - else if (auto *ME = dyn_cast_or_null<MemberExpr>(E)) + if (SemaRef.Context.getAsIncompleteArrayType(DRE->getType()) && + !SemaRef.Context.getAsIncompleteArrayType(Var->getType())) + DRE->setType(Var->getType()); + } else if (auto *ME = dyn_cast_or_null<MemberExpr>(E)) ME->setMemberDecl(ME->getMemberDecl()); } else if (FirstInstantiation) { SemaRef.PendingInstantiations diff --git a/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp b/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp index da1678ec68627..6fc2032ee7fb4 100644 --- a/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp +++ b/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp @@ -467,3 +467,29 @@ namespace VexingParse { template <typename> int var; // expected-note {{declared here}} int x(var); // expected-error {{use of variable template 'var' requires template arguments}} } + +#ifndef PRECXX11 + +namespace GH79750 { + +enum class Values { A }; + +template<typename E> +constexpr Values values[] = {E::A}; + +constexpr auto r = values<Values>[0] == Values::A; + +} + +namespace GH113956 { + +template <class T, T... VALUES> +struct C { + static constexpr T VALUEARRAY[] = {VALUES...}; +}; + +static_assert(C<int, 0,1,2,3,4>::VALUEARRAY[3] == 3, ""); +static_assert(C<int, 0,1,2,3,4>::VALUEARRAY[0] == 0, ""); + +} +#endif `````````` </details> https://github.com/llvm/llvm-project/pull/133212 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits