[go: nahoru, domu]

Bug 107516 - [11/12/13/14/15 Regression] ICE with -fwide-exec-charset=latin1 since r9-2891-g5ec9f8cff333bbe9
Summary: [11/12/13/14/15 Regression] ICE with -fwide-exec-charset=latin1 since r9-2891...
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 13.0
: P2 normal
Target Milestone: 11.5
Assignee: Not yet assigned to anyone
URL:
Keywords: ice-checking, ice-on-valid-code
Depends on:
Blocks:
 
Reported: 2022-11-03 11:15 UTC by Jonathan Wakely
Modified: 2024-04-26 10:48 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2022-11-21 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jonathan Wakely 2022-11-03 11:15:46 UTC
Compiling the attached code with -std=gnu++20 -fwide-exec-charset=latin1 gives an ICE with trunk. GCC 12 doesn't ICE, but maybe it's a --enable-checking=release thing (no ICE even with -fchecking=3 though).



tmp$ ~/gcc/12.1/bin/g++ -std=c++20  suffix.cc -fwide-exec-charset=latin1 
tmp$ ~/gcc/13/bin/g++ -std=c++20  suffix.cc -fwide-exec-charset=latin1 -freport-bug
during RTL pass: expand
suffix.cc: In function ‘auto __units_suffix() [with _Period = std::ratio<1, 1000>; _CharT = wchar_t]’:
suffix.cc:97:22: internal compiler error: in get_constant_size, at varasm.cc:3418
   97 |               return L##suffix;                         \
      |                      ^
suffix.cc:106:11: note: in expansion of macro ‘_GLIBCXX_UNITS_SUFFIX’
  106 |           _GLIBCXX_UNITS_SUFFIX(milli, "ms")
      |           ^~~~~~~~~~~~~~~~~~~~~
0x8a6410 get_constant_size
        /home/jwakely/src/gcc/gcc/gcc/varasm.cc:3418
0x1519a88 assemble_constant_contents
        /home/jwakely/src/gcc/gcc/gcc/varasm.cc:3615
0x151af15 output_constant_def_contents
        /home/jwakely/src/gcc/gcc/gcc/varasm.cc:3666
0x151b264 maybe_output_constant_def_contents
        /home/jwakely/src/gcc/gcc/gcc/varasm.cc:3602
0x151b264 output_constant_def(tree_node*, int)
        /home/jwakely/src/gcc/gcc/gcc/varasm.cc:3568
0xe23b2e expand_expr_constant
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:8592
0xe23b2e expand_expr_addr_expr_1
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:8619
0xe24169 expand_expr_addr_expr
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:8812
0xe19464 expand_expr_real_1(tree_node*, rtx_def*, machine_mode, expand_modifier, rtx_def**, bool)
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:12096
0xe26825 store_expr(tree_node*, rtx_def*, int, bool, bool)
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:6330
0xe28090 expand_assignment(tree_node*, tree_node*, bool)
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:6051
0xcf589c expand_gimple_stmt_1
        /home/jwakely/src/gcc/gcc/gcc/cfgexpand.cc:3946
0xcf589c expand_gimple_stmt
        /home/jwakely/src/gcc/gcc/gcc/cfgexpand.cc:4044
0xcfc0ce expand_gimple_basic_block
        /home/jwakely/src/gcc/gcc/gcc/cfgexpand.cc:6096
0xcfdbe7 execute
        /home/jwakely/src/gcc/gcc/gcc/cfgexpand.cc:6822
Please submit a full bug report, with preprocessed source.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
Preprocessed source stored into /tmp/ccsLQGSo.out file, please attach this to your bugreport.
Comment 1 Jonathan Wakely 2022-11-03 11:23:26 UTC
Maybe a similar issue to PR 81050, i.e. Latin1 isn't valid as a wide charset. In which case, we should give an error instead of ICE if possible.


Reduced to remove library headers and C++20 features:

template<typename, typename> constexpr bool is_same_v = false;
template<typename T> constexpr bool is_same_v<T,T> = true;

template<typename CharT>
auto
units_suffix() noexcept
{
  if constexpr (is_same_v<CharT, wchar_t>)
    return L"ms";
  else
    return "ms";
}

int main()
{
  units_suffix<wchar_t>();
}


during RTL pass: expand
ice.cc: In function ‘auto units_suffix() [with CharT = wchar_t]’:
ice.cc:9:12: internal compiler error: in get_constant_size, at varasm.cc:3418
    9 |     return L"ms";
      |            ^~~~~
