aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Uecker <uecker@tugraz.at>2024-06-29 15:36:18 +0200
committerMartin Uecker <uecker@gcc.gnu.org>2024-07-09 21:05:26 +0200
commit592a746533a278a5fd3e7b5dff004e1846ef26a4 (patch)
tree28dce17004e5a5f591515be582de2fc3ed52b009 /gcc
parente611189899bb885a27ef8d17f77c02ada6c69069 (diff)
downloadgcc-592a746533a278a5fd3e7b5dff004e1846ef26a4.zip
gcc-592a746533a278a5fd3e7b5dff004e1846ef26a4.tar.gz
gcc-592a746533a278a5fd3e7b5dff004e1846ef26a4.tar.bz2
c: Fix ICE for incorrect code in comptypes_verify [PR115696]
The new verification code produces an ICE for incorrect code. Add the same logic as already used in comptypes to to bail out under certain conditions. PR c/115696 gcc/c/ * c-typeck.cc (comptypes_verify): Bail out for identical, empty, and erroneous input types. gcc/testsuite/ * gcc.dg/pr115696.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c/c-typeck.cc4
-rw-r--r--gcc/testsuite/gcc.dg/pr115696.c7
2 files changed, 11 insertions, 0 deletions
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index ffcab7d..e486ac0 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -1175,6 +1175,10 @@ common_type (tree t1, tree t2)
static bool
comptypes_verify (tree type1, tree type2)
{
+ if (type1 == type2 || !type1 || !type2
+ || TREE_CODE (type1) == ERROR_MARK || TREE_CODE (type2) == ERROR_MARK)
+ return true;
+
if (TYPE_CANONICAL (type1) != TYPE_CANONICAL (type2)
&& !TYPE_STRUCTURAL_EQUALITY_P (type1)
&& !TYPE_STRUCTURAL_EQUALITY_P (type2))
diff --git a/gcc/testsuite/gcc.dg/pr115696.c b/gcc/testsuite/gcc.dg/pr115696.c
new file mode 100644
index 0000000..50b8ebc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr115696.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-Wno-implicit-int" } */
+
+a(); /* { dg-warning "no type or storage" } */
+a; /* { dg-error "redeclared" } */
+ /* { dg-warning "no type or storage" "" { target *-*-* } .-1 } */
+a(); /* { dg-warning "no type or storage" } */