aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-09-02 00:00:05 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-09-02 00:00:05 +0000
commitce8827a4941fb966e3f6c32fbe97a7bbb7da5840 (patch)
treee2e80363d596e51fa7bb871964ca9ccb23465b53
parentf9a883c27e3b5724a5a59499691fa109eb5032f8 (diff)
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
-rw-r--r--include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--lib/Sema/SemaExpr.cpp11
2 files changed, 11 insertions, 2 deletions
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<PointerType>())
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();