c++/10146: [3.4 regression] [new parser] template function lookup failure(s)
rguenth@tat.physik.uni-tuebingen.de
rguenth@tat.physik.uni-tuebingen.de
Wed Mar 19 12:18:00 GMT 2003
>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:
More information about the Gcc-bugs
mailing list