In the following code snippet:

namespace odd {

template<class T>
void f(T&);

}

namespace N {

struct A {};
int f(A&);

void g()
{
    A a;
    using odd::f;
    int assert = sizeof(f(a)); // <--- here
}

}

according to the standard 3.4.2/2 int N::f(A&) should be found. But gcc finds 
void odd::f(T&). If I put int f(A&) as a friend declaration inside A's 
definition, f(A&) is rightly found. 

Comeau online 4.3.3 BETA August 4, 2003 finds int f(A&) in either case.

I think this is an associated namespace search gcc bug.

Here are my details:

[EMAIL PROTECTED] exp]$ gcc -v -save-temps -Wall exp.cpp
Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --
infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-
checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-
exceptions --enable-java-awt=gtk --host=i386-redhat-linux
Thread model: posix
gcc version 3.4.3 20050227 (Red Hat 3.4.3-22.fc3)
 /usr/libexec/gcc/i386-redhat-linux/3.4.3/cc1plus -E -quiet -v -
D_GNU_SOURCE exp.cpp -Wall -o exp.ii
ignoring nonexistent directory "/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../..
/i386-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3
 /usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/i386-
redhat-linux
 /usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/backward
 /usr/local/include
 /usr/lib/gcc/i386-redhat-linux/3.4.3/include
 /usr/include
End of search list.
 /usr/libexec/gcc/i386-redhat-linux/3.4.3/cc1plus -fpreprocessed exp.ii -
quiet -dumpbase exp.cpp -auxbase exp -Wall -version -o exp.s
GNU C++ version 3.4.3 20050227 (Red Hat 3.4.3-22.fc3) (i386-redhat-
linux)
        compiled by GNU C version 3.4.3 20050227 (Red Hat 3.4.3-22.fc3).
GGC heuristics: --param ggc-min-expand=64 --param ggc-min-
heapsize=64423
exp.cpp: In function `void N::g()':
exp.cpp:17: error: invalid application of `sizeof' to a void type
exp.cpp:17: warning: unused variable 'assert'

Here is exp.ii:
# 1 "exp.cpp"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "exp.cpp"
namespace odd {

template<class T>
void f(T&);

}

namespace N {

struct A {};
int f(A&);

void g()
{
    A a;
    using odd::f;
    int assert = sizeof(f(a));
}

}

-- 
           Summary: Argument-dependent name lookup associated namespace
                    search bug
           Product: gcc
           Version: 3.4.3
            Status: UNCONFIRMED
          Severity: critical
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: maxim dot yegorushkin at gmail dot com
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21615

Reply via email to