This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/42840] New: const-ref argument in a variadic template arglist is mishandled
- From: "navin dot kumar at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 22 Jan 2010 03:30:00 -0000
- Subject: [Bug c++/42840] New: const-ref argument in a variadic template arglist is mishandled
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
When a static-const primitive is passed as a const-ref argument to function
with a variadic template arglist, GCC generates code that references the
static-const primitive, and optimizes away the static-const primitive,
resulting in a "undefined reference" linker error.
/* Start of Example */
class Foo {
public:
template <typename... T>
static void foo(const T&... blah) { }
};
class Test {
public:
static const int tmp = 1;
};
int main(int argc, char** argv) {
Foo::foo(Test::tmp); // THIS COMPILES BUT LINKER FAILS
//Foo::foo(static_cast<int>(Test::tmp)); // THIS COMPILES AND LINKS FINE
}
/* END OF EXAMPLE */
LINKER ERROR:
/tmp/ccfV1opu.o: In function `main':
tmp.cc:(.text+0x10): undefined reference to `Test::tmp'
collect2: ld returned 1 exit status
Since static cast of the static-const int primitive to an int fixes the
problem, it's clear that GCC is somehow mishandling how it optimizes away
Test::tmp even though it's being used as a const int& in Foo::foo(...)
--
Summary: const-ref argument in a variadic template arglist is
mishandled
Product: gcc
Version: 4.3.4
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: navin dot kumar at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42840