This patch from Le-Chun Wu adds support to check whether a nonnull attribute is applied to 'this' pointer for non-static methods.
OK for trunk? Applied to google/main 2011-04-27 Le-Chun Wu <l...@google.com> Google ref 45339. * c-common.c (handle_nonnull_attribute): Check whether the nonnull attribute is applied to the 'this' pointer for non-static methods. testsuite/ChangeLog.google-main 2011-04-27 Le-Chun Wu <l...@google.com> * g++.dg/warn/nonnull2.C: New. diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index c6dc649..a1702f8 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -7434,7 +7434,7 @@ handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name), /* Argument list specified. Verify that each argument number references a pointer argument. */ - for (attr_arg_num = 1; args; args = TREE_CHAIN (args)) + for (attr_arg_num = 1; args; args = TREE_CHAIN (args), attr_arg_num++) { tree argument; unsigned HOST_WIDE_INT arg_num = 0, ck_num; @@ -7466,6 +7466,7 @@ handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name), return NULL_TREE; } + if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE) { error ("nonnull argument references non-pointer operand (argument %lu, operand %lu)", @@ -7473,6 +7474,11 @@ handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name), *no_add_attrs = true; return NULL_TREE; } + + if (TREE_CODE (type) == METHOD_TYPE && arg_num == 1) + warning (OPT_Wattributes, + "nonnull argument references 'this' pointer (argument %lu, operand %lu)", + (unsigned long) attr_arg_num, (unsigned long) arg_num); } } diff --git a/gcc/testsuite/g++.dg/warn/nonnull2.C b/gcc/testsuite/g++.dg/warn/nonnull2.C new file mode 100644 index 0000000..03006b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/nonnull2.C @@ -0,0 +1,14 @@ +// Test that "nonnull" attribute should not be applied to 'this' pointer. +// { dg-do compile } + +#define NULL 0 + +class Foo { + public: + void method1(const int *ptr) __attribute__((nonnull(1, 2))); // { dg-warning "nonnull argument references 'this' pointer" } + void method2(int *ptr1, int a, int *ptr2) __attribute__((nonnull(2, 3, 4))); // { dg-error "nonnull argument references non-pointer operand" } + static void func3(int *ptr) __attribute__((nonnull(1))); // should not warn + Foo(char *str) __attribute__((nonnull())) {} +}; + +int func4(int *ptr1, int a) __attribute__((nonnull(1))); // should not warn -- 1.7.3.1 -- This patch is available for review at http://codereview.appspot.com/4446070