mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-21 08:30:35 +08:00
re PR c++/28274 (Redeclaration with extra default argument doesn't work)
PR c++/28274 * decl.c (duplicate_decls): Call check_default_args here. (start_preparsed_function): Do not call check_default_args. * name-lookup.c (pushdecl_maybe_friend): Only call check_default_args if duplicate_decls got bypassed. * g++.dg/other/default5.C: New test. From-SVN: r115893
This commit is contained in:
parent
74c5a70c23
commit
4a2f6dc05b
@ -1,3 +1,11 @@
|
||||
2006-08-03 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
||||
|
||||
PR c++/28274
|
||||
* decl.c (duplicate_decls): Call check_default_args here.
|
||||
(start_preparsed_function): Do not call check_default_args.
|
||||
* name-lookup.c (pushdecl_maybe_friend): Only call
|
||||
check_default_args if duplicate_decls got bypassed.
|
||||
|
||||
2006-08-02 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR c++/28479
|
||||
|
@ -1691,6 +1691,9 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
|
||||
check_redeclaration_exception_specification (newdecl, olddecl);
|
||||
TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = newtype;
|
||||
|
||||
if (TREE_CODE (newdecl) == FUNCTION_DECL)
|
||||
check_default_args (newdecl);
|
||||
|
||||
/* Lay the type out, unless already done. */
|
||||
if (! same_type_p (newtype, oldtype)
|
||||
&& TREE_TYPE (newdecl) != error_mark_node
|
||||
@ -10435,8 +10438,6 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
|
||||
you declare a function, these types can be incomplete, but they
|
||||
must be complete when you define the function. */
|
||||
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);
|
||||
|
@ -606,9 +606,6 @@ pushdecl_maybe_friend (tree x, bool is_friend)
|
||||
{
|
||||
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);
|
||||
|
||||
@ -751,6 +748,9 @@ pushdecl_maybe_friend (tree x, bool is_friend)
|
||||
}
|
||||
}
|
||||
|
||||
if (TREE_CODE (x) == FUNCTION_DECL || DECL_FUNCTION_TEMPLATE_P (x))
|
||||
check_default_args (x);
|
||||
|
||||
check_template_shadow (x);
|
||||
|
||||
/* If this is a function conjured up by the backend, massage it
|
||||
|
@ -1,3 +1,8 @@
|
||||
2006-08-03 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
||||
|
||||
PR c++/28274
|
||||
* g++.dg/other/default5.C: New test.
|
||||
|
||||
2006-08-02 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
* g++.dg/tree-ssa/copyprop-1.C: XFAIL.
|
||||
|
47
gcc/testsuite/g++.dg/other/default5.C
Normal file
47
gcc/testsuite/g++.dg/other/default5.C
Normal file
@ -0,0 +1,47 @@
|
||||
// PR c++/28274
|
||||
// { dg-do "compile" }
|
||||
|
||||
void f1(int, int, int, int, int = 0);
|
||||
void f1(int, int, int, int = 0, int);
|
||||
void f1(int, int, int = 0, int, int);
|
||||
void f1(int = 0, int, int, int, int); // { dg-error "default" }
|
||||
|
||||
void f2(int, int, int, int, int = 0) {}
|
||||
void f2(int, int, int, int = 0, int);
|
||||
void f2(int, int, int = 0, int, int);
|
||||
void f2(int = 0, int, int, int, int); // { dg-error "default" }
|
||||
|
||||
void f3(int, int, int, int, int = 0);
|
||||
void f3(int, int, int, int = 0, int) {}
|
||||
void f3(int, int, int = 0, int, int);
|
||||
void f3(int = 0, int, int, int, int); // { dg-error "default" }
|
||||
|
||||
void f4(int, int, int, int, int = 0);
|
||||
void f4(int, int, int, int = 0, int);
|
||||
void f4(int, int, int = 0, int, int) {}
|
||||
void f4(int = 0, int, int, int, int); // { dg-error "default" }
|
||||
|
||||
void f5(int, int, int, int, int = 0);
|
||||
void f5(int, int, int, int = 0, int);
|
||||
void f5(int, int, int = 0, int, int);
|
||||
void f5(int = 0, int, int, int, int) {} // { dg-error "default" }
|
||||
|
||||
|
||||
struct A
|
||||
{
|
||||
void F1(int, int, int = 0);
|
||||
void F2(int, int, int = 0);
|
||||
};
|
||||
|
||||
void A::F1(int, int = 0, int) {}
|
||||
void A::F2(int = 0, int, int) {} // { dg-error "default" }
|
||||
|
||||
|
||||
template<int> struct B
|
||||
{
|
||||
void F1(int, int, int = 0);
|
||||
void F2(int, int, int = 0);
|
||||
};
|
||||
|
||||
template<int N> void B<N>::F1(int, int = 0, int) {}
|
||||
template<int N> void B<N>::F2(int = 0, int, int) {} // { dg-error "default" }
|
Loading…
x
Reference in New Issue
Block a user