From: Jason Merrill Date: Tue, 9 Aug 2016 14:37:12 +0000 (-0400) Subject: PR c++/72849 - ICE with incomplete class. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f4fce1837cb18401b714379b7b18ede89b9d4fe5;p=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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7b746ca67fe..ffb0b85e003 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2016-08-09 Jason Merrill + 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 * typeck.c (cp_build_addr_expr_1): Remove special *this handling. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index e7cfabd4b59..8249d934229 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -8419,7 +8419,7 @@ is_really_empty_class (tree type) /* 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. */ - if (COMPLETE_TYPE_P (complete_type (type)) && is_empty_class (type)) + if (COMPLETE_TYPE_P (type) && is_empty_class (type)) return true; for (binfo = TYPE_BINFO (type), i = 0; diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index a65b817af88..20c870eafbd 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -3699,7 +3699,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, CONST_DECL for aggregate constants. */ if (lval) 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. */ r = build_constructor (TREE_TYPE (t), NULL); diff --git a/gcc/testsuite/g++.dg/template/incomplete7.C b/gcc/testsuite/g++.dg/template/incomplete7.C new file mode 100644 index 00000000000..80b3e7bf8bf --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete7.C @@ -0,0 +1,4 @@ +// PR c++/72849 + +extern struct Foo a; +template void fn1() { a; }