From c938791573a5c7985b6df49913f88e5e29a35aaa Mon Sep 17 00:00:00 2001 From: Giovanni Bajo Date: Wed, 17 Nov 2004 00:17:00 +0000 Subject: [PATCH] decl.c (start_preparsed_function): Call check_function_type even in templates. * decl.c (start_preparsed_function): Call check_function_type even in templates. (require_complete_types_for_parms): Skip dependent types. (check_function_type): Likewise. * g++.dg/template/incomplete1.C: New test. From-SVN: r90779 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/decl.c | 7 +++++-- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/template/incomplete1.C | 18 ++++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/incomplete1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a538e5e14f2d..ddb1e996e309 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2004-11-16 Giovanni Bajo + + * decl.c (start_preparsed_function): Call check_function_type even + in templates. + (require_complete_types_for_parms): Skip dependent types. + (check_function_type): Likewise. + 2004-11-16 Steven Bosscher * Make-lang.in (cp/decl.o, cp/search.o): Don't depend on stack.h. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index f82ec87a1d3a..9baedb42d32c 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8271,6 +8271,8 @@ require_complete_types_for_parms (tree parms) { for (; parms; parms = TREE_CHAIN (parms)) { + if (dependent_type_p (TREE_TYPE (parms))) + continue; if (VOID_TYPE_P (TREE_TYPE (parms))) /* grokparms will have already issued an error. */ TREE_TYPE (parms) = error_mark_node; @@ -9840,6 +9842,8 @@ check_function_type (tree decl, tree current_function_parms) /* In a function definition, arg types must be complete. */ require_complete_types_for_parms (current_function_parms); + if (dependent_type_p (return_type)) + return; if (!COMPLETE_OR_VOID_TYPE_P (return_type)) { error ("return type %q#T is incomplete", TREE_TYPE (fntype)); @@ -9985,8 +9989,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags) /* Make sure the parameter and return types are reasonable. When you declare a function, these types can be incomplete, but they must be complete when you define the function. */ - if (! processing_template_decl) - check_function_type (decl1, current_function_parms); + check_function_type (decl1, current_function_parms); /* Build the return declaration for the function. */ restype = TREE_TYPE (fntype); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 523db7aff763..8093d75806f9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-11-16 Giovanni Bajo + + * g++.dg/template/incomplete1.C: New test. + 2004-11-16 Nick Clifton Revert patches accidentally commited during checkin of fixes for diff --git a/gcc/testsuite/g++.dg/template/incomplete1.C b/gcc/testsuite/g++.dg/template/incomplete1.C new file mode 100644 index 000000000000..e4997ef01465 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete1.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// Origin: Ivan Godard +// PR c++/17447: Detect parameters of dependent types even in templates + +struct B; // { dg-error "forward declaration" } +template struct A { + + friend A& operator <<(A& a, B b) { return a; } // { dg-error "incomplete" } + friend A& operator <<(A& a, T b) { return a; } + + void foo1(B b) {} // { dg-error "incomplete" } + void foo1a(T b) {} + + B foo2(void) {} // { dg-error "incomplete" } + T foo2a(void) {} + + void foo3(B b); +};