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);
/* 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);
}
{
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);
{
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);
}
}
}
- if (TREE_CODE (x) == FUNCTION_DECL)
- check_default_args (x);
-
if (TREE_CODE (x) == VAR_DECL)
maybe_register_incomplete_var (x);
}
--- /dev/null
+// 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" }