diff options
author | Chris Lattner <sabre@nondot.org> | 2008-10-06 07:26:43 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-10-06 07:26:43 +0000 |
commit | 506ff88f44562df267b6a06608ab841b76df2a2b (patch) | |
tree | 46b584fbf5003c15facceaa7aa3adb4a9c5393a6 /lib/Sema/SemaDecl.cpp | |
parent | 7cecee8da98e86cf7118d15a0f198b98956089a7 (diff) |
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
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); |