This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/24386] New: 4.1: wrong virtual function called in template member
- From: "gcc-bugzilla at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 15 Oct 2005 17:43:38 -0000
- Subject: [Bug c++/24386] New: 4.1: wrong virtual function called in template member
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
The cvs head of g++ 4.1 miscompiles the following program:
--------------------------------------------------------
extern "C" int printf(...);
struct A
{
virtual void foo () { printf ("A::foo\n"); }
};
struct B : public A
{
virtual void foo () { printf ("B::foo\n"); }
};
template <class T>
void f(T a)
{
((A*)a)->A::foo();
}
int main()
{
f(new B);
return 0;
}
--------------------------------------------------------
I expect this program to print `A::foo'. But instead, it prints:
$ g++ -o x x.cc
$ ./x
B::foo
$
This worked correctly as of the cvs version from a couple weeks ago.
It also works correctly if f() is made into a non-template function.
Here is the dump of f() from the 02.original tree dump, just to verify
that the problem is upstream of here:
;; Function void f(T) [with T = B*] (_Z1fIP1BEvT_)
;; enabled by -tree-original
<<cleanup_point <<< Unknown tree: expr_stmt
OBJ_TYPE_REF(*NON_LVALUE_EXPR <(&a->D.1746)->_vptr.A>;&a->D.1746->0)
(&a->D.1746) >>>
>>;
It's doing a virtual function call, rather than calling A::foo directly.
The problem seems to have been introduced by this change:
2005-10-12 Nathan Sidwell <nathan@codesourcery.com>
PR c++/21592
* pt.c (build_non_dependent_expr): Don't wrap a COMPONENT_REF
with already looked up member functions. Assert we're not
returning a NON_DEPENDENT_EXPR with unknown type.
* typeck.c (finish_class_member_access_expr): We can get
non-template-id-expr baselinks. If the lookup finds a baselink,
remember it even inside templates.
If i revert this change, then the test case is compiled correctly.
Environment:
System: Linux karma 2.6.12.1sss #2 Thu Jul 7 00:28:21 EDT 2005 i686 i686 i386
GNU/Linux
Architecture: i686
<machine, os, target, libraries (multiple lines)>
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with: /home/sss/gcc/gcc/configure --prefix=/usr/local/gcc
--enable-threads=posix --enable-long-long --enable-languages=c,c++,f95
How-To-Repeat:
See above.
--
Summary: 4.1: wrong virtual function called in template member
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: snyder at fnal dot gov
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24386