summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/decl.c4
-rw-r--r--gcc/cp/pt.c7
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/incomplete.C5
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/crash26.C15
5 files changed, 38 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a0145167ed9..c0daba4189e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+1999-01-15 Mark Mitchell <mark@markmitchell.com>
+
+ * 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 <jason@yorick.cygnus.com>
* semantics.c (finish_asm_stmt): Don't warn about redundant volatile.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index bf887d2918d..5e603b6d480 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 fea1c345be8..a28751b0386 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 00000000000..0c230c18777
--- /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 00000000000..d2101bd3b63
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/crash26.C
@@ -0,0 +1,15 @@
+// Build don't link:
+// Origin: Theodore Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr>
+
+double f(double);
+typedef double (*M)(double);
+
+class A {
+public:
+ template <const M n> void g();
+};
+
+class B: public A {
+public:
+ void g() { A::g<f>(); }
+};
OpenPOWER on IntegriCloud