Might be a duplicate of PR 100525. $ gcc-trunk -v Using built-in specs. COLLECT_GCC=gcc-trunk COLLECT_LTO_WRAPPER=/scratch/software/gcc-trunk/libexec/gcc/x86_64-pc-linux-gnu/12.0.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: /tmp/tmp.FUbEknNORK-gcc-builder/gcc/configure --enable-languages=c,c++,lto --enable-checking-yes --enable-multiarch --prefix=/scratch/software/gcc-trunk --disable-bootstrap Thread model: posix Supported LTO compression algorithms: zlib gcc version 12.0.0 20210511 (experimental) [master revision :7db32cac8:aa891c56f25baac94db004e309d1b6e40b770a95] (GCC) $ cat mutant.c typedef __SIZE_TYPE__ size_t; void *memcpy(void[], const void *, size_t); c() { memcpy(c, "a", 2); } $ gcc-trunk mutant.c mutant.c:2:18: error: declaration of type name as array of voids 2 | void *memcpy(void[], const void *, size_t); | ^ mutant.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int] 3 | c() { memcpy(c, "a", 2); } | ^ mutant.c: In function ‘c’: mutant.c:3:14: error: type of formal parameter 1 is incomplete 3 | c() { memcpy(c, "a", 2); } | ^ mutant.c:3:7: internal compiler error: tree check: expected class ‘type’, have ‘exceptional’ (error_mark) in useless_type_conversion_p, at gimple-expr.c:259 3 | c() { memcpy(c, "a", 2); } | ^~~~~~ 0x7bce07 tree_class_check_failed(tree_node const*, tree_code_class, char const*, int, char const*) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/tree.c:8724 0x6cb4a3 tree_class_check(tree_node*, tree_code_class, char const*, int, char const*) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/tree.h:3479 0x6cb4a3 useless_type_conversion_p(tree_node*, tree_node*) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimple-expr.c:259 0xc2fc77 types_compatible_p /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimple-expr.h:67 0xc2fc77 gimplify_addr_expr /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:6246 0xc25d93 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:14130 0xc34d59 gimplify_call_expr /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:3446 0xc25d73 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:14055 0xc28f6a gimplify_stmt(tree_node**, gimple**) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:6877 0xc2979e gimplify_bind_expr /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:1421 0xc259d3 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:14284 0xc28f6a gimplify_stmt(tree_node**, gimple**) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:6877 0xc2a563 gimplify_body(tree_node*, bool) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:15328 0xc2a9b1 gimplify_function_tree(tree_node*) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:15482 0xa7e707 cgraph_node::analyze() /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/cgraphunit.c:670 0xa81611 analyze_functions /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/cgraphunit.c:1234 0xa820e1 symbol_table::finalize_compilation_unit() /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/cgraphunit.c:2508 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions.
Another duplicate. $ cat mutant.c void *memcpy(void[], const void *, __SIZE_TYPE__); f(x) { if (f) memcpy(x, x, x); } $ gcc-trunk mutant.c mutant.c:1:18: error: declaration of type name as array of voids 1 | void *memcpy(void[], const void *, __SIZE_TYPE__); | ^ mutant.c:2:1: warning: return type defaults to ‘int’ [-Wimplicit-int] 2 | f(x) { | ^ mutant.c: In function ‘f’: mutant.c:2:1: warning: type of ‘x’ defaults to ‘int’ [-Wimplicit-int] mutant.c:4:12: error: type of formal parameter 1 is incomplete 4 | memcpy(x, x, x); | ^ mutant.c:4:15: warning: passing argument 2 of ‘memcpy’ makes pointer from integer without a cast [-Wint-conversion] 4 | memcpy(x, x, x); | ^ | | | int mutant.c:1:22: note: expected ‘const void *’ but argument is of type ‘int’ 1 | void *memcpy(void[], const void *, __SIZE_TYPE__); | ^~~~~~~~~~~~ mutant.c:4:5: internal compiler error: tree check: expected class ‘type’, have ‘exceptional’ (error_mark) in useless_type_conversion_p, at gimple-expr.c:259 4 | memcpy(x, x, x); | ^~~~~~ 0x7bce07 tree_class_check_failed(tree_node const*, tree_code_class, char const*, int, char const*) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/tree.c:8724 0x6cb4a3 tree_class_check(tree_node*, tree_code_class, char const*, int, char const*) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/tree.h:3479 0x6cb4a3 useless_type_conversion_p(tree_node*, tree_node*) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimple-expr.c:259 0xc2fc77 types_compatible_p /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimple-expr.h:67 0xc2fc77 gimplify_addr_expr /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:6246 0xc25d93 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:14130 0xc34d59 gimplify_call_expr /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:3446 0xc25d73 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:14055 0xc28f6a gimplify_stmt(tree_node**, gimple**) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:6877 0xc2d4cb gimplify_cond_expr /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:4264 0xc25a77 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:14040 0xc28f6a gimplify_stmt(tree_node**, gimple**) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:6877 0xc2979e gimplify_bind_expr /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:1421 0xc259d3 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:14284 0xc28f6a gimplify_stmt(tree_node**, gimple**) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:6877 0xc2a563 gimplify_body(tree_node*, bool) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:15328 0xc2a9b1 gimplify_function_tree(tree_node*) /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/gimplify.c:15482 0xa7e707 cgraph_node::analyze() /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/cgraphunit.c:670 0xa81611 analyze_functions /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/cgraphunit.c:1234 0xa820e1 symbol_table::finalize_compilation_unit() /tmp/tmp.FUbEknNORK-gcc-builder/gcc/gcc/cgraphunit.c:2508 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions.
*** Bug 101196 has been marked as a duplicate of this bug. ***
It isn't a GCC 12 regression. r10-0 has the same ICE. It was hidden on release branches.
GCC 12.1 is being released, retargeting bugs to GCC 12.2.
GCC 12.2 is being released, retargeting bugs to GCC 12.3.
*** Bug 109597 has been marked as a duplicate of this bug. ***
*** Bug 111855 has been marked as a duplicate of this bug. ***
Maybe the simple fix: diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index 6e044b4afbc..8f8562936dc 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -3367,7 +3367,7 @@ convert_argument (location_t ploc, tree function, tree fundecl, { error_at (ploc, "type of formal parameter %d is incomplete", parmnum + 1); - return val; + return error_mark_node; } /* Optionally warn about conversions that differ from the default
Patch posted: https://gcc.gnu.org/pipermail/gcc-patches/2023-October/633610.html
The trunk branch has been updated by Andrew Pinski <pinskia@gcc.gnu.org>: https://gcc.gnu.org/g:2454ba9e2d1ce2d1b9b2b46f6111e022364bf9b5 commit r14-4759-g2454ba9e2d1ce2d1b9b2b46f6111e022364bf9b5 Author: Andrew Pinski <pinskia@gmail.com> Date: Thu Oct 19 05:42:02 2023 +0000 c: Fix ICE when an argument was an error mark [PR100532] In the case of convert_argument, we would return the same expression back rather than error_mark_node after the error message about trying to convert to an incomplete type. This causes issues in the gimplfier trying to see if another conversion is needed. The code here dates back to before the revision history too so it might be the case it never noticed we should return an error_mark_node. Bootstrapped and tested on x86_64-linux-gnu with no regressions. PR c/100532 gcc/c/ChangeLog: * c-typeck.cc (convert_argument): After erroring out about an incomplete type return error_mark_node. gcc/testsuite/ChangeLog: * gcc.dg/pr100532-1.c: New test.
Fixed.