forked from OSchip/llvm-project
[ARC] Ignore qualifiers in copy-restore expressions
When ARC is enabled, an ObjCIndirectCopyRestoreExpr models the passing of a function argument s.t: * The argument is copied into a temporary, * The temporary is passed into the function, and * After the function call completes, the temporary is move-assigned back to the original location of the argument. The argument type and the parameter type must agree "except possibly in qualification". This commit weakens an assertion in EmitCallArg() to actually reflect that. llvm-svn: 283116
This commit is contained in:
parent
f7df85af87
commit
30914f3d1c
|
@ -3269,7 +3269,7 @@ void CodeGenFunction::EmitCallArg(CallArgList &args, const Expr *E,
|
|||
if (const ObjCIndirectCopyRestoreExpr *CRE
|
||||
= dyn_cast<ObjCIndirectCopyRestoreExpr>(E)) {
|
||||
assert(getLangOpts().ObjCAutoRefCount);
|
||||
assert(getContext().hasSameType(E->getType(), type));
|
||||
assert(getContext().hasSameUnqualifiedType(E->getType(), type));
|
||||
return emitWritebackArg(*this, args, CRE);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
// RUN: %clang_cc1 %s -fobjc-arc -S -emit-llvm -o /dev/null
|
||||
|
||||
// rdar://problem/28488427 - Don't crash if the argument type and the parameter
|
||||
// type in an indirect copy restore expression have different qualification.
|
||||
@protocol P1
|
||||
@end
|
||||
|
||||
typedef int handler(id<P1> *const p);
|
||||
|
||||
int main() {
|
||||
id<P1> i1 = 0;
|
||||
handler *func = 0;
|
||||
return func(&i1);
|
||||
}
|
Loading…
Reference in New Issue