Hello,

All versions of gcc I tried (2.95.3, 3.3.6, 3.4.4, 4.0-20050811, and
4.1-20050813) accept this code without any warnings or errors (using -ansi
-pedantic -Wall -W, just in case)

template<typename T>
class A {
        struct helper { typedef T type; };
        friend class helper::type;
};
class B { A<B> m; } b;
int main() {}

I don't believe this code is valid. icc 9.0.021 rejects this code with

error: typedef "type" may not be used in an elaborated type specifier

and gcc 4.0-20050811 rejects it when I try the same thing with A<T>::type,
rather than A<T>::helper::type, with

error: using template type parameter ‘T’ after ‘class’

Additionally, any attempts at using "class A<B>::helper::type" outside of the
template definition result in

error: using typedef-name ‘A<B>::helper::type’ after ‘class’

So I think my code should result in either of the above two errors as well.

I can't find any other reports of this, but sorry if I missed anything.

-- 
           Summary: gcc accepts "class typedefname" when typedefname is
                    defined in a nested class and references a template
                    parameter
           Product: gcc
           Version: 4.0.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: fn_x at hotmail dot com
                CC: gcc-bugs at gcc dot gnu dot org
 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=23385

Reply via email to