diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2019-03-08 04:45:37 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2019-03-08 04:45:37 +0000 |
commit | 1488ee4bd5418a5536856676c350c9ee64488334 (patch) | |
tree | e8000965c5d7f7ab08b07c2600482d03b1436fd8 /clang/lib/AST/ExprConstant.cpp | |
parent | 988332a54a705496b7a2e2bab5d032bf7ad2fce0 (diff) | |
download | bcm5719-llvm-1488ee4bd5418a5536856676c350c9ee64488334.tar.gz bcm5719-llvm-1488ee4bd5418a5536856676c350c9ee64488334.zip |
[ObjC] Emit a boxed expression as a compile-time constant if the
expression inside the parentheses is a valid UTF-8 string literal.
Previously clang emitted an expression like @("abc") as a message send
to stringWithUTF8String. This commit makes clang emit the boxed
expression as a compile-time constant instead.
This commit also has the effect of silencing the nullable-to-nonnull
conversion warning clang started emitting after r317727, which
originally motivated this commit (see https://oleb.net/2018/@keypath).
rdar://problem/42684601
Differential Revision: https://reviews.llvm.org/D58729
llvm-svn: 355662
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 111cffe373e..77443b67de4 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -1743,6 +1743,8 @@ static bool IsGlobalLValue(APValue::LValueBase B) { case Expr::CXXTypeidExprClass: case Expr::CXXUuidofExprClass: return true; + case Expr::ObjCBoxedExprClass: + return cast<ObjCBoxedExpr>(E)->isExpressibleAsConstantInitializer(); case Expr::CallExprClass: return IsStringLiteralCall(cast<CallExpr>(E)); // For GCC compatibility, &&label has static storage duration. @@ -5794,6 +5796,8 @@ public: bool VisitObjCStringLiteral(const ObjCStringLiteral *E) { return Success(E); } bool VisitObjCBoxedExpr(const ObjCBoxedExpr *E) { + if (E->isExpressibleAsConstantInitializer()) + return Success(E); if (Info.noteFailure()) EvaluateIgnoredValue(Info, E->getSubExpr()); return Error(E); |