OSDN Git Service

PR c++/157
authorlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 20 Sep 2003 15:59:38 +0000 (15:59 +0000)
committerlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 20 Sep 2003 15:59:38 +0000 (15:59 +0000)
* parser.c (cp_parser_direct_declarator): Clear
parser->num_template_parameter_lists when parsing function
parameters.
(cp_parser_constructor_declarator_p): Likewise.

* g++.dg/parse/crash12.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@71605 138bc75d-0d04-0410-961f-82ee72b054a4

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

index a18706b..b7d65fe 100644 (file)
@@ -1,3 +1,11 @@
+2003-09-20  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/157
+       * parser.c (cp_parser_direct_declarator): Clear
+       parser->num_template_parameter_lists when parsing function
+       parameters.
+       (cp_parser_constructor_declarator_p): Likewise.
+
 2003-09-19  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/495
index 73fc6c7..4114aea 100644 (file)
@@ -9720,6 +9720,7 @@ cp_parser_direct_declarator (cp_parser* parser,
          if (!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
            {
              tree params;
+             unsigned saved_num_template_parameter_lists;
              
              cp_parser_parse_tentatively (parser);
 
@@ -9733,9 +9734,18 @@ cp_parser_direct_declarator (cp_parser* parser,
                  parser->in_declarator_p = true;
                }
          
+             /* Inside the function parameter list, surrounding
+                template-parameter-lists do not apply.  */
+             saved_num_template_parameter_lists
+               = parser->num_template_parameter_lists;
+             parser->num_template_parameter_lists = 0;
+
              /* Parse the parameter-declaration-clause.  */
              params = cp_parser_parameter_declaration_clause (parser);
 
+             parser->num_template_parameter_lists
+               = saved_num_template_parameter_lists;
+
              /* If all went well, parse the cv-qualifier-seq and the
                 exception-specification.  */
              if (cp_parser_parse_definitely (parser))
@@ -13436,6 +13446,7 @@ cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
          && !cp_parser_storage_class_specifier_opt (parser))
        {
          tree type;
+         unsigned saved_num_template_parameter_lists;
 
          /* Names appearing in the type-specifier should be looked up
             in the scope of the class.  */
@@ -13456,6 +13467,13 @@ cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
                }
              push_scope (type);
            }
+
+         /* Inside the constructor parameter list, surrounding
+            template-parameter-lists do not apply.  */
+         saved_num_template_parameter_lists
+           = parser->num_template_parameter_lists;
+         parser->num_template_parameter_lists = 0;
+
          /* Look for the type-specifier.  */
          cp_parser_type_specifier (parser,
                                    CP_PARSER_FLAGS_NONE,
@@ -13463,6 +13481,10 @@ cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
                                    /*is_declarator=*/true,
                                    /*declares_class_or_enum=*/NULL,
                                    /*is_cv_qualifier=*/NULL);
+
+         parser->num_template_parameter_lists
+           = saved_num_template_parameter_lists;
+
          /* Leave the scope of the class.  */
          if (type)
            pop_scope (type);
index fbf56c0..9e37289 100644 (file)
@@ -1,3 +1,8 @@
+2003-09-20  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/157
+       * g++.dg/parse/crash12.C: New test.
+
 2003-09-19  Janis Johnson  <janis187@us.ibm.com>
 
        * gcc.dg/compat/mixed-struct-check.h: New.
diff --git a/gcc/testsuite/g++.dg/parse/crash12.C b/gcc/testsuite/g++.dg/parse/crash12.C
new file mode 100644 (file)
index 0000000..cf947b2
--- /dev/null
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+// Origin: Martin von Loewis <martin@v.loewis.de>
+
+// PR c++/157: Incorrect type/template decision in function parameter.
+
+template <class _Tp> class auto_ptr {};
+template <class _Tp>
+class counted_ptr
+{
+public:
+  counted_ptr(auto_ptr<_Tp>& __a);             // { dg-error "candidate" }
+  auto_ptr<_Tp> auto_ptr();
+};
+
+template <class _Tp>
+inline counted_ptr<_Tp>::counted_ptr(class auto_ptr& __a) // { dg-error "required" }
+{                                              // { dg-error "no type|not match|template" }
+}
+
+template <class _Tp>
+inline class auto_ptr<_Tp> counted_ptr<_Tp>::auto_ptr() 
+{
+}