r201162 - 'nonnull(1)' on a block parameter should apply to the block's argument.
Aaron Ballman
aaron at aaronballman.com
Tue Feb 11 09:36:15 PST 2014
One minor nit below. :-)
On Tue, Feb 11, 2014 at 12:27 PM, Jordan Rose <jordan_rose at apple.com> wrote:
> Author: jrose
> Date: Tue Feb 11 11:27:59 2014
> New Revision: 201162
>
> URL: http://llvm.org/viewvc/llvm-project?rev=201162&view=rev
> Log:
> 'nonnull(1)' on a block parameter should apply to the block's argument.
>
> Thanks to r199467, __attribute__((nonnull)) (without arguments) can apply
> directly to parameters, instead of being applied to the whole function.
> However, the old form of nonnull (with an argument index) could also apply
> to the arguments of function and block pointers, and both of these can be
> passed as parameters.
>
> Now, if 'nonnull' with an argument is found on a parameter, /and/ the
> parameter is a function or block pointer, it is handled the old way.
>
> PR18795
>
> Modified:
> cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> cfe/trunk/test/Sema/nonnull.c
> 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=201162&r1=201161&r2=201162&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Tue Feb 11 11:27:59 2014
> @@ -1170,23 +1170,6 @@ static bool attrNonNullArgCheck(Sema &S,
> return true;
> }
>
> -static void handleNonNullAttrParameter(Sema &S, ParmVarDecl *D,
> - const AttributeList &Attr) {
> - // Is the argument a pointer type?
> - if (!attrNonNullArgCheck(S, D->getType(), Attr, D->getSourceRange()))
> - return;
> -
> - if (Attr.getNumArgs() > 0) {
> - S.Diag(Attr.getLoc(), diag::warn_attribute_nonnull_parm_no_args)
> - << D->getSourceRange();
> - return;
> - }
> -
> - D->addAttr(::new (S.Context)
> - NonNullAttr(Attr.getRange(), S.Context, 0, 0,
> - Attr.getAttributeSpellingListIndex()));
> -}
> -
> static void handleNonNullAttr(Sema &S, Decl *D, const AttributeList &Attr) {
> SmallVector<unsigned, 8> NonNullArgs;
> for (unsigned i = 0; i < Attr.getNumArgs(); ++i) {
> @@ -1232,6 +1215,27 @@ static void handleNonNullAttr(Sema &S, D
> Attr.getAttributeSpellingListIndex()));
> }
>
> +static void handleNonNullAttrParameter(Sema &S, ParmVarDecl *D,
> + const AttributeList &Attr) {
> + if (Attr.getNumArgs() > 0) {
> + if (D->getFunctionType()) {
> + handleNonNullAttr(S, D, Attr);
> + } else {
> + S.Diag(Attr.getLoc(), diag::warn_attribute_nonnull_parm_no_args)
> + << D->getSourceRange();
> + }
Minor nit about the style -- shouldn't be using the curly braces here.
> + return;
> + }
> +
> + // Is the argument a pointer type?
> + if (!attrNonNullArgCheck(S, D->getType(), Attr, D->getSourceRange()))
> + return;
> +
> + D->addAttr(::new (S.Context)
> + NonNullAttr(Attr.getRange(), S.Context, 0, 0,
> + Attr.getAttributeSpellingListIndex()));
> +}
> +
> static void handleReturnsNonNullAttr(Sema &S, Decl *D,
> const AttributeList &Attr) {
> QualType ResultType = getFunctionOrMethodResultType(D);
>
> Modified: cfe/trunk/test/Sema/nonnull.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/nonnull.c?rev=201162&r1=201161&r2=201162&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/nonnull.c (original)
> +++ cfe/trunk/test/Sema/nonnull.c Tue Feb 11 11:27:59 2014
> @@ -45,3 +45,11 @@ void *test_bad_returns_null(void) {
> return 0; // expected-warning {{null returned from function that requires a non-null return value}}
> }
>
> +void PR18795(int (*g)(const char *h, ...) __attribute__((nonnull(1))) __attribute__((nonnull))) {
> + g(0); // expected-warning{{null passed to a callee which requires a non-null argument}}
> +}
> +void PR18795_helper() {
> + PR18795(0); // expected-warning{{null passed to a callee which requires a non-null argument}}
> +}
> +
> +
>
> Modified: cfe/trunk/test/SemaObjC/nonnull.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/nonnull.m?rev=201162&r1=201161&r2=201162&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaObjC/nonnull.m (original)
> +++ cfe/trunk/test/SemaObjC/nonnull.m Tue Feb 11 11:27:59 2014
> @@ -116,3 +116,10 @@ void test(TestNonNullParameters *f) {
> [f doNotPassNullOnMethod:0]; // expected-warning {{null passed to a callee which requires a non-null argument}}
> }
>
> +
> +void PR18795(int (^g)(const char *h, ...) __attribute__((nonnull(1))) __attribute__((nonnull))) {
> + g(0); // expected-warning{{null passed to a callee which requires a non-null argument}}
> +}
> +void PR18795_helper() {
> + PR18795(0); // expected-warning{{null passed to a callee which requires a non-null argument}}
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
~Aaron
More information about the cfe-commits
mailing list