https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89309

            Bug ID: 89309
           Summary: bogus -Wattributes ‘copy’ attribute ignored on a
                    declaration of a different kind than referenced symbol
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

The copy attribute newly introduced in GCC 9 (see pr81824) doesn't handle C++
templates entirely correctly.  The test case below shows that it successfully
copies the noreturn attribute from f<T> to g<T> but in the process it also
issues a spurious warning.

$ cat z.C && gcc -S -Wall z.C
template <class T> __attribute__ ((noreturn)) T f ();

template <class T>
__attribute__ ((copy (f<T>))) T g ()  // bogus -Wattributes
{
  f<T>();
}   // no -Wreturn-type (good)

template int g<int>();
z.C: In substitution of ‘template<class T> T g() [with T = int]’:
z.C:9:21:   required from here
z.C:4:33: warning: ‘copy’ attribute ignored on a declaration of a different
kind than referenced symbol [-Wattributes]
    4 | __attribute__ ((copy (f<T>))) T g ()  // bogus -Wattributes
      |                                 ^

Reply via email to