+2004-12-12 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR tree-opt/18040
+ * expr.c (get_inner_reference): Remove NON_LVALUE_EXPR, NOP_EXPR,
+ CONVERT_EXPR cases.
+ (handled_component_p): Likewise.
+
2004-12-12 Kazu Hirata <kazu@cs.umass.edu>
* reg-stack.c (convert_regs_2): Free stack.
conversions that don't change the mode, and all view conversions
except those that need to "step up" the alignment. */
- case NON_LVALUE_EXPR:
- break;
-
- case NOP_EXPR:
- case CONVERT_EXPR:
- if (TYPE_MODE (TREE_TYPE (exp))
- != TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))
- goto done;
- break;
-
case VIEW_CONVERT_EXPR:
if ((TYPE_ALIGN (TREE_TYPE (exp))
> TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0))))
case COMPONENT_REF:
case ARRAY_REF:
case ARRAY_RANGE_REF:
- case NON_LVALUE_EXPR:
case VIEW_CONVERT_EXPR:
case REALPART_EXPR:
case IMAGPART_EXPR:
return 1;
- /* ??? Sure they are handled, but get_inner_reference may return
- a different PBITSIZE, depending upon whether the expression is
- wrapped up in a NOP_EXPR or not, e.g. for bitfields. */
- case NOP_EXPR:
- case CONVERT_EXPR:
- return (TYPE_MODE (TREE_TYPE (t))
- == TYPE_MODE (TREE_TYPE (TREE_OPERAND (t, 0))));
-
default:
return 0;
}
--- /dev/null
+// PR tree-opt/18040
+// { dg-do compile }
+// { dg-options "-O3" }
+
+int PyObject_IsTrue();
+struct object_base
+{
+ void ptr() const;
+ void ptr1() const;
+};
+struct object : public object_base
+{
+ typedef void (object::*bool_type)() const;
+ inline operator bool_type() const
+ { return PyObject_IsTrue()
+ ? &object_base::ptr : &object::ptr1; }
+};
+void f();
+void g (void)
+{
+ for (unsigned n = 0; n < 100; ++n)
+ {
+ object kv;
+ if (kv)
+ f();
+ }
+}
+