]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/16829 (default parameter can be not one of the last in function)
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>
Tue, 24 Jan 2006 11:38:06 +0000 (11:38 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Tue, 24 Jan 2006 11:38:06 +0000 (11:38 +0000)
PR c++/16829
* decl.c (start_preparsed_function): Check default arguments
unconditionally.
* name-lookup.c (pushdecl_maybe_friend): Check default arguments
of all functions and function templates.
* parser.c (cp_parser_late_parsing_default_args): Check default
arguments.
* decl2.c (check_default_args): Set missing default arguments to
error_mark_node.

* g++.dg/other/default2.C: New test.
* g++.dg/other/default3.C: New test.

From-SVN: r110167

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/name-lookup.c
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/default2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/default3.C [new file with mode: 0644]

index 2d5c6b106fd2eb6b2025f551590f8d2f8ed0a5dc..9c032d50aa46830190d5de3f9439ed17d3dfd76c 100644 (file)
@@ -1,3 +1,15 @@
+2006-01-24  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/16829
+       * decl.c (start_preparsed_function): Check default arguments
+       unconditionally.
+       * name-lookup.c (pushdecl_maybe_friend): Check default arguments
+       of all functions and function templates.
+       * parser.c (cp_parser_late_parsing_default_args): Check default
+       arguments.
+       * decl2.c (check_default_args): Set missing default arguments to
+       error_mark_node.
+
 2006-01-19  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        PR c++/25854
index 5adb3a8d3f0c11bbc03a94eae3ae94249e871dff..74a386d941db38fb3f7cfbf90826df836679e680 100644 (file)
@@ -10330,6 +10330,8 @@ start_function (tree declspecs, tree declarator, tree attrs, int flags)
      must be complete when you define the function.  */
   if (! processing_template_decl)
     check_function_type (decl1, current_function_parms);
+  /* Make sure no default arg is missing.  */
+  check_default_args (decl1);
 
   /* Build the return declaration for the function.  */
   restype = TREE_TYPE (fntype);
@@ -10393,8 +10395,6 @@ start_function (tree declspecs, tree declarator, tree attrs, int flags)
          /* We need to set the DECL_CONTEXT.  */
          if (!DECL_CONTEXT (decl1) && DECL_TEMPLATE_INFO (decl1))
            DECL_CONTEXT (decl1) = DECL_CONTEXT (DECL_TI_TEMPLATE (decl1));
-         /* And make sure we have enough default args.  */
-         check_default_args (decl1);
        }
       fntype = TREE_TYPE (decl1);
     }
index 0a7155ed470f1790dad5162d9db8666b0f0d58cf..55d68a2e6016bec3139ddfb9059019bf0c80c4b7 100644 (file)
@@ -2959,7 +2959,7 @@ check_default_args (tree x)
        {
          cp_error_at ("default argument missing for parameter %P of `%+#D'",
                       i, x);
-         break;
+         TREE_PURPOSE (arg) = error_mark_node;
        }
     }
 }
index 28d89e93fb20cd8b381085eb4ce5627f598dc551..870eaabe120b2af6370c1c675e784cca88e388ea 100644 (file)
@@ -606,6 +606,9 @@ pushdecl (tree x)
     {
       int different_binding_level = 0;
 
+      if (TREE_CODE (x) == FUNCTION_DECL || DECL_FUNCTION_TEMPLATE_P (x))
+       check_default_args (x);
+
       if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
        name = TREE_OPERAND (name, 0);
 
@@ -717,8 +720,6 @@ pushdecl (tree x)
                {
                  if (TREE_CODE (t) == TYPE_DECL)
                    SET_IDENTIFIER_TYPE_VALUE (name, TREE_TYPE (t));
-                 else if (TREE_CODE (t) == FUNCTION_DECL)
-                   check_default_args (t);
 
                  POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t);
                }
@@ -1001,9 +1002,6 @@ pushdecl (tree x)
            }
        }
 
-      if (TREE_CODE (x) == FUNCTION_DECL)
-       check_default_args (x);
-
       if (TREE_CODE (x) == VAR_DECL)
        maybe_register_incomplete_var (x);
     }
index 24b802b33fa84b2f12ae4e1e664aff78bb532ff9..032cbd7e9b760d04efc259cd2268dbf38e2c151b 100644 (file)
@@ -14929,6 +14929,9 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
       parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
     }
 
+  /* Make sure no default arg is missing.  */
+  check_default_args (fn);
+
   /* Restore the queue.  */
   parser->unparsed_functions_queues 
     = TREE_CHAIN (parser->unparsed_functions_queues);
