Author: Timm Bäder Date: 2024-05-15T09:49:57+02:00 New Revision: 7f3ac51b946bf6d6fa8c8443457ebee219879302
URL: https://github.com/llvm/llvm-project/commit/7f3ac51b946bf6d6fa8c8443457ebee219879302 DIFF: https://github.com/llvm/llvm-project/commit/7f3ac51b946bf6d6fa8c8443457ebee219879302.diff LOG: [clang][Interp] Only accept constant variables in c++98 Added: Modified: clang/lib/AST/Interp/Interp.cpp clang/test/AST/Interp/cxx98.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/Interp.cpp b/clang/lib/AST/Interp/Interp.cpp index 2607e07432516..3e4da487e43c3 100644 --- a/clang/lib/AST/Interp/Interp.cpp +++ b/clang/lib/AST/Interp/Interp.cpp @@ -302,7 +302,9 @@ bool CheckConstant(InterpState &S, CodePtr OpPC, const Descriptor *Desc) { QualType T = VD->getType(); if (S.getLangOpts().CPlusPlus && !S.getLangOpts().CPlusPlus11) - return T->isSignedIntegerOrEnumerationType() || T->isUnsignedIntegerOrEnumerationType(); + return (T->isSignedIntegerOrEnumerationType() || + T->isUnsignedIntegerOrEnumerationType()) && + T.isConstQualified(); if (T.isConstQualified()) return true; @@ -316,12 +318,10 @@ bool CheckConstant(InterpState &S, CodePtr OpPC, const Descriptor *Desc) { return false; }; - if (const auto *D = Desc->asValueDecl()) { - if (const auto *VD = dyn_cast<VarDecl>(D); - VD && VD->hasGlobalStorage() && !IsConstType(VD)) { - diagnoseNonConstVariable(S, OpPC, VD); - return S.inConstantContext(); - } + if (const auto *D = Desc->asVarDecl(); + D && D->hasGlobalStorage() && !IsConstType(D)) { + diagnoseNonConstVariable(S, OpPC, D); + return S.inConstantContext(); } return true; diff --git a/clang/test/AST/Interp/cxx98.cpp b/clang/test/AST/Interp/cxx98.cpp index ba6bcd97d920d..be81735329db8 100644 --- a/clang/test/AST/Interp/cxx98.cpp +++ b/clang/test/AST/Interp/cxx98.cpp @@ -45,3 +45,8 @@ struct C0 { }; const int c0_test = C0::Data<int*>; _Static_assert(c0_test == 0, ""); + + +int a = 0; // both-note {{declared here}} +_Static_assert(a == 0, ""); // both-error {{static assertion expression is not an integral constant expression}} \ + // both-note {{read of non-const variable 'a' is not allowed in a constant expression}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits