From: Mark Mitchell Date: Fri, 15 Jan 1999 18:34:48 +0000 (+0000) Subject: pt.c (process_template_parm): Ignore top-level qualifiers on non-type parameters. X-Git-Tag: prereleases/libgcj-0.1~1335 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d490621d8989463e895bd0685144a7132a485059;p=thirdparty%2Fgcc.git pt.c (process_template_parm): Ignore top-level qualifiers on non-type parameters. * pt.c (process_template_parm): Ignore top-level qualifiers on non-type parameters. * decl.c (start_function): Use current_function_parms in the call to require_complete_type_for_parms, not the probably empty DECL_ARGUMENTS. From-SVN: r24684 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a0145167ed91..c0daba4189e2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +1999-01-15 Mark Mitchell + + * pt.c (process_template_parm): Ignore top-level qualifiers on + non-type parameters. + + * decl.c (start_function): Use current_function_parms in the call + to require_complete_type_for_parms, not the probably empty + DECL_ARGUMENTS. + 1999-01-14 Jason Merrill * semantics.c (finish_asm_stmt): Don't warn about redundant volatile. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index bf887d2918d4..5e603b6d4804 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -12860,8 +12860,8 @@ start_function (declspecs, declarator, attrs, pre_parsed_p) if (! processing_template_decl) { - /* In a fcn definition, arg types must be complete. */ - require_complete_types_for_parms (DECL_ARGUMENTS (decl1)); + /* In a function definition, arg types must be complete. */ + require_complete_types_for_parms (current_function_parms); if (TYPE_SIZE (complete_type (TREE_TYPE (fntype))) == NULL_TREE) { diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index fea1c345be84..a28751b03868 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -1591,6 +1591,13 @@ process_template_parm (list, next) /* is a const-param */ parm = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm), PARM, 0, NULL_TREE); + + /* [temp.param] + + The top-level cv-qualifiers on the template-parameter are + ignored when determining its type. */ + TREE_TYPE (parm) = TYPE_MAIN_VARIANT (TREE_TYPE (parm)); + /* A template parameter is not modifiable. */ TREE_READONLY (parm) = 1; if (IS_AGGR_TYPE (TREE_TYPE (parm)) diff --git a/gcc/testsuite/g++.old-deja/g++.other/incomplete.C b/gcc/testsuite/g++.old-deja/g++.other/incomplete.C new file mode 100644 index 000000000000..0c230c18777c --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/incomplete.C @@ -0,0 +1,5 @@ +// Build don't link: + +struct S; + +void f(S s) {} // ERROR - incomplete type diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash26.C b/gcc/testsuite/g++.old-deja/g++.pt/crash26.C new file mode 100644 index 000000000000..d2101bd3b632 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash26.C @@ -0,0 +1,15 @@ +// Build don't link: +// Origin: Theodore Papadopoulo + +double f(double); +typedef double (*M)(double); + +class A { +public: + template void g(); +}; + +class B: public A { +public: + void g() { A::g(); } +};