r234297 - [Sema] Don't crash when __attribute__((nonnull)) is applied to blocks

Aaron Ballman aaron at aaronballman.com
Tue Apr 7 04:55:13 PDT 2015


On Tue, Apr 7, 2015 at 2:01 AM, David Majnemer <david.majnemer at gmail.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list