----------------------------
gcc/g++ versions (2):

1)
Reading specs from /usr/lib/gcc-lib/i586-suse-linux/3.3.3/specs
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-
prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --enable-
languages=c,c++,f77,objc,java,ada --disable-checking --libdir=/usr/lib --enable-
libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-
system-zlib --enable-shared --enable-__cxa_atexit i586-suse-linux
Thread model: posix
gcc version 3.3.3 (SuSE Linux)

2)
Reading specs from /usr/libexec/gcc/darwin/ppc/3.3/specs
Thread model: posix
gcc version 3.3 20030304 (Apple Computer, Inc. build 1640)
(no more information available from g++ -v on this platform)

-----------------------------------------------
command line:

g++ --save-temps main.cc -o main

------------------------------------------------
compiler output (both versions):

In file included from main.cc:5:
parse-bug.tcc: In member function `ptr<S> foo::func1() const':
parse-bug.tcc:30: error: syntax error before `>' token

------------------------------------------------
remarks:

Apologies if this bug has already been reported, 
but I couldn't find it in Bugzilla after 20 minutes of
queries.  I've initially flagged this with normal severity, 
but it may actually be worse because I cannot find a workaround.  

g++-3.4.0 accepts the input below and behaves correctly
in the context of more complicated code.
The input given below is a reduced version that 
exhibits the problem.  

I've tried a few workarounds such as removing the 
explicit template argument, but neither g++3.3.3 nor
3.4.0 accept it, b/c no matching function is found. 

I hope a solution is under way.

regards, 
David

------------------------------------------------
the preprocessed input file follows:
------------- begin "main.ii" ------------------
# 1 "main.cc"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "main.cc"




# 1 "parse-bug.tcc" 1







# 1 "parse-bug.h" 1
# 12 "parse-bug.h"
template <class T>
class ptr {
private:
        T* p;
public:
        ptr(T* t) : p(t) { }
        ~ptr() { }

        template <class S>
        ptr<S>
        is_a_xfer(void) const;

};

class foo {
protected:
        ptr<foo> k;
public:
        foo() : k(0) { }

        template <class T>
        ptr<T> func1(void) const;







};
# 9 "parse-bug.tcc" 2



template <class T>
template <class S>
ptr<S>
ptr<T>::is_a_xfer(void) const {
        return ptr<S>(dynamic_cast<S*>(p));
}

template <class T>
ptr<T>
foo::func1(void) const {
# 30 "parse-bug.tcc"
        return k.is_a_xfer<T>();







}
# 6 "main.cc" 2

int
main (int argc, char* argv[]) {
        const foo bar;
        ptr<foo> ip = bar.func1<foo>();

        return 0;
}

-- 
           Summary: parse error on template method of template class
           Product: gcc
           Version: 3.3.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: fang at csl dot cornell dot edu
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: *
  GCC host triplet: *
GCC target triplet: *


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

Reply via email to