OSDN Git Service

PR c++/42880
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Jan 2010 22:52:36 +0000 (22:52 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Jan 2010 22:52:36 +0000 (22:52 +0000)
* semantics.c (begin_class_definition): Don't use type_as_string.

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

gcc/cp/ChangeLog
gcc/cp/semantics.c

index a3b9755..c104e86 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-28  Jason Merrill  <jason@redhat.com>
+
+       PR c++/42880
+       * semantics.c (begin_class_definition): Don't use type_as_string.
+
 2010-01-28  Dodji Seketeli  <dodji@redhat.com>
 
        PR c++/42713
index d9ba591..441081c 100644 (file)
@@ -2371,13 +2371,20 @@ begin_class_definition (tree t, tree attributes)
 
   /* According to the C++ ABI, decimal classes defined in ISO/IEC TR 24733
      are passed the same as decimal scalar types.  */
-  if (TREE_CODE (t) == RECORD_TYPE)
+  if (TREE_CODE (t) == RECORD_TYPE
+      && !processing_template_decl)
     {
-      const char *n = type_as_string (t, TFF_CLASS_KEY_OR_ENUM);
-      if ((strcmp (n, "class std::decimal::decimal32") == 0)
-         || (strcmp (n, "class std::decimal::decimal64") == 0)
-         || (strcmp (n, "class std::decimal::decimal128") == 0))
-       TYPE_TRANSPARENT_AGGR (t) = 1;
+      tree ns = TYPE_CONTEXT (t);
+      if (ns && TREE_CODE (ns) == NAMESPACE_DECL
+         && DECL_CONTEXT (ns) == std_node
+         && !strcmp (IDENTIFIER_POINTER (DECL_NAME (ns)), "decimal"))
+       {
+         const char *n = TYPE_NAME_STRING (t);
+         if ((strcmp (n, "decimal32") == 0)
+             || (strcmp (n, "decimal64") == 0)
+             || (strcmp (n, "decimal128") == 0))
+           TYPE_TRANSPARENT_AGGR (t) = 1;
+       }
     }
 
   /* A non-implicit typename comes from code like: