Make sema and codegen allow __builtin___CFStringMakeConstantString as a valid
constant lvalue. Implement this in codegen by moving the code out of CGBuiltin
into EmitConstantExpr.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57163 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 125d91c..1b6ff87 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -872,13 +872,21 @@
Diag(Init->getExprLoc(),
diag::err_init_element_not_constant, Init->getSourceRange());
return true;
- case Expr::ParenExprClass: {
- const ParenExpr* PE = cast<ParenExpr>(Init);
- return CheckAddressConstantExpression(PE->getSubExpr());
- }
+ case Expr::ParenExprClass:
+ return CheckAddressConstantExpression(cast<ParenExpr>(Init)->getSubExpr());
case Expr::StringLiteralClass:
case Expr::ObjCStringLiteralClass:
return false;
+ case Expr::CallExprClass:
+ // __builtin___CFStringMakeConstantString is a valid constant l-value.
+ if (cast<CallExpr>(Init)->isBuiltinCall() ==
+ Builtin::BI__builtin___CFStringMakeConstantString)
+ return false;
+
+ Diag(Init->getExprLoc(),
+ diag::err_init_element_not_constant, Init->getSourceRange());
+ return true;
+
case Expr::UnaryOperatorClass: {
const UnaryOperator *Exp = cast<UnaryOperator>(Init);