diff options
author | Jason Merrill <jason@redhat.com> | 2019-04-03 16:09:17 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2019-04-03 16:09:17 -0400 |
commit | b8836dbec1a36eb3a00c789a4ed1e64ba28ee6fe (patch) | |
tree | 2d7e515d7d3bb8d8b8a27503153cb5124dc1de94 /gcc/cp | |
parent | bc53dee0baa3f3e06c89081ef01f506037acd1ff (diff) | |
download | gcc-b8836dbec1a36eb3a00c789a4ed1e64ba28ee6fe.zip gcc-b8836dbec1a36eb3a00c789a4ed1e64ba28ee6fe.tar.gz gcc-b8836dbec1a36eb3a00c789a4ed1e64ba28ee6fe.tar.bz2 |
PR c++/89331 - ICE with offsetof in incomplete class.
We were aborting when build_base_path returned an error because of the
derived class not being complete yet, which wasn't considered by the assert.
Fixed by checking for complete type first. The semantics.c change avoids
a duplicate error message.
* semantics.c (finish_offsetof): Handle error_mark_node.
* typeck.c (build_class_member_access_expr): Call
complete_type_or_maybe_complain before converting to base.
From-SVN: r270135
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 3 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 8 |
3 files changed, 16 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bb71913..a224517 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2019-04-03 Jason Merrill <jason@redhat.com> + PR c++/89331 - ICE with offsetof in incomplete class. + * semantics.c (finish_offsetof): Handle error_mark_node. + * typeck.c (build_class_member_access_expr): Call + complete_type_or_maybe_complain before converting to base. + PR c++/89917 - ICE with lambda in variadic mem-init. * pt.c (make_pack_expansion): Change type_pack_expansion_p to false. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index a08a2a5..408675b 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -4144,6 +4144,9 @@ finish_offsetof (tree object_ptr, tree expr, location_t loc) return expr; } + if (expr == error_mark_node) + return error_mark_node; + if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR) { error ("cannot apply %<offsetof%> to destructor %<~%T%>", diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index a00b0f4..56def14 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -2474,6 +2474,14 @@ build_class_member_access_expr (cp_expr object, tree member, tree binfo; base_kind kind; + /* We didn't complain above about a currently open class, but now we + must: we don't know how to refer to a base member before layout is + complete. But still don't complain in a template. */ + if (!dependent_type_p (object_type) + && !complete_type_or_maybe_complain (object_type, object, + complain)) + return error_mark_node; + binfo = lookup_base (access_path ? access_path : object_type, member_scope, ba_unique, &kind, complain); if (binfo == error_mark_node) |