https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96498
Bug ID: 96498 Summary: Wrong location for function first declared as a friend in a template Product: gcc Version: 10.1.1 Status: UNCONFIRMED Keywords: diagnostic Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- struct S { friend void foo(void*); }; template<typename> struct T { friend void foo(void*); }; __attribute__((nonnull(1))) void foo(void*); void bar() { S s; foo(0); T<int> t; foo(0); } attr.C: In function 'void bar()': attr.C:15:8: warning: argument 1 null where non-null expected [-Wnonnull] 15 | foo(0); | ^ attr.C:10:34: note: in a call to function 'void foo(void*)' declared 'nonnull' 10 | __attribute__((nonnull(1))) void foo(void*); | ^~~ attr.C:17:8: warning: argument 1 null where non-null expected [-Wnonnull] 17 | foo(0); | ^ attr.C:7:15: note: in a call to function 'void foo(void*)' declared 'nonnull' 7 | friend void foo(void*); | ^~~ attr.C:14:5: warning: unused variable 's' [-Wunused-variable] 14 | S s; | ^ attr.C:16:10: warning: unused variable 't' [-Wunused-variable] 16 | T<int> t; | ^ The first note is fine, it shows the function declaration on line 10, where the attributes are declared. The friend declaration in struct S doesn't affect anything. The second note shows the location as line 7, which is the friend declaration inside the class template T. Why is the location not line 10 again? It seems that instantiating T injects the friend into the surrounding namespace in a different way to the friend declaration in a non-template.