aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2010-09-15 15:50:15 +0200
committerJanus Weil <janus@gcc.gnu.org>2010-09-15 15:50:15 +0200
commitedd2b56ab9ae8828d996a266d8819a0ff9e5d499 (patch)
tree2d36d040da2849e220509c62394c75c152699789
parentea395a11a35718e110d0ba783619207c9fd9d354 (diff)
downloadgcc-edd2b56ab9ae8828d996a266d8819a0ff9e5d499.zip
gcc-edd2b56ab9ae8828d996a266d8819a0ff9e5d499.tar.gz
gcc-edd2b56ab9ae8828d996a266d8819a0ff9e5d499.tar.bz2
re PR fortran/45577 (Bogus(?) "... type incompatible with source-expr ..." error)
2010-09-15 Janus Weil <janus@gcc.gnu.org> PR fortran/45577 * resolve.c (resolve_allocate_expr): Do default initialization via EXEC_INIT_ASSIGN. 2010-09-15 Janus Weil <janus@gcc.gnu.org> PR fortran/45577 * gfortran.dg/allocate_derived_4.f90: New. From-SVN: r164305
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/allocate_derived_4.f9019
4 files changed, 40 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index e7f79bd..10e4ce21 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2010-09-15 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/45577
+ * resolve.c (resolve_allocate_expr): Do default initialization via
+ EXEC_INIT_ASSIGN.
+
2010-09-11 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* mathbuiltins.def: Do not defined huge_val built-in.
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 90d80a7..2d5e04f 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -6697,10 +6697,16 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code)
if (ts.type == BT_CLASS)
ts = ts.u.derived->components->ts;
- if (ts.type == BT_DERIVED)
- {
- code->expr3 = gfc_default_initializer (&ts);
- gfc_resolve_expr (code->expr3);
+ if (ts.type == BT_DERIVED && gfc_has_default_initializer(ts.u.derived))
+ {
+ gfc_expr *init_e = gfc_default_initializer (&ts);
+ gfc_code *init_st = gfc_get_code ();
+ init_st->loc = code->loc;
+ init_st->op = EXEC_INIT_ASSIGN;
+ init_st->expr1 = gfc_expr_to_initialize (e);
+ init_st->expr2 = init_e;
+ init_st->next = code->next;
+ code->next = init_st;
}
}
else if (code->expr3->mold && code->expr3->ts.type == BT_DERIVED)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0aaea14..c67d3e3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-09-15 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/45577
+ * gfortran.dg/allocate_derived_4.f90: New.
+
2010-09-15 Tejas Belagod <tejas.belagod@arm.com>
* lib/target-supports.exp
diff --git a/gcc/testsuite/gfortran.dg/allocate_derived_4.f90 b/gcc/testsuite/gfortran.dg/allocate_derived_4.f90
new file mode 100644
index 0000000..06d1270
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/allocate_derived_4.f90
@@ -0,0 +1,19 @@
+! { dg-do compile }
+!
+! PR 45577: [4.6 Regression] Bogus(?) "... type incompatible with source-expr ..." error
+!
+! Contributed by Dominique d'Humieres <dominiq@lps.ens.fr>
+
+program main
+
+type b_obj
+ integer,allocatable :: c(:)
+ real :: r = 5.
+end type b_obj
+
+type (b_obj),allocatable :: b(:)
+integer,allocatable :: c(:)
+
+allocate(b(3),c(3))
+
+end program main