aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2009-09-17 11:11:58 +0000
committerMichael Matz <matz@gcc.gnu.org>2009-09-17 11:11:58 +0000
commit040c6d51daadf242937549fb7bc0e5a375fa1666 (patch)
tree6faf3b30da5c11513bde779849161da980479ec6 /gcc
parent0714aafa1fd25aa1524869f4284b752e1a0e3161 (diff)
downloadgcc-040c6d51daadf242937549fb7bc0e5a375fa1666.zip
gcc-040c6d51daadf242937549fb7bc0e5a375fa1666.tar.gz
gcc-040c6d51daadf242937549fb7bc0e5a375fa1666.tar.bz2
re PR middle-end/41347 (ICE with -O3 or '-O2 -finline-functions')
PR middle-end/41347 * tree.c (build_type_attribute_qual_variant): Export. * tree.h (build_type_attribute_qual_variant): Declare. * tree-inline.c (remap_type_1): Use it to build variants with the original qualifiers and attributes. testsuite/ * gfortran.dg/pr41347.f90: New test. From-SVN: r151799
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr41347.f9032
-rw-r--r--gcc/tree-inline.c8
-rw-r--r--gcc/tree.c2
-rw-r--r--gcc/tree.h1
6 files changed, 55 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6e4f28f..7a31855 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2009-09-17 Michael Matz <matz@suse.de>
+
+ PR middle-end/41347
+ * tree.c (build_type_attribute_qual_variant): Export.
+ * tree.h (build_type_attribute_qual_variant): Declare.
+ * tree-inline.c (remap_type_1): Use it to build variants with
+ the original qualifiers and attributes.
+
2009-09-17 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* cfglayout.c (fixup_reorder_chain): Accept conditional jumps
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1a24f25..691e328 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-09-17 Michael Matz <matz@suse.de>
+
+ PR middle-end/41347
+ * gfortran.dg/pr41347.f90: New test.
+
2009-09-17 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* gcc.c-torture/compile/20090917-1.c: New testcase.
diff --git a/gcc/testsuite/gfortran.dg/pr41347.f90 b/gcc/testsuite/gfortran.dg/pr41347.f90
new file mode 100644
index 0000000..ae48857
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr41347.f90
@@ -0,0 +1,32 @@
+! { dg-do compile }
+! { dg-options "-O3" }
+module hsl_ma41_m
+
+ implicit none
+
+ contains
+
+ subroutine solve_ma41
+ integer, dimension(20) :: info
+ call prininfo(15, info)
+ end subroutine solve_ma41
+
+ subroutine prininfo (ni, info)
+ integer, intent(in) :: ni
+ integer, intent(in), dimension(:) :: info
+
+ integer i
+
+ call prinfo
+
+ contains
+
+ subroutine prinfo
+ do i = 1, ni
+ write(*,'(i5,1x,i0)') i, info(i)
+ end do
+ end subroutine prinfo
+
+ end subroutine prininfo
+
+end module hsl_ma41_m
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 5ada378..feb7499 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -342,6 +342,10 @@ remap_type_1 (tree type, copy_body_data *id)
new_tree = build_pointer_type_for_mode (remap_type (TREE_TYPE (type), id),
TYPE_MODE (type),
TYPE_REF_CAN_ALIAS_ALL (type));
+ if (TYPE_ATTRIBUTES (type) || TYPE_QUALS (type))
+ new_tree = build_type_attribute_qual_variant (new_tree,
+ TYPE_ATTRIBUTES (type),
+ TYPE_QUALS (type));
insert_decl_map (id, type, new_tree);
return new_tree;
}
@@ -350,6 +354,10 @@ remap_type_1 (tree type, copy_body_data *id)
new_tree = build_reference_type_for_mode (remap_type (TREE_TYPE (type), id),
TYPE_MODE (type),
TYPE_REF_CAN_ALIAS_ALL (type));
+ if (TYPE_ATTRIBUTES (type) || TYPE_QUALS (type))
+ new_tree = build_type_attribute_qual_variant (new_tree,
+ TYPE_ATTRIBUTES (type),
+ TYPE_QUALS (type));
insert_decl_map (id, type, new_tree);
return new_tree;
}
diff --git a/gcc/tree.c b/gcc/tree.c
index d2243e5..846dd98 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4034,7 +4034,7 @@ iterative_hash_host_wide_int (HOST_WIDE_INT val, hashval_t val2)
Record such modified types already made so we don't make duplicates. */
-static tree
+tree
build_type_attribute_qual_variant (tree ttype, tree attribute, int quals)
{
if (! attribute_list_equal (TYPE_ATTRIBUTES (ttype), attribute))
diff --git a/gcc/tree.h b/gcc/tree.h
index 09ce8fa..afb1d42 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -3997,6 +3997,7 @@ extern tree make_tree (tree, rtx);
extern tree build_type_attribute_variant (tree, tree);
extern tree build_decl_attribute_variant (tree, tree);
+extern tree build_type_attribute_qual_variant (tree, tree, int);
/* Structure describing an attribute and a function to handle it. */
struct attribute_spec