0x8a6410 get_constant_size
        /home/jwakely/src/gcc/gcc/gcc/varasm.cc:3418
0x1519a88 assemble_constant_contents
        /home/jwakely/src/gcc/gcc/gcc/varasm.cc:3615
0x151af15 output_constant_def_contents
        /home/jwakely/src/gcc/gcc/gcc/varasm.cc:3666
0x151b264 maybe_output_constant_def_contents
        /home/jwakely/src/gcc/gcc/gcc/varasm.cc:3602
0x151b264 output_constant_def(tree_node*, int)
        /home/jwakely/src/gcc/gcc/gcc/varasm.cc:3568
0xe23b2e expand_expr_constant
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:8592
0xe23b2e expand_expr_addr_expr_1
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:8619
0xe24169 expand_expr_addr_expr
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:8812
0xe19464 expand_expr_real_1(tree_node*, rtx_def*, machine_mode, expand_modifier, rtx_def**, bool)
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:12096
0xe26825 store_expr(tree_node*, rtx_def*, int, bool, bool)
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:6330
0xe28090 expand_assignment(tree_node*, tree_node*, bool)
        /home/jwakely/src/gcc/gcc/gcc/expr.cc:6051
0xcf589c expand_gimple_stmt_1
        /home/jwakely/src/gcc/gcc/gcc/cfgexpand.cc:3946
0xcf589c expand_gimple_stmt
        /home/jwakely/src/gcc/gcc/gcc/cfgexpand.cc:4044
0xcfc0ce expand_gimple_basic_block
        /home/jwakely/src/gcc/gcc/gcc/cfgexpand.cc:6096
0xcfdbe7 execute
        /home/jwakely/src/gcc/gcc/gcc/cfgexpand.cc:6822
Please submit a full bug report, with preprocessed source (by using -freport-bug).
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.




And this does ICE "gcc version 12.0.1 20220316 (experimental) (GCC)" so it probably is due to checking.
Comment 2 Martin Liška 2022-11-21 12:56:22 UTC
Started with r9-2891-g5ec9f8cff333bbe9.
Comment 3 Richard Biener 2023-01-13 12:35:20 UTC
3416      size = int_size_in_bytes (TREE_TYPE (exp));
3417      gcc_checking_assert (size >= 0);
3418      gcc_checking_assert (TREE_CODE (exp) != STRING_CST
3419                           || size >= TREE_STRING_LENGTH (exp));
(gdb) p size
$1 = 4
(gdb) p exp->string.length
$3 = 6
(gdb) p debug_tree (exp)
 <string_cst 0x7ffff6408b80
    type <array_type 0x7ffff6428150
        type <integer_type 0x7ffff6428000 wchar_t readonly type_6 SI
            size <integer_cst 0x7ffff628b210 constant 32>
            unit-size <integer_cst 0x7ffff628b228 constant 4>
            align:32 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff6428000 precision:32 min <integer_cst 0x7ffff628b5d0 -2147483648> max <integer_cst 0x7ffff628b5e8 2147483647>
            pointer_to_this <pointer_type 0x7ffff6428888>>
        type_6 SI size <integer_cst 0x7ffff628b210 32> unit-size <integer_cst 0x7ffff628b228 4>
        align:32 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff6428150
        domain <integer_type 0x7ffff6294d20 type <integer_type 0x7ffff6289000 sizetype>
            type_6 DI
            size <integer_cst 0x7ffff6266fc0 constant 64>
            unit-size <integer_cst 0x7ffff6266fd8 constant 8>
            align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff6294d20 precision:64 min <integer_cst 0x7ffff628b000 0> max <integer_cst 0x7ffff628b000 0>>
        pointer_to_this <pointer_type 0x7ffff6428a80>>
    readonly constant asm_written static "ms\000\000\000\000">
(gdb) p debug_generic_expr (0x7ffff6428150)
const wchar_t[1]

Bernd - I see it as us having an excess 2-byte nul terminator?
Comment 4 Jakub Jelinek 2023-01-13 12:40:13 UTC
The assumption is that for wide charsets each char is either a wchar_t or multiple wchar_t, so I think such option is invalid; though not really sure how we could find that out and diagnose, iconv doesn't announce such details, for iconv everything is a series of bytes...
Comment 5 Richard Biener 2023-07-07 10:44:19 UTC
GCC 10 branch is being closed.