Bug 7906 - Templated class with nested non-templated class having an operator() fails to compile
Summary: Templated class with nested non-templated class having an operator() fails to...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 3.2
: P3 normal
Target Milestone: 3.4.0
Assignee: Not yet assigned to anyone
URL:
Keywords: rejects-valid
Depends on:
Blocks:
 
Reported: 2002-09-13 00:46 UTC by Marcel Loose
Modified: 2005-11-08 21:52 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Marcel Loose 2002-09-13 00:46:00 UTC
The code in "How-To-Repeat" is legal, to the best of my knowledge. However, it fails to compile with the following error:

tTemplate.cc:19: no `Templated<T>::NonTemplated::operator std::vector<T, 
   std::allocator<_CharT> >::size_type() const' member function declared in 
   class `Templated<T>::NonTemplated'
tTemplate.cc:19: template definition of non-template `
   Templated<T>::NonTemplated::operator std::vector<T, std::allocator<_CharT> 
   >::size_type() const'

Release:
g++ (GCC) 3.2

Environment:
Linux master 2.4.19 #1 SMP Mon Aug 12 15:33:48 CEST 2002 i686 unknown

How-To-Repeat:
#include <vector>

template <class T>
class Templated
{
private:
  typedef std::vector<T> buf_t;
  class NonTemplated
  {
  public:
    operator typename buf_t::size_type() const;
  private:
    typename buf_t::size_type myIndex;
  };
};

template <class T>
Templated<T>::NonTemplated::operator typename Templated<T>::buf_t::size_type() const
{
  return myIndex;
}


int main()
{
  Templated<int> tmpl;
  return 0; 
}
Comment 1 Nathan Sidwell 2002-09-13 07:23:31 UTC
State-Changed-From-To: open->analyzed
State-Changed-Why: confirmed
Comment 2 Giovanni Bajo 2003-04-10 04:34:22 UTC
From: "Giovanni Bajo" <giovannibajo@libero.it>
To: <gcc-gnats@gcc.gnu.org>,
	<loose@astron.nl>,
	<gcc-bugs@gcc.gnu.org>,
	<nobody@gcc.gnu.org>,
	<gcc-prs@gcc.gnu.org>
Cc: "Wolfgang Bangerth" <bangerth@ices.utexas.edu>
Subject: Re: c++/7906: Templated class with nested non-templated class having an operator() fails to compile
Date: Thu, 10 Apr 2003 04:34:22 +0200

 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&p
 r=7906
 
 Reconfirmed on 2.95 -> 3.3 20030401. The code does look legit to me in fact.
 Can anybody test it with the mainline? It really looks like a parsing bug.
 
 Giovanni Bajo
 
Comment 3 Wolfgang Bangerth 2003-04-10 13:57:56 UTC
State-Changed-From-To: analyzed->closed
State-Changed-Why: Fixed in mainline (3.4)
Comment 4 GCC Commits 2003-07-22 10:54:26 UTC
Subject: Bug 7906

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	reichelt@gcc.gnu.org	2003-07-22 10:54:14

Modified files:
	gcc/testsuite  : ChangeLog 
Added files:
	gcc/testsuite/g++.dg/parse: typedef3.C operator2.C 
	                            def-tmpl-arg1.C funptr1.C ambig3.C 
	                            operator3.C template10.C 
	                            template11.C invalid-op1.C 
	                            condexpr1.C 

Log message:
	PR c++/3004
	* g++.dg/parse/typedef3.C: New test.
	
	PR c++/7906
	* g++.dg/parse/operator2.C: New test.
	
	PR c++/8895
	* g++.dg/parse/def-tmpl-arg1.C: New test.
	
	PR c++/9282
	* g++.dg/parse/funptr1.C: New test.
	
	PR c++/9452
	* g++.dg/parse/ambig3.C: New test.
	
	PR c++/9454
	* g++.dg/parse/operator3.C: New test.
	
	PR c++/9486
	* g++.dg/parse/template10.C: New test.
	
	PR c++/9488
	* g++.dg/parse/template11.C: New test.
	
	PR c++/10150
	* g++.dg/parse/invalid-op1.C: New test.
	
	PR c++/10247
	* g++.dg/parse/condexpr1.C: New test.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.2906&r2=1.2907
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/typedef3.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/operator2.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/funptr1.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/ambig3.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/operator3.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/template10.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/template11.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/invalid-op1.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/parse/condexpr1.C.diff?cvsroot=gcc&r1=NONE&r2=1.1