diff options
author | Jordan Rose <jordan_rose@apple.com> | 2013-04-17 18:03:48 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2013-04-17 18:03:48 +0000 |
commit | add14263ea96e96c9cb6c96786ccffb7e242b87f (patch) | |
tree | f5b0c1803a190cb80b209b793fa1c2effb09fc56 /clang/lib/StaticAnalyzer/Core/CallEvent.cpp | |
parent | c7400488b947f9f13de99f00932c6eb0b5d22fa8 (diff) | |
download | bcm5719-llvm-add14263ea96e96c9cb6c96786ccffb7e242b87f.tar.gz bcm5719-llvm-add14263ea96e96c9cb6c96786ccffb7e242b87f.zip |
[analyzer] Don't warn for returning void expressions in void blocks.
This was slightly tricky because BlockDecls don't currently store an
inferred return type. However, we can rely on the fact that blocks with
inferred return types will have return statements that match the inferred
type.
<rdar://problem/13665798>
llvm-svn: 179699
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/CallEvent.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/CallEvent.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp index 45b2e219d9e..dfd20b8b332 100644 --- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp +++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp @@ -239,8 +239,20 @@ QualType CallEvent::getDeclaredResultType(const Decl *D) { assert(D); if (const FunctionDecl* FD = dyn_cast<FunctionDecl>(D)) return FD->getResultType(); - else if (const ObjCMethodDecl* MD = dyn_cast<ObjCMethodDecl>(D)) + if (const ObjCMethodDecl* MD = dyn_cast<ObjCMethodDecl>(D)) return MD->getResultType(); + if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) { + // Blocks are difficult because the return type may not be stored in the + // BlockDecl itself. The AST should probably be enhanced, but for now we + // just do what we can. + QualType Ty = BD->getSignatureAsWritten()->getType(); + if (const FunctionType *FT = Ty->getAs<FunctionType>()) + if (!FT->getResultType()->isDependentType()) + return FT->getResultType(); + + return QualType(); + } + return QualType(); } |