[Bug c++/52529] New: Compiler rejects template code inconsistently
scovich at gmail dot com
gcc-bugzilla@gcc.gnu.org
Thu Mar 8 07:55:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52529
Bug #: 52529
Summary: Compiler rejects template code inconsistently
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: scovich@gmail.com
The following code does or does not compile (with varying errors) under
4.7.0-RC20120302 and 4.6.2 depending on the choice of FIRST..FOURTH; all four
variants compile under 4.5.3.
I've narrowed down the test case as far as I could, but I don't really
understand what's going wrong. Does the code break some subtle lookup rule
which gcc recently became more strict about? There seem to be two issues,
because either A<M> or foo() is enough to trigger an error; only A<1>::foo<T>
compiles.
=== bug.cpp ===
template <long N> struct A {
template <typename T> long foo(typename T::X *x);
};
template <typename T> struct B {
typedef typename T::X X;
enum { M=1 };
static void bar(X *x);
};
struct C { struct X; };
int main() { B<C>::bar(0); }
template <typename T> void B<T>::bar(X *x) {
#if defined(FIRST)
A<M>().foo(x);
#elif defined(SECOND)
A<M>().foo<T>(x);
#elif defined(THIRD)
A<1>().foo(x);
#elif defined(FOURTH)
A<1>().foo<T>(x);
#endif
}
=== end bug.cpp ===
Sample error message from 4.7.0, since it has the clearest error messages
(4.6.2 gets confused by earlier errors when attempting to suggest a candidate):
**** FIRST ****
bug.cpp: In instantiation of ‘static void B<T>::bar(B<T>::X*) [with T = C;
B<T>::X = C::X]’:
bug.cpp:12:20: required from here
bug.cpp:16:5: error: no matching function for call to ‘A<1l>::foo(B<C>::X*&)’
bug.cpp:16:5: note: candidate is:
bug.cpp:2:32: note: template<class T> long int A::foo(typename T::X*) [with T =
T; long int N = 1l]
bug.cpp:2:32: note: template argument deduction/substitution failed:
bug.cpp:16:5: note: couldn't deduce template parameter ‘T’
**** SECOND ****
bug.cpp: In static member function ‘static void B<T>::bar(B<T>::X*)’:
bug.cpp:18:17: error: expected primary-expression before ‘>’ token
**** THIRD ****
bug.cpp: In instantiation of ‘static void B<T>::bar(B<T>::X*) [with T = C;
B<T>::X = C::X]’:
bug.cpp:12:20: required from here
bug.cpp:20:5: error: no matching function for call to ‘A<1l>::foo(B<C>::X*&)’
bug.cpp:20:5: note: candidate is:
bug.cpp:2:32: note: template<class T> long int A::foo(typename T::X*) [with T =
T; long int N = 1l]
bug.cpp:2:32: note: template argument deduction/substitution failed:
bug.cpp:20:5: note: couldn't deduce template parameter ‘T’
**** FOURTH ****
[successful compilation]
More information about the Gcc-bugs
mailing list