[LLVMbugs] [Bug 24134] New: Clang ignores nonnull attributes on declarations following definitions when compiling as C++; behavior differs from gcc and EDG

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Wed Jul 15 10:35:29 PDT 2015


https://llvm.org/bugs/show_bug.cgi?id=24134

            Bug ID: 24134
           Summary: Clang ignores nonnull attributes on declarations
                    following definitions when compiling as C++; behavior
                    differs from gcc and EDG
           Product: clang
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: -New Bugs
          Assignee: unassignedclangbugs at nondot.org
          Reporter: thonermann at coverity.com
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Clang (3.4-3.6,trunk) ignores nonnull attributes on declarations following
definitions when compiling as C++, but not as C.  I presume the difference has
to do with tentative definitions in C.

A test case is below.  Recent versions of gcc and EDG both allow nonnull
attributes on declarations following a definition, at least for this test case,
so this behavior appears to be inconsistent with other common compilers.

$ cat t.c
void (*pf)(int *p1);
extern void (*pf)(int *p1)
    __attribute__((nonnull));
void f() {
    pf(0);
}


# Compiling as C, no warning is emitted, the nonnull attribute
# is present in the resulting AST:
$ clang -c -Xclang -ast-dump t.c
t.c:5:9: warning: null passed to a callee that requires a non-null argument
[-Wnonnull]
    pf(0);
       ~^
...
`-VarDecl 0x822dda0 prev 0x822dc50 <line:2:1, col:26> col:15 pf 'void (*)(int
*)' extern
  `-NonNullAttr 0x822de00 <line:3:20>
...


# Compiling as C++, a warning is emitted and the nonnull attribute
# is not present in the resulting AST:
$ clang -c -Xclang -ast-dump -x c++ t.c
t.c:3:20: warning: attribute declaration must precede definition
[-Wignored-attributes]
    __attribute__((nonnull));
                   ^
t.c:1:8: note: previous definition is here
void (*pf)(int *p1);
       ^
...
`-VarDecl 0x82e41e0 prev 0x82e4090 <line:2:1, col:26> col:15 pf 'void (*)(int
*)' extern
...
1 warning generated.


# gcc (4.6.3) emits a warning when invoking *pf with a null argument regardless
of whether the code is compiled as C or C++:
$ gcc -Wall -c t.c
t.c: In function 'f':
t.c:5:5: warning: null argument where non-null required (argument 1)
[-Wnonnull]
$ gcc -Wall -c -x c++ t.c
t.c: In function 'void f()':
t.c:5:9: warning: null argument where non-null required (argument 1)
[-Wnonnull]

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20150715/35529b7f/attachment.html>


More information about the llvm-bugs mailing list