Hello,

Consider the following test case:

struct A { bool g(int*, int*) __attribute__((nonnull (2))); };
bool A::g(int* a, int* b) {
  if (a)
    return 0;
  return this;
}


G++ produces the following code for this snippet:

;; Function bool A::g(int*, int*) (_ZN1A1gEPiS0_)

bool A::g(int*, int*) (this, a, b)
{
<bb 2>:
  return 0;

}


Notice how we have applied the __attribute__((nonnull (2))) to
the "a" argument, instead of "b", because G++ has added "this"
as an extra, artificial argument.  To the middle end, argument 2
of "g" is "a", not "b".

The documentation of the nonnull attribute says:

`nonnull (ARG-INDEX, ...)'
     The `nonnull' attribute specifies that some function parameters
     should be non-null pointers.  For instance, the declaration:

          extern void *
          my_memcpy (void *dest, const void *src, size_t len)
                __attribute__((nonnull (1, 2)));

     causes the compiler to check that, in calls to `my_memcpy',
     arguments DEST and SRC are non-null. 


So do we expect our users to know that they should add 1 to every
ARG-INDEX they pass?  That would make this a documentation bug.  Or
is this a "real" bug in G++, and should the compiler correct the
ARG-INDEX numbers so that the middle-end doesn't get confused?

Gr.
Steven

Reply via email to