diff options
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/class.c | 2 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/incomplete7.C | 4 |
4 files changed, 12 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7b746ca..ffb0b85 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 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 * typeck.c (cp_build_addr_expr_1): Remove special *this handling. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index e7cfabd..8249d93 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 a65b817..20c870e 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 0000000..80b3e7b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete7.C @@ -0,0 +1,4 @@ +// PR c++/72849 + +extern struct Foo a; +template <typename> void fn1() { a; } |