OSDN Git Service

cp:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 19 Jan 2002 20:55:35 +0000 (20:55 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 19 Jan 2002 20:55:35 +0000 (20:55 +0000)
Fix regression introduced with patch for c++/775
* parse.y (class_head_defn): Check for template specializations
with a different class-key.
testsuite:
* g++.dg/template/access1.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49016 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parse.y
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/access1.C [new file with mode: 0644]

index abb6417..b4c9f70 100644 (file)
@@ -1,3 +1,9 @@
+2002-01-19  Nathan Sidwell  <nathan@codesourcery.com>
+
+       Fix regression introduced with patch for c++/775
+       * parse.y (class_head_defn): Check for template specializations
+       with a different class-key.
+
 2002-01-17  Jason Merrill  <jason@redhat.com>
 
        * decl.c (begin_constructor_body, begin_destructor_body): New fns.
index 31fc850..420e428 100644 (file)
@@ -2434,12 +2434,22 @@ class_head_defn:
                  yyungetc ('{', 1);
                  $$.t = $1;
                  $$.new_type_flag = 0;
+                 if (TREE_CODE (TREE_TYPE ($1)) == RECORD_TYPE)
+                   /* We might be specializing a template with a different
+                      class-key.  */
+                   CLASSTYPE_DECLARED_CLASS (TREE_TYPE ($1))
+                     = (current_aggr == class_type_node);
                }
        | class_head_apparent_template ':'
                {
                  yyungetc (':', 1);
                  $$.t = $1;
                  $$.new_type_flag = 0;
+                 if (TREE_CODE (TREE_TYPE ($1)) == RECORD_TYPE)
+                   /* We might be specializing a template with a different
+                      class-key.  */
+                   CLASSTYPE_DECLARED_CLASS (TREE_TYPE ($1))
+                     = (current_aggr == class_type_node);
                }
        | aggr identifier_defn '{'
                {
index 6d56315..54e1a36 100644 (file)
@@ -1,3 +1,7 @@
+2002-01-19  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.dg/template/access1.C: New test.
+
 2002-01-18  Aldy Hernandez  <aldyh@redhat.com>
 
         * gcc.dg/20020118-1.c: New.
diff --git a/gcc/testsuite/g++.dg/template/access1.C b/gcc/testsuite/g++.dg/template/access1.C
new file mode 100644 (file)
index 0000000..1622e08
--- /dev/null
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 19 Jan 2002 <nathan@codesourcery.com>
+
+// It is legal to specialize a template with a different class-key.
+
+template<typename T> class X;
+
+template<typename T> struct X<T *>
+{
+  int i;
+};
+template<> struct X<int>
+{
+  int i;
+};
+
+void foo ()
+{
+  X<int *> xip;
+  X<int> xi;
+
+  xip.i;
+  xi.i;
+}
+