@@ -8180,6 +8180,26 @@ gimplify_one_sizepos (tree *expr_p, gimp
*expr_p = unshare_expr (expr);
gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
+
+ /* Ensure we don't change an INTEGER_TYPE expression into e.g. ENUMERAL_TYPE
+ expression. */
+ if (TREE_CODE (TREE_TYPE (*expr_p)) != TREE_CODE (TREE_TYPE (expr)))
+ {
+ gcc_checking_assert (useless_type_conversion_p (TREE_TYPE (expr),
+ TREE_TYPE (*expr_p)));
+ if (TREE_CODE (*expr_p) == INTEGER_CST)
+ *expr_p = fold_convert (TREE_TYPE (expr), *expr_p);
+ else
+ {
+ tree var = create_tmp_var (TREE_TYPE (expr), NULL);
+ tree mod = build2 (INIT_EXPR, TREE_TYPE (var),
+ var, unshare_expr (*expr_p));
+ SET_EXPR_LOCATION (mod, EXPR_LOC_OR_HERE (*expr_p));
+ gimplify_and_add (mod, stmt_p);
+ ggc_free (mod);
+ *expr_p = var;
+ }
+ }
}
/* Gimplify the body of statements of FNDECL and return a GIMPLE_BIND node
@@ -0,0 +1,12 @@
+/* PR middle-end/55851 */
+
+enum { A = 1UL, B = -1UL } var = A;
+void foo (char *);
+
+void
+test (void)
+{
+ char vla[1][var];
+ vla[0][0] = 1;
+ foo (&vla[0][0]);
+}