mirror of git://gcc.gnu.org/git/gcc.git
PR c++/72849 - ICE with incomplete class.
* constexpr.c (cxx_eval_constant_expression): Check COMPLETE_TYPE_P before calling is_really_empty_class. * class.c (is_really_empty_class): Don't call complete_type. From-SVN: r239289
This commit is contained in:
parent
810a3aa6bb
commit
f4fce1837c
|
|
@ -1,5 +1,10 @@
|
||||||
2016-08-09 Jason Merrill <jason@redhat.com>
|
2016-08-09 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
PR c++/72849
|
||||||
|
* constexpr.c (cxx_eval_constant_expression): Check
|
||||||
|
COMPLETE_TYPE_P before calling is_really_empty_class.
|
||||||
|
* class.c (is_really_empty_class): Don't call complete_type.
|
||||||
|
|
||||||
PR c++/56701
|
PR c++/56701
|
||||||
* typeck.c (cp_build_addr_expr_1): Remove special *this handling.
|
* typeck.c (cp_build_addr_expr_1): Remove special *this handling.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8419,7 +8419,7 @@ is_really_empty_class (tree type)
|
||||||
|
|
||||||
/* CLASSTYPE_EMPTY_P isn't set properly until the class is actually laid
|
/* CLASSTYPE_EMPTY_P isn't set properly until the class is actually laid
|
||||||
out, but we'd like to be able to check this before then. */
|
out, but we'd like to be able to check this before then. */
|
||||||
if (COMPLETE_TYPE_P (complete_type (type)) && is_empty_class (type))
|
if (COMPLETE_TYPE_P (type) && is_empty_class (type))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (binfo = TYPE_BINFO (type), i = 0;
|
for (binfo = TYPE_BINFO (type), i = 0;
|
||||||
|
|
|
||||||
|
|
@ -3699,7 +3699,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
|
||||||
CONST_DECL for aggregate constants. */
|
CONST_DECL for aggregate constants. */
|
||||||
if (lval)
|
if (lval)
|
||||||
return t;
|
return t;
|
||||||
if (is_really_empty_class (TREE_TYPE (t)))
|
if (COMPLETE_TYPE_P (TREE_TYPE (t))
|
||||||
|
&& is_really_empty_class (TREE_TYPE (t)))
|
||||||
{
|
{
|
||||||
/* If the class is empty, we aren't actually loading anything. */
|
/* If the class is empty, we aren't actually loading anything. */
|
||||||
r = build_constructor (TREE_TYPE (t), NULL);
|
r = build_constructor (TREE_TYPE (t), NULL);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
// PR c++/72849
|
||||||
|
|
||||||
|
extern struct Foo a;
|
||||||
|
template <typename> void fn1() { a; }
|
||||||
Loading…
Reference in New Issue