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

--- Comment #20 from Manuel López-Ibáñez <manu at gcc dot gnu.org> ---
(In reply to Wolfgang Bangerth from comment #11)
> Here's another very nice example from PR 20313: 
> ------------------------- 
> template<int j> struct s; 
> template<int i> s<i>::s(int j) {} 
> ------------------------- 
> Note that the definition of the constructor is invalid because the struct 
> isn't complete. Here's what we get: 
> g/x> /home/bangerth/bin/gcc-4.0-pre/bin/c++ -c x.cc 
> x.cc:2: error: invalid use of undefined type ?struct s<j>? 
> x.cc:1: error: declaration of ?struct s<j>? 
> x.cc:2: error: template definition of non-template ?s<j>::s(int)? 
>  
> Note how the compiler uses the template argument 'j', although we use 
> template argument 'i' in line 2! 

I have been doing a bit more analysis and it is not very clear what would be
the correct output in this example. For the slightly different testcase:


template<int x> struct s; 
template<int i> s<i>::s(int j) {} 

GCC 4.9 prints:


/home/manuel/test1/pr99.cc:2:30: error: invalid use of incomplete type ‘struct
s<x>’
 template<int i> s<i>::s(int j) {}
                              ^
/home/manuel/test1/pr99.cc:1:24: error: declaration of ‘struct s<x>’
 template<int x> struct s;
                        ^

If we do this change:

Index: pt.c
===================================================================
--- pt.c        (revision 209347)
+++ pt.c        (working copy)
@@ -7574,10 +7574,11 @@ lookup_template_class_1 (tree d1, tree a
         class, however, such a reference is an instantiation.  */
       if ((entering_scope
           || !PRIMARY_TEMPLATE_P (gen_tmpl)
           || currently_open_class (template_type))
          /* comp_template_args is expensive, check it last.  */
+          && false
          && comp_template_args (TYPE_TI_ARGS (template_type),
                                 arglist))
        return template_type;

       /* If we already have this specialization, return it.  */



then it prints:

/home/manuel/test1/pr99.cc:2:30: error: invalid use of incomplete type ‘struct
s<i>’
 template<int i> s<i>::s(int j) {}
                              ^
/home/manuel/test1/pr99.cc:1:24: error: declaration of ‘struct s<i>’
 template<int x> struct s;
                        ^

I am not sure one output is better than the other.

Reply via email to