re PR c++/70690 (r235002 miscompiles tcmalloc)

PR c++/70690

	PR c++/70528
	* class.c (type_maybe_constexpr_default_constructor): New.
	(type_has_constexpr_default_constructor): Revert.

From-SVN: r235165
This commit is contained in:
Jason Merrill 2016-04-18 15:00:00 -04:00 committed by Jason Merrill
parent 827f44ebeb
commit 81c160c6f3
3 changed files with 57 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2016-04-18 Jason Merrill <jason@redhat.com>
PR c++/70690
PR c++/70528
* class.c (type_maybe_constexpr_default_constructor): New.
(type_has_constexpr_default_constructor): Revert.
2016-04-16 Sandra Loosemore <sandra@codesourcery.com>
PR target/1078

View File

@ -214,6 +214,7 @@ static bool base_derived_from (tree, tree);
static int empty_base_at_nonzero_offset_p (tree, tree, splay_tree);
static tree end_of_base (tree);
static tree get_vcall_index (tree, tree);
static bool type_maybe_constexpr_default_constructor (tree);
/* Variables shared between class.c and call.c. */
@ -3346,7 +3347,11 @@ add_implicitly_declared_members (tree t, tree* access_decls,
CLASSTYPE_LAZY_DEFAULT_CTOR (t) = 1;
if (cxx_dialect >= cxx11)
TYPE_HAS_CONSTEXPR_CTOR (t)
= type_has_constexpr_default_constructor (t);
/* Don't force the declaration to get a hard answer; if the
definition would have made the class non-literal, it will still be
non-literal because of the base or member in question, and that
gives a better diagnostic. */
= type_maybe_constexpr_default_constructor (t);
}
/* [class.ctor]
@ -5348,16 +5353,28 @@ type_has_constexpr_default_constructor (tree t)
{
if (!TYPE_HAS_COMPLEX_DFLT (t))
return trivial_default_constructor_is_constexpr (t);
/* Assume it's constexpr to avoid unnecessary instantiation; if the
definition would have made the class non-literal, it will still be
non-literal because of the base or member in question, and that
gives a better diagnostic. */
return true;
/* Non-trivial, we need to check subobject constructors. */
lazily_declare_fn (sfk_constructor, t);
}
fns = locate_ctor (t);
return (fns && DECL_DECLARED_CONSTEXPR_P (fns));
}
/* Returns true iff class T has a constexpr default constructor or has an
implicitly declared default constructor that we can't tell if it's constexpr
without forcing a lazy declaration (which might cause undesired
instantiations). */
bool
type_maybe_constexpr_default_constructor (tree t)
{
if (CLASS_TYPE_P (t) && CLASSTYPE_LAZY_DEFAULT_CTOR (t)
&& TYPE_HAS_COMPLEX_DFLT (t))
/* Assume it's constexpr. */
return true;
return type_has_constexpr_default_constructor (t);
}
/* Returns true iff class TYPE has a virtual destructor. */
bool

View File

@ -0,0 +1,27 @@
// PR c++/70690
// { dg-do run }
struct A {
A() {}
};
struct APadded : public A {
char pad[63];
};
int f();
int i = f();
APadded cache[50];
APadded *p = cache;
int f()
{
cache[0].pad[0] = 42;
return 1;
}
int main()
{
if (cache[0].pad[0] != 42)
__builtin_abort();
}