]> granicus.if.org Git - clang/commitdiff
A "constexpr" is evaluated in a constant context. Make sure this is reflected
authorBill Wendling <isanbard@gmail.com>
Mon, 26 Nov 2018 02:10:53 +0000 (02:10 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 26 Nov 2018 02:10:53 +0000 (02:10 +0000)
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

lib/AST/ExprConstant.cpp
test/SemaCXX/constant-expression-cxx1y.cpp

index 29508368d756c5f2b8ae1b4a208d46e759e0149f..5eb2f2e7b84b7c546db1f62b6d8f7ffb295a0ee4 100644 (file)
@@ -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<CXXMethodDecl>(FD);
   const CXXRecordDecl *RD = MD ? MD->getParent()->getCanonicalDecl() : nullptr;
index eb555737d121d32cecc9565e85527fd58464c428..3214a2c0862690007bde3e24f68a70dce08cb9b0 100644 (file)
@@ -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");