------- Comment #3 from manu at gcc dot gnu dot org 2008-06-08 15:36 ------- Confirmed.
The relevant gimple dump is: int main(int, const char* const*) (D.2050, D.2051) { struct stringD.2032[0] * retval.0D.2067; struct stringD.2032[0] * D.2055; struct stringD.2032[0] * D.2056; long intD.5 D.2057; struct stringD.2032 * D.2070; struct stringD.2032 * retval.1D.2071; struct stringD.2032 * D.2061; struct stringD.2032 * D.2062; long intD.5 D.2063; long intD.5 D.2072; long unsigned intD.7 D.2073; intD.2 D.2076; struct stringD.2032 * x.2D.2081; [/home/manuel/src/pr35602.C : 27] { struct stringD.2032 xD.2054[0][0]; struct stringD.2032 yD.2060[0]; intD.2 zD.2066[0][0]; [/home/manuel/src/pr35602.C : 17] D.2055 = &xD.2054[0]; [/home/manuel/src/pr35602.C : 17] D.2056 = D.2055; [/home/manuel/src/pr35602.C : 17] D.2057 = -1; [/home/manuel/src/pr35602.C : 17] try { } catch { [/home/manuel/src/pr35602.C : 17] { register struct stringD.2032 * D.2058; [/home/manuel/src/pr35602.C : 17] if (D.2055 != 0B) { [/home/manuel/src/pr35602.C : 17] D.2058 = &(*D.2055)[0]; <D.2068>:; [/home/manuel/src/pr35602.C : 17] D.2070 = &(*D.2055)[0]; [/home/manuel/src/pr35602.C : 17] if (D.2058 == D.2070) { [/home/manuel/src/pr35602.C : 17] goto <D.2069>; } else { } [/home/manuel/src/pr35602.C : 17] D.2058 = D.2058 + -1; [/home/manuel/src/pr35602.C : 17] __comp_dtor (D.2058); [/home/manuel/src/pr35602.C : 17] goto <D.2068>; <D.2069>:; } else { } } } [/home/manuel/src/pr35602.C : 17] retval.0D.2067 = D.2055; However, the warning seems to be given by some bit_not_expr applied to long int, whose result is implicitly converted to unsigned long. I don't know why that is done at all. Also, I can't see how to dump that code and check what is going on here. -- manu at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2008-06-08 15:36:21 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35602