diff options
author | Jason Merrill <jason@redhat.com> | 2010-03-22 16:38:57 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2010-03-22 16:38:57 -0400 |
commit | cc72bbaac742dd66ce5aaa9791a20903cdbac3ec (patch) | |
tree | 498717f3a2592be450d23ddf277ef43ad3174304 /gcc | |
parent | 189327376c98168ad9445537dcd04d467b09d143 (diff) | |
download | gcc-cc72bbaac742dd66ce5aaa9791a20903cdbac3ec.zip gcc-cc72bbaac742dd66ce5aaa9791a20903cdbac3ec.tar.gz gcc-cc72bbaac742dd66ce5aaa9791a20903cdbac3ec.tar.bz2 |
re PR c++/43333 (__is_pod seems broken)
PR c++/43333
* tree.c (pod_type_p): Use old meaning in C++98 mode.
From-SVN: r157652
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/tree.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/is_pod.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/is_pod_98.C | 16 |
5 files changed, 29 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fd08a54..0e10b5b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 9867d2e..35b0da6 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 99f6747..e01b7ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/g++.dg/ext/is_pod.C b/gcc/testsuite/g++.dg/ext/is_pod.C index c984283..570d235 100644 --- a/gcc/testsuite/g++.dg/ext/is_pod.C +++ b/gcc/testsuite/g++.dg/ext/is_pod.C @@ -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 index 0000000..80a87c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_pod_98.C @@ -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; +} |