This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/53573] template type dependent name resolution broken
- From: "keean at fry-it dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 05 Jun 2012 11:14:00 +0000
- Subject: [Bug c++/53573] template type dependent name resolution broken
- Auto-submitted: auto-generated
- References: <bug-53573-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53573
--- Comment #12 from Keean Schupke <keean@fry-it.com> 2012-06-05 11:14:00 UTC ---
(In reply to comment #10)
although -fpermissive allows the code to compile (in some circumstances) it
does not in all, and it also produces incorrect output, for example:
#include <iostream>
char g(char x) {
return x - 1;
}
template <typename T> T f(T t) {
return g(t);
}
double g(double x) {
return x;
}
main() {
double x(f(1.0L));
std::cout << x << "\n";
}
will output "0" instead of "1" choosing the wrong overloaded function. In the
case below:
#include <iostream>
char g(char x) {
return x - 1;
}
int g(int x) {
return x + 1;
}
template <typename T> T f(T t) {
return g(t);
}
double g(double x) {
return x;
}
main() {
double x(f(1.0L));
std::cout << x << "\n";
}
compilation still fails with:
test.cpp: In instantiation of âT f(T) [with T = long double]â:
test.cpp:20:17: required from here
test.cpp:12:12: error: call of overloaded âg(long double&)â is ambiguous
test.cpp:12:12: note: candidates are:
test.cpp:3:6: note: char g(char)
test.cpp:7:5: note: int g(int)
even with -fpermissive
> (In reply to comment #6)
> > The suggested work around in the error message 'adding -fpermissive' to
> > gcc-4.7.0 does not fix the problem as suggested by the error message.
>
> As Manu says, -fpermissive changes the error to a warning, allowing the code to
> compile. Please check it again.
>
> I'm going to close this, as I think G++ handles comment 1 correctly and both
> EDG and Clang agree.
>
> I didn't check all your other examples in detail but I don't think they show
> anything different: ADL doesn't find anything for built-in types such as int or
> char.