https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88110
Tobias Burnus <burnus at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target Milestone|--- |9.0
--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> ---
Fails at in today's g++ (trunk r266314 on x86_64-pc-linux-gnu) at:
Program received signal SIGSEGV, Segmentation fault.
cxx_eval_constant_expression(constexpr_ctx const*, tree_node*, bool, bool*,
bool*, tree_node**) ()
at ../../gcc/cp/constexpr.c:4834
4829 obj = TREE_OPERAND (obj, 0);
4830 tree objtype = TREE_TYPE (obj);
4831 /* Find the function decl in the virtual functions list. TOKEN
is
4832 the DECL_VINDEX that says which function we're looking for.
*/
4833 tree virtuals = BINFO_VIRTUALS (TYPE_BINFO (objtype));
4834 r = TREE_VALUE (chain_index (token, virtuals));
where
"token" == 1
and "obj":
<indirect_ref 0x7ffff2068ac0
type <record_type 0x7ffff20880a8 five readonly addressable tree_2
needs-constructing type_5 type_6 BLK
size <integer_cst 0x7ffff1f2ae40 constant 128>
unit-size <integer_cst 0x7ffff1f2ae58 constant 16>
align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff20880a8
fields <field_decl 0x7ffff2082720 D.2105 type <record_type
0x7ffff2081888 four>
ignored decl_6 BLK input17.ii:11:7
size <integer_cst 0x7ffff1f2adf8 constant 64>
unit-size <integer_cst 0x7ffff1f2ae10 constant 8>
align:64 warn_if_not_align:0 offset_align 128
offset <integer_cst 0x7ffff1f2ae28 constant 0>
bit-offset <integer_cst 0x7ffff1f2ae70 constant 0> context
<record_type 0x7ffff2081bd0 five> chain <field_decl 0x7ffff20827b8 D.2106>>
context <translation_unit_decl 0x7ffff1f37168 input17.ii>
full-name "const class five"
needs-constructor X() X(constX&) this=(X&) n_parents=2 use_template=0
interface-unknown
pointer_to_this <pointer_type 0x7ffff2088150>>
readonly
arg:0 <non_lvalue_expr 0x7ffff2068aa0
type <pointer_type 0x7ffff2088150 type <record_type 0x7ffff20880a8
five>
unsigned DI size <integer_cst 0x7ffff1f2adf8 64> unit-size
<integer_cst 0x7ffff1f2ae10 8>
align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff2088150>
arg:0 <parm_decl 0x7ffff1f53780 command type <pointer_type
0x7ffff2088150>
used unsigned read DI input17.ii:13:24 size <integer_cst
0x7ffff1f2adf8 64> unit-size <integer_cst 0x7ffff1f2ae10 8>
align:64 warn_if_not_align:0 context <function_decl 0x7ffff206fb00
setup>
arg-type <pointer_type 0x7ffff2088150>>>>
"TYPE_BINFO (objtype)" is:
(gdb) p debug_tree(obj->typed.type->type_non_common.maxval)
<tree_binfo 0x7ffff2086000
type <record_type 0x7ffff2081bd0 five addressable tree_2 needs-constructing
type_5 type_6 BLK
size <integer_cst 0x7ffff1f2ae40 constant 128>
unit-size <integer_cst 0x7ffff1f2ae58 constant 16>
align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff2081bd0
fields <field_decl 0x7ffff2082720 D.2105 type <record_type
0x7ffff2081888 four>
ignored decl_6 BLK input17.ii:11:7
size <integer_cst 0x7ffff1f2adf8 constant 64>
unit-size <integer_cst 0x7ffff1f2ae10 constant 8>
align:64 warn_if_not_align:0 offset_align 128
offset <integer_cst 0x7ffff1f2ae28 constant 0>
bit-offset <integer_cst 0x7ffff1f2ae70 constant 0> context
<record_type 0x7ffff2081bd0 five> chain <field_decl 0x7ffff20827b8 D.2106>>
context <translation_unit_decl 0x7ffff1f37168 input17.ii>
full-name "class five"
needs-constructor X() X(constX&) this=(X&) n_parents=2 use_template=0
interface-unknown
chain <type_decl 0x7ffff20825f0 five>>
private tree_2 bases:2 offset <integer_cst 0x7ffff1f2ae28 0> virtuals
<tree_list 0x7ffff2080460>>
And "virtuals" is:
(gdb) p debug_tree(obj->typed.type->type_non_common.maxval->binfo.virtuals)
<tree_list 0x7ffff2080460
purpose <integer_cst 0x7ffff1f4c198 type <integer_type 0x7ffff1f485e8 int>
constant 0>
value <function_decl 0x7ffff206f800 is_wavelength
type <method_type 0x7ffff206cbd0 type <integer_type 0x7ffff1f485e8 int>
QI
size <integer_cst 0x7ffff1f2aee8 constant 8>
unit-size <integer_cst 0x7ffff1f2af00 constant 1>
align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff206cbd0 method basetype <record_type 0x7ffff206c930 one>
arg-types <tree_list 0x7ffff2065ed8 value <pointer_type
0x7ffff206cc78>
chain <tree_list 0x7ffff1f3e848 value <void_type 0x7ffff1f48f18
void>>>>
public private external virtual QI input17.ii:2:15 align:16
warn_if_not_align:0 context <record_type 0x7ffff206c930 one>
full-name "virtual int one::is_wavelength() const"
chain <type_decl 0x7ffff20357b8 one type <record_type 0x7ffff206c9d8
one>
nonlocal decl_4 VOID input17.ii:1:11
align:1 warn_if_not_align:0 context <record_type 0x7ffff206c930
one> result <record_type 0x7ffff206c930 one>
>>>
and TREE_CHAIN(virtuals) alias chain_index (1 /* = token */, virtuals):
(gdb) p obj->typed.type->type_non_common.maxval->binfo.virtuals->common.chain
$13 = (tree) 0x0
Hence, TREE_VALUE (chain_index(1, virtuals) == TREE_VALUE(NULL_TREE) fails ...