From 1b24a790e0f4443ebbe19977f66378f60b059269 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 24 Mar 2008 15:08:52 +0000 Subject: [PATCH] re PR c/22371 (C front-end produces mis-match types in MODIFY_EXPR) 2008-03-24 Richard Guenther PR c/22371 * gimplify.c (gimplify_modify_expr): For frontend type-correct pointer assignments change conversions according to middle-end rules. (gimplify_modify_expr_rhs): Deal with NULL TARGET_EXPR_INITIAL. * configure.ac: Include type checking in yes. * configure: Regenerate. From-SVN: r133479 --- gcc/ChangeLog | 9 +++++++++ gcc/configure | 2 +- gcc/configure.ac | 2 +- gcc/gimplify.c | 14 +++++++++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fd9ef602365..a1ab32856eb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2008-03-24 Richard Guenther + + PR c/22371 + * gimplify.c (gimplify_modify_expr): For frontend type-correct + pointer assignments change conversions according to middle-end rules. + (gimplify_modify_expr_rhs): Deal with NULL TARGET_EXPR_INITIAL. + * configure.ac: Include type checking in yes. + * configure: Regenerate. + 2008-03-24 Manuel Lopez-Ibanez * diagnostic.c (diagnostic_count_diagnostic): Delete. diff --git a/gcc/configure b/gcc/configure index 454e71a974d..1be527276b9 100755 --- a/gcc/configure +++ b/gcc/configure @@ -6439,7 +6439,7 @@ do ac_gc_always_collect= ; ac_rtl_checking= ; ac_rtlflag_checking=1 ; ac_runtime_checking=1 ; ac_tree_checking=1 ; ac_valgrind_checking= ; - ac_types_checking= ;; + ac_types_checking=1 ;; no|none) ac_assert_checking= ; ac_checking= ; ac_df_checking= ; ac_fold_checking= ; ac_gc_checking= ; ac_gc_always_collect= ; ac_rtl_checking= ; diff --git a/gcc/configure.ac b/gcc/configure.ac index 2b3b4ea8c9c..b4a1744b0ef 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -367,7 +367,7 @@ do ac_gc_always_collect= ; ac_rtl_checking= ; ac_rtlflag_checking=1 ; ac_runtime_checking=1 ; ac_tree_checking=1 ; ac_valgrind_checking= ; - ac_types_checking= ;; + ac_types_checking=1 ;; no|none) ac_assert_checking= ; ac_checking= ; ac_df_checking= ; ac_fold_checking= ; ac_gc_checking= ; ac_gc_always_collect= ; ac_rtl_checking= ; diff --git a/gcc/gimplify.c b/gcc/gimplify.c index acdfb994960..4b084e445a8 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -3599,7 +3599,8 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p, references somehow. */ tree init = TARGET_EXPR_INITIAL (*from_p); - if (!VOID_TYPE_P (TREE_TYPE (init))) + if (init + && !VOID_TYPE_P (TREE_TYPE (init))) { *from_p = init; ret = GS_OK; @@ -3870,6 +3871,17 @@ gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value) || TREE_CODE (*expr_p) == GIMPLE_MODIFY_STMT || TREE_CODE (*expr_p) == INIT_EXPR); + /* Insert pointer conversions required by the middle-end that are not + required by the frontend. This fixes middle-end type checking for + for example gcc.dg/redecl-6.c. */ + if (POINTER_TYPE_P (TREE_TYPE (*to_p)) + && lang_hooks.types_compatible_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p))) + { + STRIP_USELESS_TYPE_CONVERSION (*from_p); + if (!useless_type_conversion_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p))) + *from_p = fold_convert (TREE_TYPE (*to_p), *from_p); + } + /* See if any simplifications can be done based on what the RHS is. */ ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p, want_value); -- 2.30.2