On Tue, Apr 7, 2015 at 2:01 AM, David Majnemer <[email protected]> wrote: > Author: majnemer > Date: Tue Apr 7 01:01:53 2015 > New Revision: 234297 > > URL: http://llvm.org/viewvc/llvm-project?rev=234297&view=rev > Log: > [Sema] Don't crash when __attribute__((nonnull)) is applied to blocks > > A simple case of asserting isFunctionOrMethod when we should have > asserted isFunctionOrMethodOrBlock. > > This fixes PR23117.
Thanks, good catch! ~Aaron > > Modified: > cfe/trunk/lib/Sema/SemaDeclAttr.cpp > cfe/trunk/test/SemaObjC/nonnull.m > > Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=234297&r1=234296&r2=234297&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Tue Apr 7 01:01:53 2015 > @@ -51,6 +51,11 @@ namespace AttributeLangSupport { > static bool isFunctionOrMethod(const Decl *D) { > return (D->getFunctionType() != nullptr) || isa<ObjCMethodDecl>(D); > } > +/// \brief Return true if the given decl has function type (function or > +/// function-typed variable) or an Objective-C method or a block. > +static bool isFunctionOrMethodOrBlock(const Decl *D) { > + return isFunctionOrMethod(D) || isa<BlockDecl>(D); > +} > > /// Return true if the given decl has a declarator that should have > /// been processed by Sema::GetTypeForDeclarator. > @@ -257,7 +262,7 @@ static bool checkFunctionOrMethodParamet > unsigned AttrArgNum, > const Expr *IdxExpr, > uint64_t &Idx) { > - assert(isFunctionOrMethod(D)); > + assert(isFunctionOrMethodOrBlock(D)); > > // In C++ the implicit 'this' function parameter also counts. > // Parameters are counted from one. > @@ -1601,7 +1606,7 @@ static void handleAnalyzerNoReturnAttr(S > > // The checking path for 'noreturn' and 'analyzer_noreturn' are different > // because 'analyzer_noreturn' does not impact the type. > - if (!isFunctionOrMethod(D) && !isa<BlockDecl>(D)) { > + if (!isFunctionOrMethodOrBlock(D)) { > ValueDecl *VD = dyn_cast<ValueDecl>(D); > if (!VD || (!VD->getType()->isBlockPointerType() && > !VD->getType()->isFunctionPointerType())) { > > Modified: cfe/trunk/test/SemaObjC/nonnull.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/nonnull.m?rev=234297&r1=234296&r2=234297&view=diff > ============================================================================== > --- cfe/trunk/test/SemaObjC/nonnull.m (original) > +++ cfe/trunk/test/SemaObjC/nonnull.m Tue Apr 7 01:01:53 2015 > @@ -123,3 +123,5 @@ void PR18795(int (^g)(const char *h, ... > void PR18795_helper() { > PR18795(0); // expected-warning{{null passed to a callee that requires a > non-null argument}} > } > + > +void (^PR23117)(int *) = ^(int *p1) __attribute__((nonnull(1))) {}; > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
