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
This commit is contained in:
Jason Merrill 2010-03-22 16:38:57 -04:00 committed by Jason Merrill
parent 189327376c
commit cc72bbaac7
5 changed files with 29 additions and 2 deletions

View 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.

View 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

View 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.

View File

@ -1,3 +1,4 @@
// { dg-options "-std=c++0x" }
// { dg-do "run" }
#include <cassert>

View File

@ -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;
}