This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/81762] New: errors defining attribute target overloads of the same function template
- From: "msebor at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 07 Aug 2017 22:36:56 +0000
- Subject: [Bug c++/81762] New: errors defining attribute target overloads of the same function template
- Auto-submitted: auto-generated
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) { }
^~~