[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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@283116 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vedant Kumar 2016-10-03 15:29:22 +00:00
parent 8e9bb60de4
commit b3fa84259c
2 changed files with 15 additions and 1 deletions

View File

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

View File

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