Bug 100532 - ICE: tree check: expected class ‘type’, have ‘exceptional’ (error_mark) in useless_type_conversion_p, at gimple-expr.c:259
Summary: ICE: tree check: expected class ‘type’, have ‘exceptional’ (error_mark) in us...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: 12.0
: P3 normal
Target Milestone: 14.0
Assignee: Andrew Pinski
URL: https://gcc.gnu.org/pipermail/gcc-pat...
Keywords: error-recovery, ice-checking, ice-on-invalid-code, patch
: 101196 109597 111855 (view as bug list)
Depends on:
Blocks:
 
Reported: 2021-05-11 16:06 UTC by Chengnian Sun
Modified: 2023-10-19 16:52 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2021-05-12 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Chengnian Sun 2021-05-11 16:06:58 UTC
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.
Comment 1 Chengnian Sun 2021-05-11 16:10:14 UTC
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.
Comment 2 Andrew Pinski 2021-08-22 04:40:05 UTC
*** Bug 101196 has been marked as a duplicate of this bug. ***
Comment 3 H.J. Lu 2021-08-22 13:51:00 UTC
It isn't a GCC 12 regression. r10-0 has the same ICE. It was hidden on release
branches.
Comment 4 Jakub Jelinek 2022-05-06 08:30:37 UTC
GCC 12.1 is being released, retargeting bugs to GCC 12.2.
Comment 5 Richard Biener 2022-08-19 08:23:51 UTC
GCC 12.2 is being released, retargeting bugs to GCC 12.3.
Comment 6 Andrew Pinski 2023-04-23 03:01:21 UTC
*** Bug 109597 has been marked as a duplicate of this bug. ***
Comment 7 Andrew Pinski 2023-10-18 03:25:59 UTC
*** Bug 111855 has been marked as a duplicate of this bug. ***
Comment 8 Andrew Pinski 2023-10-19 05:30:25 UTC
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
Comment 9 Andrew Pinski 2023-10-19 15:39:23 UTC
Patch posted:
https://gcc.gnu.org/pipermail/gcc-patches/2023-October/633610.html
Comment 10 GCC Commits 2023-10-19 16:51:52 UTC
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.
Comment 11 Andrew Pinski 2023-10-19 16:52:25 UTC
Fixed.