index 1e2995be7f8f6758271eba67648e0a746be11b23..fa16199483fe0bb9baccb5a106b2168a1dd93e26 100644 (file)
@@ -1,3 +1,9 @@
+2006-01-24  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/16829
+       * g++.dg/other/default2.C: New test.
+       * g++.dg/other/default3.C: New test.
+
 2006-01-19  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        PR c++/25854
diff --git a/gcc/testsuite/g++.dg/other/default2.C b/gcc/testsuite/g++.dg/other/default2.C
new file mode 100644 (file)
index 0000000..be0e5c3
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/16829
+// { dg-do "compile" }
+
+template<typename T> void foo(T, int = 0, int) {}  // { dg-error "default" }
+
+void bar()
+{
+  foo(0);
+}
diff --git a/gcc/testsuite/g++.dg/other/default3.C b/gcc/testsuite/g++.dg/other/default3.C
new file mode 100644 (file)
index 0000000..324ba71
--- /dev/null
@@ -0,0 +1,109 @@
+// PR c++/16829
+// { dg-do "compile" }
+
+void f1(int = 0, int);                       // { dg-error "default" }
+
+void f2(int = 0, int) {}                     // { dg-error "default" }
+
+void f3(int, int);
+void f3(int = 0, int);                       // { dg-error "default" }
+
+void f4(int, int);
+void f4(int = 0, int) {}                     // { dg-error "default" }
+
+void f5();
+void f5(int = 0, int);                       // { dg-error "default" }
+
+void f6();
+void f6(int = 0, int) {}                     // { dg-error "default" }
+
+template<typename> void g1(int = 0, int);    // { dg-error "default" }
+
+template<typename> void g2(int = 0, int) {}  // { dg-error "default" }
+
+template<typename> void g3(int, int);
+template<typename> void g3(int = 0, int);    // { dg-error "default" }
+
+template<typename> void g4(int, int);
+template<typename> void g4(int = 0, int) {}  // { dg-error "default" }
+
+template<typename> void g5();
+template<typename> void g5(int = 0, int);    // { dg-error "default" }
+
+template<typename> void g6();
+template<typename> void g6(int = 0, int) {}  // { dg-error "default" }
+
+template<typename T> void g7(T, T)   {}
+template<typename T> void g7(T* = 0, T*) {}  // { dg-error "default" }
+
+
+struct A
+{
+  void F1(int = 0, int);                       // { dg-error "default" }
+
+  void F2(int = 0, int) {}                     // { dg-error "default" }
+
+  void F3(int, int);
+
+  void F4();
+  void F4(int = 0, int);                       // { dg-error "default" }
+
+  void F5();
+  void F5(int = 0, int) {}                     // { dg-error "default" }
+
+  template<typename> void G1(int = 0, int);    // { dg-error "default" }
+
+  template<typename> void G2(int = 0, int) {}  // { dg-error "default" }
+
+  template<typename> void G3(int, int);
+
+  template<typename> void G4();
+  template<typename> void G4(int = 0, int);    // { dg-error "default" }
+
+  template<typename> void G5();
+  template<typename> void G5(int = 0, int) {}  // { dg-error "default" }
+
+  template<typename T> void G6(T, T)   {}
+  template<typename T> void G6(T* = 0, T*) {}  // { dg-error "default" }
+};
+
+void A::F3(int = 0, int) {}                     // { dg-error "default" }
+
+template<typename> void A::G3(int = 0, int) {}  // { dg-error "default" }
+
+
+template<typename> struct B
+{
+  void F1(int = 0, int);                       // { dg-error "default" }
+
+  void F2(int = 0, int) {}                     // { dg-error "default" }
+
+  void F3(int, int);
+
+  void F4();
+  void F4(int = 0, int);                       // { dg-error "default" }
+
+  void F5();
+  void F5(int = 0, int) {}                     // { dg-error "default" }
+
+  template<typename> void G1(int = 0, int);    // { dg-error "default" }
+
+  template<typename> void G2(int = 0, int) {}  // { dg-error "default" }
+
+  template<typename> void G3(int, int);
+
+  template<typename> void G4();
+  template<typename> void G4(int = 0, int);    // { dg-error "default" }
+
+  template<typename> void G5();
+  template<typename> void G5(int = 0, int) {}  // { dg-error "default" }
+
+  template<typename T> void G6(T, T)   {}
+  template<typename T> void G6(T* = 0, T*) {}  // { dg-error "default" }
+};
+
+template<typename T>
+void B<T>::F3(int = 0, int) {}  // { dg-error "default" }
+
+template<typename T> template<typename>
+void B<T>::G3(int = 0, int) {}  // { dg-error "default" }