summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp11
-rw-r--r--clang/test/Analysis/dynamic_type_check.m10
2 files changed, 21 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp
index af4187005c3..7e0cb8e9339 100644
--- a/clang/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp
@@ -151,6 +151,14 @@ PathDiagnosticPiece *DynamicTypeChecker::DynamicTypeBugVisitor::VisitNode(
return new PathDiagnosticEventPiece(Pos, OS.str(), true, nullptr);
}
+static bool hasDefinition(const ObjCObjectPointerType *ObjPtr) {
+ const ObjCInterfaceDecl *Decl = ObjPtr->getInterfaceDecl();
+ if (!Decl)
+ return false;
+
+ return Decl->getDefinition();
+}
+
// TODO: consider checking explicit casts?
void DynamicTypeChecker::checkPostStmt(const ImplicitCastExpr *CE,
CheckerContext &C) const {
@@ -177,6 +185,9 @@ void DynamicTypeChecker::checkPostStmt(const ImplicitCastExpr *CE,
if (!DynObjCType || !StaticObjCType)
return;
+ if (!hasDefinition(DynObjCType) || !hasDefinition(StaticObjCType))
+ return;
+
ASTContext &ASTCtxt = C.getASTContext();
// Strip kindeofness to correctly detect subtyping relationships.
diff --git a/clang/test/Analysis/dynamic_type_check.m b/clang/test/Analysis/dynamic_type_check.m
index 029bbed38ff..f9b181e308a 100644
--- a/clang/test/Analysis/dynamic_type_check.m
+++ b/clang/test/Analysis/dynamic_type_check.m
@@ -26,8 +26,18 @@ __attribute__((objc_root_class))
@interface NSNumber : NSObject <NSCopying>
@end
+@class MyType;
+
void testTypeCheck(NSString* str) {
id obj = str;
NSNumber *num = obj; // expected-warning {{}}
(void)num;
}
+
+void testForwardDeclarations(NSString* str) {
+ id obj = str;
+ // Do not warn, since no information is available wether MyType is a sub or
+ // super class of any other type.
+ MyType *num = obj; // no warning
+ (void)num;
+}
OpenPOWER on IntegriCloud