forked from OSchip/llvm-project
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:
parent
6864cbced6
commit
9677562c8f
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue