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
This commit is contained in:
Nico Weber 2015-09-15 23:17:17 +00:00
parent 6864cbced6
commit 9677562c8f
2 changed files with 9 additions and 3 deletions

View File

@ -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);
}

View File

@ -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));
}