summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2015-09-15 23:17:17 +0000
committerNico Weber <nicolasweber@gmx.de>2015-09-15 23:17:17 +0000
commit9677562c8f31459cac6ed15e4036eb19dfdb8d3d (patch)
tree69b3df96568c1ceb4f3315d3e7d6cf918e61e1fc /clang
parent6864cbced6756129e9aff63e7c41938de3bd1a29 (diff)
downloadbcm5719-llvm-9677562c8f31459cac6ed15e4036eb19dfdb8d3d.tar.gz
bcm5719-llvm-9677562c8f31459cac6ed15e4036eb19dfdb8d3d.zip
Don't crash when passing &@selector to a _Nonnull parameter. Fixes PR24774.
The root cause here is that ObjCSelectorExpr is an rvalue, yet it can have its address taken. That's kind of awkward, but fixing this is awkward in other ways, see https://llvm.org/bugs/show_bug.cgi?id=24774#c16 . For now, just fix the crash. llvm-svn: 247740
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/AST/ExprConstant.cpp5
-rw-r--r--clang/test/SemaObjCXX/sel-address.mm7
2 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 5eaf40eb2ad..2fb8c9c137b 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -4557,12 +4557,13 @@ public:
} // end anonymous namespace
/// Evaluate an expression as an lvalue. This can be legitimately called on
-/// expressions which are not glvalues, in two cases:
+/// expressions which are not glvalues, in three cases:
/// * function designators in C, and
/// * "extern void" objects
+/// * @selector() expressions in Objective-C
static bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info) {
assert(E->isGLValue() || E->getType()->isFunctionType() ||
- E->getType()->isVoidType());
+ E->getType()->isVoidType() || isa<ObjCSelectorExpr>(E));
return LValueExprEvaluator(Info, Result).Visit(E);
}
diff --git a/clang/test/SemaObjCXX/sel-address.mm b/clang/test/SemaObjCXX/sel-address.mm
index 931d793fd50..a1209abd4e6 100644
--- a/clang/test/SemaObjCXX/sel-address.mm
+++ b/clang/test/SemaObjCXX/sel-address.mm
@@ -2,7 +2,8 @@
// pr7390
void f(const SEL& v2) {}
-void g() {
+void g(SEL* _Nonnull);
+void h() {
f(@selector(dealloc));
SEL s = @selector(dealloc);
@@ -11,4 +12,8 @@ void g() {
@selector(dealloc) = s; // expected-error {{expression is not assignable}}
SEL* ps2 = &@selector(dealloc);
+
+ // Shouldn't crash.
+ g(&@selector(foo));
}
+
OpenPOWER on IntegriCloud