The invalid case in this PR trips on an assertion in build_class_member_access_expr that build_base_path would never return an error_mark_node, which is actually incorrect if the object involves a tree with an error_mark_node DECL_INITIAL, like here.
This patch simply removes the assertion, even though it has been here for 22+ years (r0-44513-g50ad96428042fa). An alternative would be to assert that object != error_mark_node || seen_error (), but that'd be virtually not asserting anything IMO. Successfully tested on x86_64-pc-linux-gnu. PR c++/118225 gcc/cp/ChangeLog: * typeck.cc (build_class_member_access_expr): Remove incorrect gcc_assert. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-ice21.C: New test. --- gcc/cp/typeck.cc | 3 --- gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc index 1f9a74166f4..14912254c9c 100644 --- a/gcc/cp/typeck.cc +++ b/gcc/cp/typeck.cc @@ -2978,9 +2978,6 @@ build_class_member_access_expr (cp_expr object, tree member, /* Convert to the base. */ object = build_base_path (PLUS_EXPR, object, binfo, /*nonnull=*/1, complain); - /* If we found the base successfully then we should be able - to convert to it successfully. */ - gcc_assert (object != error_mark_node); } /* If MEMBER is from an anonymous aggregate, we have converted diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C new file mode 100644 index 00000000000..46273654f24 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C @@ -0,0 +1,17 @@ +// PR c++/118225 +// { dg-do "compile" { target c++11} } + +struct NoMut1 { int a, b; }; +struct NoMut3 : virtual NoMut1 { + constexpr NoMut3(int a, int b) // { dg-error "virtual base" "" { target c++23 } } + : NoMut1{a, b} + {} // { dg-error "virtual base" } +}; +void mutable_subobjects() { + constexpr NoMut3 nm3 = {1, 2}; // { dg-error "call to non" } + struct A { + void f() { + static_assert(nm3.a == 1, ""); // { dg-error "local variable" } + } + }; +} -- 2.44.0