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:
parent
827f44ebeb
commit
81c160c6f3
|
@ -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>
|
2016-04-16 Sandra Loosemore <sandra@codesourcery.com>
|
||||||
|
|
||||||
PR target/1078
|
PR target/1078
|
||||||
|
|
|
@ -214,6 +214,7 @@ static bool base_derived_from (tree, tree);
|
||||||
static int empty_base_at_nonzero_offset_p (tree, tree, splay_tree);
|
static int empty_base_at_nonzero_offset_p (tree, tree, splay_tree);
|
||||||
static tree end_of_base (tree);
|
static tree end_of_base (tree);
|
||||||
static tree get_vcall_index (tree, tree);
|
static tree get_vcall_index (tree, tree);
|
||||||
|
static bool type_maybe_constexpr_default_constructor (tree);
|
||||||
|
|
||||||
/* Variables shared between class.c and call.c. */
|
/* 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;
|
CLASSTYPE_LAZY_DEFAULT_CTOR (t) = 1;
|
||||||
if (cxx_dialect >= cxx11)
|
if (cxx_dialect >= cxx11)
|
||||||
TYPE_HAS_CONSTEXPR_CTOR (t)
|
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]
|
/* [class.ctor]
|
||||||
|
@ -5348,16 +5353,28 @@ type_has_constexpr_default_constructor (tree t)
|
||||||
{
|
{
|
||||||
if (!TYPE_HAS_COMPLEX_DFLT (t))
|
if (!TYPE_HAS_COMPLEX_DFLT (t))
|
||||||
return trivial_default_constructor_is_constexpr (t);
|
return trivial_default_constructor_is_constexpr (t);
|
||||||
/* Assume it's constexpr to avoid unnecessary instantiation; if the
|
/* Non-trivial, we need to check subobject constructors. */
|
||||||
definition would have made the class non-literal, it will still be
|
lazily_declare_fn (sfk_constructor, t);
|
||||||
non-literal because of the base or member in question, and that
|
|
||||||
gives a better diagnostic. */
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
fns = locate_ctor (t);
|
fns = locate_ctor (t);
|
||||||
return (fns && DECL_DECLARED_CONSTEXPR_P (fns));
|
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. */
|
/* Returns true iff class TYPE has a virtual destructor. */
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
Loading…
Reference in New Issue