From: Patrick Palka Date: Tue, 30 Apr 2024 01:14:18 +0000 (-0400) Subject: c++: ICE with templated sizeof(E1) / sizeof(E2) [PR114888] X-Git-Tag: basepoints/gcc-16~9497 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3900e944b0ac9db77380c5bb8635977dfd3b0691;p=thirdparty%2Fgcc.git c++: ICE with templated sizeof(E1) / sizeof(E2) [PR114888] In the sizeof / sizeof operator expression handling we're missing a dependence check for the second operand. PR c++/114888 gcc/cp/ChangeLog: * typeck.cc (cp_build_binary_op) : Add missing dependence check for the second sizeof operand. gcc/testsuite/ChangeLog: * g++.dg/template/sizeof19.C: New test. Reviewed-by: Jason Merrill --- diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc index e5a52dc2b39..a25f8622651 100644 --- a/gcc/cp/typeck.cc +++ b/gcc/cp/typeck.cc @@ -5501,6 +5501,7 @@ cp_build_binary_op (const op_location_t &location, if (!TYPE_P (type1)) type1 = TREE_TYPE (type1); if (type0 + && type1 && INDIRECT_TYPE_P (type0) && same_type_p (TREE_TYPE (type0), type1)) { diff --git a/gcc/testsuite/g++.dg/template/sizeof19.C b/gcc/testsuite/g++.dg/template/sizeof19.C new file mode 100644 index 00000000000..a1467995a9b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof19.C @@ -0,0 +1,8 @@ +// PR c++/114888 + +template +struct A { + struct B {} *b; + static const int c = sizeof (b) / sizeof (b[0]); +}; +const int d = A::c;