This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/81762] New: errors defining attribute target overloads of the same function template


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

            Bug ID: 81762
           Summary: errors defining attribute target overloads of the same
                    function template
           Product: gcc
           Version: 8.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: ---

G++ accepts definitions of distinct overloads of the same function that differ
only in their target attribute specifier but rejects definitions of equivalent
"overloads" of function templates, or "overloads" of the same explicit
specializations of a function template.

In the test case below, I expect all the definitions to be accepted as distinct
but the template ones are rejected with errors that suggest an incomplete
integration of the attribute target feature into the C++ front end.


$ cat a.c && gcc -Wall -Wextra -xc++ a.c && ./a.out 
#define A "arch=corei7"

void __attribute__ ((target ("default")))
foo (int) { }

void __attribute__ ((target (A)))
foo (int) { /* okay, different foo */ }


template <class T>
void bar (T);

template <>
void __attribute__ ((target ("default")))
bar<int>(int) { }

template <>
void __attribute__ ((target (A)))
bar<int>(int) { /* rejected (bug?) */ }


template <class T>
void __attribute__ ((target ("default")))
baz (T) { }

template <class T>
void __attribute__ ((target (A)))
baz (T) { /* rejected (bug?) */ }
a.c:19:1: error: redefinition of ‘void bar(T) [with T = int]’
 bar<int>(int) { /* rejected (bug?) */ }
 ^~~~~~~~
a.c:15:1: note: ‘void bar(T) [with T = int]’ previously declared here
 bar<int>(int) { }
 ^~~~~~~~
a.c:28:1: error: ambiguating new declaration ‘template<class T> void baz(T)’
 baz (T) { /* rejected (bug?) */ }
 ^~~
a.c:24:1: note: old declaration ‘template<class T> void baz(T)’
 baz (T) { }
 ^~~

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]