Summary: | [3.3/3.4/4.0 Regressions] Function templates, overloads, and friend name injection | ||
---|---|---|---|
Product: | gcc | Reporter: | Yueh-Wei Hu (J©¨°¶) <ywhu> |
Component: | c++ | Assignee: | Mark Mitchell <mark> |
Status: | RESOLVED FIXED | ||
Severity: | critical | CC: | gcc-bugs, giovannibajo |
Priority: | P2 | Keywords: | wrong-code |
Version: | 3.3.3 | ||
Target Milestone: | 3.4.1 | ||
Host: | Target: | ||
Build: | Known to work: | 2.95.3 | |
Known to fail: | 3.0.4 3.2.3 3.3.3 3.4.0 4.0.0 | Last reconfirmed: | 2004-05-26 11:59:41 |
Description
Yueh-Wei Hu (J©¨°¶)
2004-05-24 08:18:05 UTC
OK, something is really screwed up here. Take this: ----------------- #include <iostream> #define PRINT std::cerr << __PRETTY_FUNCTION__ << std::endl template<int a, int b> class T; template<int a, int b> void func(T<a, b> * t) { PRINT; } template<int a> void func(T<a, 3> * t) { PRINT; } template<int a, int b> struct T { friend void func<a, b>(T<a, b> * t); friend void func<a> (T<a, 3> * t); void foo(); }; template<int a, int b> void T<a, b>::foo() { func((T<2,3>*)0); } int main() { func((T<2,3>*)0); T<2,3>().foo(); } ----------------------- Note that the call to func in main() is the same as the one in foo(), so it should really yield the same result. Alas, with gcc3.4, we get: g/x> /home/bangerth/bin/gcc-3.4-pre/bin/c++ x.cc ; ./a.out void func(T<a, 3>*) [with int a = 2] void func(T<a, b>*) [with int a = 2, int b = 3] On the other hand, if we revert the order of the two calls in main(), we get a different result, namely a call to the general T<a,b> template as in the second line above. My inclination is to say that this is due to the fact that we only instantiate T<2,3> in the second call in main(), since the cast to (T<2,3>*)0 does not require instantiation of the template. Now, how that can affect the result I don't know -- presumably it has something to do with injecting the friend functions into the global namespace. This explains why reverting the calls in main() changes the result. What evades me, however, is why injecting the names should make any difference? Note that if I remove the friend declarations altogether, then we get two calls to the <a,3> template, irrespective of the call order in main(). I tend to think that this is what we should get in all cases, but would like to have a second opinion... W. Confirmed as a regression. The reduced code in comment #1 by Wolfgang emits the following with GCC 2.95 (and EDG): void func<2>(T<2,3> *) void func<2>(T<2,3> *) which is the correct behaviour. 3.0 - 3.2 even rejects this code, while from 3.3 we have the wrong-code problem (the wrong specialization is chosen). Working on a fix. Subject: Bug 15629 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_4-branch Changes by: mmitchel@gcc.gnu.org 2004-05-31 21:04:15 Modified files: gcc/testsuite : ChangeLog gcc/cp : ChangeLog call.c cp-tree.h cvt.c name-lookup.c pt.c tree.c typeck.c gcc/testsuite/g++.dg/ext: packed3.C packed4.C gcc/testsuite/g++.dg/template: friend.C Added files: gcc/testsuite/g++.dg/expr: ptrmem5.C gcc/testsuite/g++.dg/ext: packed6.C gcc/testsuite/g++.dg/template: friend27.C friend28.C gcc/testsuite/g++.dg/warn: Wreturn-1.C Log message: PR c++/15742 * call.c (build_over_call): Set current_function_returns_abnormally even in template functions. PR c++/15696 * cp-tree.h (invalid_nonstatic_memfn_p): New function. * cvt.c (convert_to_void): Use it. * typeck.c (invalid_nonstatic_memfn_p): New function. (decay_conversion): Use it. PR c++/15625 * pt.c (tsubst_decl): Set DECL_FRIEND_CONTEXT for instantiated templates. PR c++/15629 * name-lookup.c (arg_assoc_class): Do not find template specializations. PR c++/15209 * tree.c (lvalue_p_1): Only consider the right-hand side of "." expressions when determining whether or not an express is packed. PR c++/15742 * g++.dg/warn/Wreturn-1.C: New test. PR c++/15696 * g++.dg/expr/ptrmem5.C: New test. PR c++/15625 * g++.dg/template/friend27.C: New test. PR c++/15629 * g++.dg/template/friend28.C: New test. * g++.dg/template/friend.C: Do not depend on <iostream>. Add error message. PR c++/15209 * g++.dg/ext/packed3.C: Remove bogus error. * g++.dg/ext/packed4.C: Remove bogus check. * g++.dg/ext/packed6.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3389.2.187&r2=1.3389.2.188 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3892.2.109&r2=1.3892.2.110 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/call.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.452.2.16&r2=1.452.2.17 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/cp-tree.h.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.946.4.12&r2=1.946.4.13 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/cvt.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.151.4.1&r2=1.151.4.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/name-lookup.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.34.2.13&r2=1.34.2.14 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.816.2.26&r2=1.816.2.27 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/tree.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.360.4.5&r2=1.360.4.6 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/typeck.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.519.2.18&r2=1.519.2.19 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/expr/ptrmem5.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/ext/packed6.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/ext/packed3.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.1&r2=1.1.24.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/ext/packed4.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.1&r2=1.1.24.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/friend27.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/friend28.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/friend.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.5&r2=1.5.56.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/warn/Wreturn-1.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.2.1 Subject: Bug 15629 CVSROOT: /cvs/gcc Module name: gcc Changes by: mmitchel@gcc.gnu.org 2004-05-31 21:24:31 Modified files: gcc/cp : call.c cp-tree.h cvt.c name-lookup.c pt.c tree.c typeck.c gcc/testsuite/g++.dg/ext: packed3.C packed4.C gcc/testsuite/g++.dg/template: friend.C Added files: gcc/testsuite/g++.dg/expr: ptrmem5.C gcc/testsuite/g++.dg/ext: packed6.C gcc/testsuite/g++.dg/template: friend27.C friend28.C gcc/testsuite/g++.dg/warn: Wreturn-1.C Log message: PR c++/15742 * call.c (build_over_call): Set current_function_returns_abnormally even in template functions. PR c++/15696 * cp-tree.h (invalid_nonstatic_memfn_p): New function. * cvt.c (convert_to_void): Use it. * typeck.c (invalid_nonstatic_memfn_p): New function. (decay_conversion): Use it. PR c++/15625 * pt.c (tsubst_decl): Set DECL_FRIEND_CONTEXT for instantiated templates. PR c++/15629 * name-lookup.c (arg_assoc_class): Do not find template specializations. PR c++/15209 * tree.c (lvalue_p_1): Only consider the right-hand side of "." expressions when determining whether or not an express is packed. PR c++/15742 * g++.dg/warn/Wreturn-1.C: New test. PR c++/15696 * g++.dg/expr/ptrmem5.C: New test. PR c++/15625 * g++.dg/template/friend27.C: New test. PR c++/15629 * g++.dg/template/friend28.C: New test. * g++.dg/template/friend.C: Do not depend on <iostream>. Add error message. PR c++/15209 * g++.dg/ext/packed3.C: Remove bogus error. * g++.dg/ext/packed4.C: Remove bogus check. * g++.dg/ext/packed6.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/call.c.diff?cvsroot=gcc&r1=1.476&r2=1.477 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/cp-tree.h.diff?cvsroot=gcc&r1=1.969&r2=1.970 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/cvt.c.diff?cvsroot=gcc&r1=1.156&r2=1.157 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/name-lookup.c.diff?cvsroot=gcc&r1=1.56&r2=1.57 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&r1=1.856&r2=1.857 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/tree.c.diff?cvsroot=gcc&r1=1.374&r2=1.375 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/typeck.c.diff?cvsroot=gcc&r1=1.547&r2=1.548 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/expr/ptrmem5.C.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/ext/packed6.C.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/ext/packed3.C.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/ext/packed4.C.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/friend27.C.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/friend28.C.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/friend.C.diff?cvsroot=gcc&r1=1.5&r2=1.6 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/warn/Wreturn-1.C.diff?cvsroot=gcc&r1=1.1&r2=1.2 Fixed in GCC 3.4.1. |