diff mbox

[Fortran] PR 80668: wrong error message with -finit-derived

Message ID CAE4aFAk7+7C4PSpUtny8eZ9nLUR8+8v1Y0xcMYQFyURp+nWgDw@mail.gmail.com
State New
Headers show

Commit Message

Fritz Reese May 9, 2017, 4:15 p.m. UTC
> (1) you don’t need the lines (as in "please don’t use them")
>
> +
> +! { dg-final { cleanup-modules "pr80668" } }

I will remove the "dg-final" lines.

>
> (2) I don’t understand the comments after 'INTEGER,DIMENSION(:),POINTER :: dist’.

(2) Sorry, the comments were meant to show the error that would appear
if the testcase is regressed; i.e., the error that appeared in the
original PR report. If it is too esoteric I can just remove the
comments.

Version 2 attached. OK?

---
Fritz Reese


2017-05-09  Fritz Reese <fritzoreese@gmail.com>

    PR fortran/80668

    gcc/fortran/ChangeLog:

        PR fortran/80668
        * expr.c (component_initializer): Don't generate initializers for
        pointer components.
        * invoke.texi (-finit-derived): Document.

    gcc/testsuite/ChangeLog:

        PR fortran/80668
        * gfortran.dg/pr80668.f90: New.

Comments

Dominique d'Humières May 9, 2017, 4:28 p.m. UTC | #1
> Le 9 mai 2017 à 18:15, Fritz Reese <fritzoreese@gmail.com> a écrit :
> 
>> (1) you don’t need the lines (as in "please don’t use them")
>> 
>> +
>> +! { dg-final { cleanup-modules "pr80668" } }
> 
> I will remove the "dg-final" lines.
> 
>> 
>> (2) I don’t understand the comments after 'INTEGER,DIMENSION(:),POINTER :: dist’.
> 
> (2) Sorry, the comments were meant to show the error that would appear
> if the testcase is regressed; i.e., the error that appeared in the
> original PR report. If it is too esoteric I can just remove the
> comments.
> 
> Version 2 attached. OK?
> 
> ---
> Fritz Reese
> 

OK for me.

Dominique
diff mbox

Patch

From 10a0bdcf222db45208242d0530bc2c69530787c0 Mon Sep 17 00:00:00 2001
From: Fritz Reese <fritzoreese@gmail.com>
Date: Tue, 9 May 2017 12:13:06 -0400
Subject: [PATCH] 2017-05-09  Fritz Reese  <fritzoreese@gmail.com>

	PR fortran/80668
	gcc/fortran/
	* expr.c (component_initializer): Don't generate initializers for
	pointer components.
	* invoke.texi (-finit-derived): Document.

	PR fortran/80668
	* gcc/testsuite/gfortran.dg/pr80668.f90: New.
---
 gcc/fortran/expr.c                    |  8 ++++++--
 gcc/fortran/invoke.texi               |  2 ++
 gcc/testsuite/gfortran.dg/pr80668.f90 | 29 +++++++++++++++++++++++++++++
 3 files changed, 37 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/pr80668.f90

diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index c8be9513af5..7ea9d8233a9 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -4280,9 +4280,13 @@  component_initializer (gfc_typespec *ts, gfc_component *c, bool generate)
 {
   gfc_expr *init = NULL;
 
-  /* See if we can find the initializer immediately.  */
+  /* See if we can find the initializer immediately.
+     Some components should never get initializers.  */
   if (c->initializer || !generate
-      || (ts->type == BT_CLASS && !c->attr.allocatable))
+      || (ts->type == BT_CLASS && !c->attr.allocatable)
+      || c->attr.pointer
+      || c->attr.class_pointer
+      || c->attr.proc_pointer)
     return c->initializer;
 
   /* Recursively handle derived type components.  */
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 636432fead8..8a1d09dd5e5 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -1665,6 +1665,8 @@  according to these flags only with @option{-finit-derived}.  These options do
 not initialize
 @itemize @bullet
 @item
+objects with the POINTER attribute
+@item
 allocatable arrays
 @item
 variables that appear in an @code{EQUIVALENCE} statement.
diff --git a/gcc/testsuite/gfortran.dg/pr80668.f90 b/gcc/testsuite/gfortran.dg/pr80668.f90
new file mode 100644
index 00000000000..63bd0d3d5cd
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr80668.f90
@@ -0,0 +1,29 @@ 
+! { dg-do compile }
+! { dg-options "-finit-derived -finit-integer=12345678" }
+!
+! PR fortran/80668
+!
+! Test a regression where structure constructor expressions were created for
+! POINTER components with -finit-derived.
+!
+
+MODULE pr80668
+  IMPLICIT NONE
+  TYPE :: dist_t
+     INTEGER :: TYPE,nblks_loc,nblks
+     INTEGER,DIMENSION(:),POINTER :: dist
+  END TYPE dist_t
+
+CONTAINS
+
+  SUBROUTINE hfx_new()
+    TYPE(dist_t)                             :: dist
+    integer,pointer :: bob
+    CALL release_dist(dist, bob)
+  END SUBROUTINE hfx_new
+
+  SUBROUTINE release_dist(dist,p)
+    TYPE(dist_t)                             :: dist
+    integer, pointer, intent(in) :: p
+  END SUBROUTINE release_dist
+END MODULE
-- 
2.12.2