diff options
Diffstat (limited to 'lib/Sema/SemaDecl.cpp')
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 125d91cdba..1b6ff878f5 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -872,13 +872,21 @@ bool Sema::CheckAddressConstantExpression(const Expr* Init) { 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); |