Message ID | 20240429142819.3078305-1-ppalka@redhat.com |
---|---|
State | New |
Headers | show |
Series | c++: ICE with templated sizeof(E1) / sizeof(E2) [PR114888] | expand |
On Mon, Apr 29, 2024 at 10:28:19AM -0400, Patrick Palka wrote: > Lightly tested on x86_64-pc-linux-gnu so far, does this look OK for > trunk/14.1 after bootstrap+regtest finishes? LGTM. > -- >8 -- > > We're missing a dependence check for the second operand in the > sizeof / sizeof handling. > > PR c++/114888 > > gcc/cp/ChangeLog: > > * typeck.cc (cp_build_binary_op) <case *_DIV_*>: Add missing > dependence check for the second sizeof operand. > > gcc/testsuite/ChangeLog: > > * g++.dg/template/sizeof19.C: New test. > --- > gcc/cp/typeck.cc | 1 + > gcc/testsuite/g++.dg/template/sizeof19.C | 8 ++++++++ > 2 files changed, 9 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/template/sizeof19.C > > 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<class> > +struct A { > + struct B {} *b; > + static const int c = sizeof (b) / sizeof (b[0]); > +}; > +const int d = A<int>::c; > -- > 2.45.0.rc1 > Marek
On 4/29/24 07:52, Marek Polacek wrote: > On Mon, Apr 29, 2024 at 10:28:19AM -0400, Patrick Palka wrote: >> Lightly tested on x86_64-pc-linux-gnu so far, does this look OK for >> trunk/14.1 after bootstrap+regtest finishes? > > LGTM. Yes, OK. >> -- >8 -- >> >> We're missing a dependence check for the second operand in the >> sizeof / sizeof handling. >> >> PR c++/114888 >> >> gcc/cp/ChangeLog: >> >> * typeck.cc (cp_build_binary_op) <case *_DIV_*>: Add missing >> dependence check for the second sizeof operand. >> >> gcc/testsuite/ChangeLog: >> >> * g++.dg/template/sizeof19.C: New test. >> --- >> gcc/cp/typeck.cc | 1 + >> gcc/testsuite/g++.dg/template/sizeof19.C | 8 ++++++++ >> 2 files changed, 9 insertions(+) >> create mode 100644 gcc/testsuite/g++.dg/template/sizeof19.C >> >> 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<class> >> +struct A { >> + struct B {} *b; >> + static const int c = sizeof (b) / sizeof (b[0]); >> +}; >> +const int d = A<int>::c; >> -- >> 2.45.0.rc1 >> > > Marek >
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<class> +struct A { + struct B {} *b; + static const int c = sizeof (b) / sizeof (b[0]); +}; +const int d = A<int>::c;