From: Bill Wendling Date: Mon, 26 Nov 2018 02:10:53 +0000 (+0000) Subject: A "constexpr" is evaluated in a constant context. Make sure this is reflected X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae4b8efe92f4f30b36da73166ac89a7dc50ba917;p=clang A "constexpr" is evaluated in a constant context. Make sure this is reflected if a __builtin_constant_p() is a part of a constexpr. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@347531 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 29508368d7..5eb2f2e7b8 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -10882,6 +10882,7 @@ bool Expr::EvaluateAsInitializer(APValue &Value, const ASTContext &Ctx, ? EvalInfo::EM_ConstantExpression : EvalInfo::EM_ConstantFold); InitInfo.setEvaluatingDecl(VD, Value); + InitInfo.InConstantContext = true; LValue LVal; LVal.set(VD); @@ -11544,6 +11545,7 @@ bool Expr::isPotentialConstantExpr(const FunctionDecl *FD, EvalInfo Info(FD->getASTContext(), Status, EvalInfo::EM_PotentialConstantExpression); + Info.InConstantContext = true; const CXXMethodDecl *MD = dyn_cast(FD); const CXXRecordDecl *RD = MD ? MD->getParent()->getCanonicalDecl() : nullptr; diff --git a/test/SemaCXX/constant-expression-cxx1y.cpp b/test/SemaCXX/constant-expression-cxx1y.cpp index eb555737d1..3214a2c086 100644 --- a/test/SemaCXX/constant-expression-cxx1y.cpp +++ b/test/SemaCXX/constant-expression-cxx1y.cpp @@ -1122,3 +1122,11 @@ constexpr E e2 = E{0}; static_assert(e2.x != e2.y, ""); } // namespace IndirectFields + +constexpr bool __constant_string_p(const char *__s) { + while (__builtin_constant_p(*__s) && *__s) + __s++; + return __builtin_constant_p(*__s); +} + +constexpr bool n = __constant_string_p("a");