re PR c++/9836 (Error with typdefs in partial specializations of classes)
authorMark Mitchell <mark@codesourcery.com>
Mon, 24 Feb 2003 21:52:00 +0000 (21:52 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 24 Feb 2003 21:52:00 +0000 (21:52 +0000)
PR c++/9836
* cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE): Do not skip from
specializations back to the main template.
* parser.c (cp_parser_diagnose_invalid_type_name):Adjust use.
* pt.c (resolve_typename_type): Likewise.

PR c++/9836
* g++.dg/template/spec6.C: New test.

From-SVN: r63383

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/parser.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/spec6.C [new file with mode: 0644]

index dff7c4f667dfbd182e58362c10cab7fb1ee66239..e793ab10893322f61069a251840e14178d5a5908 100644 (file)
@@ -1,3 +1,11 @@
+2003-02-24  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/9836
+       * cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE): Do not skip from
+       specializations back to the main template.
+       * parser.c (cp_parser_diagnose_invalid_type_name):Adjust use.
+       * pt.c (resolve_typename_type): Likewise.
+
 2003-02-24  Jeffrey D. Oldham  <oldham@codesourcery.com>
 
        PR c++/9778
index 919e5291f1ab6c21e7058ee217e21d7d2573c3d0..8e44bbb9efc97984625b45cb57cbc245c5780f51 100644 (file)
@@ -2317,10 +2317,12 @@ struct lang_decl GTY(())
   TI_ARGS (ENUM_TEMPLATE_INFO (NODE))
 
 /* For a template instantiation TYPE, returns the TYPE corresponding
-   to the primary template.  */
-#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE)                          \
-  TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE               \
-                                  (CLASSTYPE_TI_TEMPLATE ((TYPE)))))
+   to the primary template.  Otherwise returns TYPE itself.  */
+#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE)                                          \
+  ((CLASSTYPE_USE_TEMPLATE ((TYPE)) && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE)))    \
+   ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE                            \
+                                     (CLASSTYPE_TI_TEMPLATE ((TYPE)))))                \
+   : (TYPE))
 
 /* Like DECL_TI_TEMPLATE, but for an ENUMERAL_, RECORD_, or UNION_TYPE.  */
 #define TYPE_TI_TEMPLATE(NODE)                 \
index 0688cdcc86cbe1187595d0f3f3973719fab36de3..17b7224cb6e1609d23942139be3df8ef656a7524 100644 (file)
@@ -1953,8 +1953,7 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser)
                  /* Go from a particular instantiation of the
                     template (which will have an empty TYPE_FIELDs),
                     to the main version.  */
-                 if (CLASSTYPE_USE_TEMPLATE (base_type))
-                   base_type = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (base_type);
+                 base_type = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (base_type);
                  for (field = TYPE_FIELDS (base_type);
                       field;
                       field = TREE_CHAIN (field))
index 053a9670779894c1bc7a2225890dc6710ca02bc0..a5425f34b4ab7cc1a5df9af0196197ba31bafa72 100644 (file)
@@ -11530,8 +11530,7 @@ resolve_typename_type (tree type, bool only_current_p)
     return error_mark_node;
   /* If SCOPE is a partial instantiation, it will not have a valid
      TYPE_FIELDS list, so use the original template.  */
-  if (CLASSTYPE_USE_TEMPLATE (scope))
-    scope = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope);
+  scope = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope);
   /* Enter the SCOPE so that name lookup will be resolved as if we
      were in the class definition.  In particular, SCOPE will no
      longer be considered a dependent type.  */
index 3f847eff93529037c4fe3e97d1487294c5e04993..b88756febc79343b2646256566f148f7c2e7506b 100644 (file)
@@ -1,3 +1,8 @@
+2003-02-24  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/9836
+       * g++.dg/template/spec6.C: New test.
+
 2003-02-24  Jeff Law  <law@redhat.com>
 
        * gcc.c-torture/compile/20030224-1.c: New test for ia32 backend bug.
diff --git a/gcc/testsuite/g++.dg/template/spec6.C b/gcc/testsuite/g++.dg/template/spec6.C
new file mode 100644 (file)
index 0000000..915b833
--- /dev/null
@@ -0,0 +1,10 @@
+template <bool, int> struct X {};
+
+template <bool C>    struct X<C,1> {
+    typedef double* type;
+    type foo () const;
+};
+
+template <bool C>
+typename X<C,1>::type
+X<C,1>::foo () const {}