diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp index 17d194355208d..f5fb9f6b7bbfa 100644 --- a/clang/lib/AST/ByteCode/Interp.cpp +++ b/clang/lib/AST/ByteCode/Interp.cpp @@ -579,9 +579,11 @@ bool CheckConst(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { if (llvm::is_contained(S.InitializingBlocks, Ptr.block())) return true; - const QualType Ty = Ptr.getType(); - const SourceInfo &Loc = S.Current->getSource(OpPC); - S.FFDiag(Loc, diag::note_constexpr_modify_const_type) << Ty; + if (!S.checkingPotentialConstantExpression()) { + const QualType Ty = Ptr.getType(); + const SourceInfo &Loc = S.Current->getSource(OpPC); + S.FFDiag(Loc, diag::note_constexpr_modify_const_type) << Ty; + } return false; } diff --git a/clang/test/AST/ByteCode/cxx20.cpp b/clang/test/AST/ByteCode/cxx20.cpp index 4c4624d7505e2..43115416451ec 100644 --- a/clang/test/AST/ByteCode/cxx20.cpp +++ b/clang/test/AST/ByteCode/cxx20.cpp @@ -1345,3 +1345,12 @@ namespace ExpandOnOPTEPointers { } static_assert(test()); } + +namespace ConstIntPotentialConstantExpr { + /// NO error about a constexpr function that's never a constant expression. + constexpr int Const() { + const int a = 10; // both-note {{declared const here}} + a = 20; // both-error {{cannot assign to variable 'a' with const-qualified type 'const int'}} + return 1; + } +}