diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp | 11 | ||||
| -rw-r--r-- | clang/test/Analysis/dynamic_type_check.m | 10 |
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; +} |

