compiler: ensure evaluation order in type hash/eq functions
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 11 Jul 2019 21:37:33 +0000 (21:37 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 11 Jul 2019 21:37:33 +0000 (21:37 +0000)
commita8b9ee6feb54764859c6f113983255a6dec897d6
tree700087ff4d5e5444c05f3bb76d121ab61243e3ce
parentbee60edc26944d6993b3bfdca3a811d7a8c04e0f
compiler: ensure evaluation order in type hash/eq functions

    The type hash and equality functions are generated after the
    order_evaluations pass. They may contain shortcut operators and
    Set_and_use_temporary_expressions (e.g. from lowering a
    Binary_exprssion) that need to be ordered. Run order_evaluations
    and remove_shortcuts on these functions. (The hash functions
    may be fine, but to be on the safe side we run on them anyway.
    We do need to run on the equality functions.)

    A Set_and_use_temporary_expression is effectively an assignment,
    so it needs to be ordered. Otherwise if we insert a temporary
    statement before it, we may get wrong evaluation order.

    A test case is CL 185818.

    Fixes golang/go#33062.

    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/185817

From-SVN: r273425
gcc/go/gofrontend/MERGE
gcc/go/gofrontend/expressions.h
gcc/go/gofrontend/gogo.cc
gcc/go/gofrontend/gogo.h
gcc/go/gofrontend/types.cc