This fixes PR53790 - with MEM_REF you can get base decls of
incomplete type.  Deal with that.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied
everywhere.

Richard.

2012-06-28  Richard Guenther  <rguent...@suse.de>

        PR middle-end/53790
        * expr.c (expand_expr_real_1): Verify if the type is complete
        before inspecting its size.

        * gcc.dg/torture/pr53790.c: New testcase.

Index: gcc/expr.c
===================================================================
*** gcc/expr.c  (revision 189041)
--- gcc/expr.c  (working copy)
*************** expand_expr_real_1 (tree exp, rtx target
*** 9832,9837 ****
--- 9832,9838 ----
        orig_op0 = op0
          = expand_expr (tem,
                         (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
+                         && COMPLETE_TYPE_P (TREE_TYPE (tem))
                          && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
                              != INTEGER_CST)
                          && modifier != EXPAND_STACK_PARM
Index: gcc/testsuite/gcc.dg/torture/pr53790.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr53790.c      (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr53790.c      (working copy)
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile } */
+ 
+ typedef struct s {
+     int value;
+ } s_t;
+ 
+ static inline int 
+ read(s_t const *var)
+ {
+   return var->value;
+ }
+ 
+ int main()
+ {
+   extern union u extern_var;
+   return read((s_t *)&extern_var);
+ }

Reply via email to