On 09/07/2012 05:07 PM, Paolo Carlini wrote:
the regression of template/crash83.C because of excess errors. The latter happens 
because we have code in cp_parser_class_head which tries to improve error recovery 
for cases of missing 'template <>' in explicit specializations, and, for that 
rather broken testcase, it confuses the code I'm tentatively adding, resulting in the 
additional error message below:

crash83.C:5:27: error: an explicit specialization must be preceded by ‘template 
<>’
 template<typename = class A<0>: > struct B {}; // { dg-error "explicit 
specialization|expected" }
                           ^
crash83.C:5:27: error: too many template-parameter-lists for A<0> (should be 1)

So we're adding a second irrelevant diagnostic to go with the first one. The error in this testcase is a simple stray ':' causing a syntax error, it has nothing to do with explicit specialization. It would be nice to improve this, but given that we're already not giving the right error, adding a second wrong error doesn't seem like a big problem.

More importantly, I'm having troubles removing the early
cp_parser_check_template_parameters check in cp_parser_class_head: one
issue is that it also checks for too few template-parameter-lists not
just too many, and thus catches rather broken testcases like, eg,
template/error7.C or template/class2.C:

template <class T>
struct A {
   struct B;
   struct A::B { }; // { dg-error "" }
};

This testcase is indeed ill-formed, but its ill-formedness has nothing to do with too few template-parameter-lists. The problem is that clause 9 says

If a class-head-name contains a nested-name-specifier, the class-specifier shall refer to a class that was previously declared directly in the class or namespace to which the nested-name-specifier refers, ... and the class-specifier shall appear in a namespace enclosing the previous declaration.

The definition of A::B does not appear at namespace scope, so it is ill-formed. Removing the incorrect error is an improvement, but then we need to add the correct error rather than accept the testcase.

but there are definitely more problems with just checking
template_header_count < wanted too in
maybe_process_partial_specialization and removing the early check, I'm
seeing many, many fails if I just try to extend "p4" like that...

Like what?

Jason

Reply via email to