This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
c++/10146: [3.4 regression] [new parser] template function lookup failure(s)
- From: rguenth at tat dot physik dot uni-tuebingen dot de
- To: gcc-gnats at gcc dot gnu dot org
- Date: 19 Mar 2003 08:53:09 -0000
- Subject: c++/10146: [3.4 regression] [new parser] template function lookup failure(s)
- Reply-to: rguenth at tat dot physik dot uni-tuebingen dot de
>Number: 10146
>Category: c++
>Synopsis: [3.4 regression] [new parser] template function lookup failure(s)
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: unassigned
>State: open
>Class: rejects-legal
>Submitter-Id: net
>Arrival-Date: Wed Mar 19 08:56:00 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator: Richard Guenther
>Release: g++-3.4 (GCC) 3.4 20030313 (experimental)
>Organization:
>Environment:
>Description:
In the following testcase the marked lines fail/work even if they should/should not (the former being the problem for me). One should carefuly check the standard if any of the working one should be rejected.
The error message from compiling the testcase is
bellatrix:~/src/tests$ g++-3.4 -c temp.cpp
temp.cpp: In member function `void Bar<T>::operator()(const U&) [with U = int,
T = char]':
temp.cpp:32: instantiated from here
temp.cpp:14: error: no matching function for call to `Foo<int>::foo(const int&)
'
temp.cpp:15: error: no matching function for call to `Foo<int>::foo(const int&)
'
temp.cpp:16: error: no matching function for call to `Foo<int>::foo(const int&)
'
temp.cpp:32: instantiated from here
temp.cpp:18: error: no matching function for call to `Foo<int>::bar(const int&)
'
temp.cpp:19: error: no matching function for call to `Foo<int>::bar(const int&)
'
Testcase:
template <class T>
struct Foo {
template <class U>
static void foo(const U&);
template <class U>
void bar(const U&);
};
template <class T>
struct Bar {
template <class U>
void operator()(const U&u)
{
Foo<int>().foo<U>(u); // does not work (ok)
Foo<int>::foo<U>(u); // does not work (ok)
Foo<int>().template foo<U>(u); // does not work
Foo<int>::template foo<U>(u); // does work
Foo<int>().bar<U>(u); // does not work (ok)
Foo<int>().template bar<U>(u); // does not work
Foo<int>().foo(u); // does work ??
Foo<int>::foo(u); // does work ??
Foo<int>().template foo(u); // does work
Foo<int>::template foo(u); // does work
Foo<int>().bar(u); // does work ??
Foo<int>().template bar(u); // does work
}
};
void foo()
{
int i;
Bar<char>()(i);
}
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted: