Reported by Kyle Horne at http://gcc.gnu.org/ml/fortran/2010-04/msg00215.html
There is a missing temporary for user-defined operators: type(polar_t),dimension(3)::b b = polar_t(1.0,0.5) b(:) = b(:)/b(1) The latter is translated into: struct polar_t * D.1551; D.1551 = &b[0]; S.5 = 1; while (1) { if (S.5 > 3) goto L.3; b[S.5 + -1] = div_pp (&b[S.5 + -1], D.1551); S.5 = S.5 + 1; } L.3:; but that fails as one overrides *D.1551 alias b[0] alias B(1) in the first iteration instead of evaluating first all of the RHS before assigning to the LHS. Work with ifort and NAG, fails with GCC 4.1, 4.2, 4.3, 4.4, 4.5, and 4.6 -- Summary: Wrong-code due to missing temporary with user-defined operatator Product: gcc Version: 4.5.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: fortran AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: burnus at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43843