OSDN Git Service

PR c++/43333
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 22 Mar 2010 20:38:57 +0000 (20:38 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 22 Mar 2010 20:38:57 +0000 (20:38 +0000)
* tree.c (pod_type_p): Use old meaning in C++98 mode.

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

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/is_pod.C
gcc/testsuite/g++.dg/ext/is_pod_98.C [new file with mode: 0644]

index fd08a54..0e10b5b 100644 (file)
@@ -1,5 +1,8 @@
 2010-03-22  Jason Merrill  <jason@redhat.com>
 
+       PR c++/43333
+       * tree.c (pod_type_p): Use old meaning in C++98 mode.
+
        PR c++/43281
        * pt.c (contains_auto_r): New fn.
        (do_auto_deduction): Use it.
index 9867d2e..35b0da6 100644 (file)
@@ -2390,7 +2390,9 @@ pod_type_p (const_tree t)
      argument unmodified and we assign it to a const_tree.  */
   t = strip_array_types (CONST_CAST_TREE(t));
 
-  if (CLASS_TYPE_P (t))
+  if (!CLASS_TYPE_P (t))
+    return scalarish_type_p (t);
+  else if (cxx_dialect > cxx98)
     /* [class]/10: A POD struct is a class that is both a trivial class and a
        standard-layout class, and has no non-static data members of type
        non-POD struct, non-POD union (or array of such types).
@@ -2399,7 +2401,8 @@ pod_type_p (const_tree t)
        non-std-layout or non-trivial, the class will be too.  */
     return (std_layout_type_p (t) && trivial_type_p (t));
   else
-    return scalarish_type_p (t);
+    /* The C++98 definition of POD is different.  */
+    return !CLASSTYPE_NON_LAYOUT_POD_P (t);
 }
 
 /* Returns true iff T is POD for the purpose of layout, as defined in the
index 99f6747..e01b7ad 100644 (file)
@@ -1,5 +1,9 @@
 2010-03-22  Jason Merrill  <jason@redhat.com>
 
+       PR c++/43333
+       * g++.dg/ext/is_pod.C: Pass -std=c++0x.
+       * g++.dg/ext/is_pod_98.C: New.
+
        PR c++/43281
        * g++.dg/cpp0x/auto18.C: New.
 
index c984283..570d235 100644 (file)
@@ -1,3 +1,4 @@
+// { dg-options "-std=c++0x" }
 // { dg-do "run" }
 #include <cassert>
 
diff --git a/gcc/testsuite/g++.dg/ext/is_pod_98.C b/gcc/testsuite/g++.dg/ext/is_pod_98.C
new file mode 100644 (file)
index 0000000..80a87c8
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/43333
+// { dg-options "-std=c++98" }
+// { dg-do run }
+
+struct strPOD
+{
+  const char *const foo;
+  const char *const bar;
+};
+extern "C" void abort (void);
+int main ()
+{
+  if (!__is_pod (strPOD))
+    abort ();
+  return 0;
+}