From: Fariborz Jahanian Date: Wed, 2 Sep 2009 00:00:05 +0000 (+0000) Subject: It is illegal to derefrercne to an interface in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ce8827a4941fb966e3f6c32fbe97a7bbb7da5840;p=clang It is illegal to derefrercne to an interface in objc's non-fragile ABI. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80739 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 5e9c7486d3..e29e6ab4c7 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -1355,6 +1355,8 @@ def err_typecheck_unary_expr : Error< "invalid argument type %0 to unary expression">; def err_typecheck_indirection_requires_pointer : Error< "indirection requires pointer operand (%0 invalid)">; +def err_indirection_requires_nonfragile_object : Error< + "indirection cannot be to an interface in non-fragile ABI (%0 invalid)">; def err_typecheck_invalid_operands : Error< "invalid operands to binary expression (%0 and %1)">; def err_typecheck_sub_ptr_object : Error< diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index c01097e363..7072443829 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -5023,8 +5023,15 @@ QualType Sema::CheckIndirectionOperand(Expr *Op, SourceLocation OpLoc) { if (const PointerType *PT = Ty->getAs()) return PT->getPointeeType(); - if (const ObjCObjectPointerType *OPT = Ty->getAsObjCObjectPointerType()) - return OPT->getPointeeType(); + if (const ObjCObjectPointerType *OPT = Ty->getAsObjCObjectPointerType()) { + QualType PTy = OPT->getPointeeType(); + if (LangOpts.ObjCNonFragileABI && PTy->isObjCInterfaceType()) { + Diag(OpLoc, diag::err_indirection_requires_nonfragile_object) + << Ty << Op->getSourceRange(); + return QualType(); + } + return PTy; + } Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer) << Ty << Op->getSourceRange();