re PR c++/28999 (ICE on invalid use of typename)
authorMark Mitchell <mark@codesourcery.com>
Thu, 11 Jan 2007 03:24:33 +0000 (03:24 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 11 Jan 2007 03:24:33 +0000 (03:24 +0000)
PR c++/28999
* decl.c (make_typename_type): If the qualified name is not a
type, issue an error.
* parser.c (cp_parser_elaborated_type_specifier): Fix comment
formatting.

From-SVN: r120663

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/typename11.C [new file with mode: 0644]

index f97f7d981e694898aa2e714933231e0f68231516..74af04ca5c5828dab5147cf9800d7f50ad29ed9d 100644 (file)
@@ -1,3 +1,11 @@
+2007-01-10  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/28999
+       * decl.c (make_typename_type): If the qualified name is not a
+       type, issue an error.
+       * parser.c (cp_parser_elaborated_type_specifier): Fix comment
+       formatting.
+
 2007-01-08  Geoffrey Keating  <geoffk@apple.com>
 
        * rtti.c: Include target.h.
index 1ed8afc7708ac7ac25c17aac49665d28d0c6283f..a100c9dc9ce3a6eb12fbe4e739ea744a46c67490 100644 (file)
@@ -2820,6 +2820,11 @@ make_typename_type (tree context, tree name, enum tag_types tag_type,
       name = TREE_OPERAND (name, 0);
       if (TREE_CODE (name) == TEMPLATE_DECL)
        name = TREE_OPERAND (fullname, 0) = DECL_NAME (name);
+      else if (TREE_CODE (name) == OVERLOAD)
+       {
+         error ("%qD is not a type", name);
+         return error_mark_node;
+       }
     }
   if (TREE_CODE (name) == TEMPLATE_DECL)
     {
index 82cb796985890e47f42ee3c6c6e3f23a0ce56148..8183913f47c3ff86b17058ccd526ac44a432c7f1 100644 (file)
@@ -6093,6 +6093,7 @@ cp_parser_constant_expression (cp_parser* parser,
   parser->integral_constant_expression_p = true;
   parser->allow_non_integral_constant_expression_p = allow_non_constant_p;
   parser->non_integral_constant_expression_p = false;
+  integral_constant_expr_p = true;
   /* Although the grammar says "conditional-expression", we parse an
      "assignment-expression", which also permits "throw-expression"
      and the use of assignment operators.  In the case that
@@ -6104,6 +6105,7 @@ cp_parser_constant_expression (cp_parser* parser,
      constant.  */
   expression = cp_parser_assignment_expression (parser, /*cast_p=*/false);
   /* Restore the old settings.  */
+  integral_constant_expr_p = false;
   parser->integral_constant_expression_p
     = saved_integral_constant_expression_p;
   parser->allow_non_integral_constant_expression_p
@@ -10311,8 +10313,8 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
                                         /*check_dependency_p=*/true,
                                         /*type_p=*/true,
                                         is_declaration);
-  /* For everything but enumeration types, consider a template-id.  */
-  /* For an enumeration type, consider only a plain identifier.  */
+  /* For everything but enumeration types, consider a template-id.
+     For an enumeration type, consider only a plain identifier.  */
   if (tag_type != enum_type)
     {
       bool template_p = false;
index 04dd13a8389fa9d757dee14b57af8a2434fb6fea..9f52d1015e216273f5b5ca3c0ca33f21288a7960 100644 (file)
@@ -1,3 +1,8 @@
+2007-01-10  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/28999
+       * g++.dg/template/typename11.C: New test.
+
 2007-01-10  Robert Kennedy <jimbob@google.com>
 
        * gcc.dg/fold-compare-2.c: New test case for fold_comparison.
diff --git a/gcc/testsuite/g++.dg/template/typename11.C b/gcc/testsuite/g++.dg/template/typename11.C
new file mode 100644 (file)
index 0000000..fb77610
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/28999
+
+namespace N
+{
+  template<int> void foo();
+}
+
+template<int> struct A
+{
+  friend void typename N::foo<0>(); // { dg-error "type|expected" }
+};