[gcc r12-7305] Fortran: improve check of pointer initialization in DATA statements
Harald Anlauf
anlauf@gcc.gnu.org
Sun Feb 20 21:35:55 GMT 2022
https://gcc.gnu.org/g:e49508ac6b36adb8a2056c5a1fb6e0178de2439d
commit r12-7305-ge49508ac6b36adb8a2056c5a1fb6e0178de2439d
Author: Harald Anlauf <anlauf@gmx.de>
Date: Wed Feb 9 21:54:29 2022 +0100
Fortran: improve check of pointer initialization in DATA statements
gcc/fortran/ChangeLog:
PR fortran/77693
* data.cc (gfc_assign_data_value): If a variable in a data
statement has the POINTER attribute, check for allowed initial
data target that is compatible with pointer assignment.
* gfortran.h (IS_POINTER): New macro.
gcc/testsuite/ChangeLog:
PR fortran/77693
* gfortran.dg/data_pointer_2.f90: New test.
Diff:
---
gcc/fortran/data.cc | 4 ++++
gcc/fortran/gfortran.h | 3 +++
gcc/testsuite/gfortran.dg/data_pointer_2.f90 | 21 +++++++++++++++++++++
3 files changed, 28 insertions(+)
diff --git a/gcc/fortran/data.cc b/gcc/fortran/data.cc
index f7c91437439..7a5866f3c28 100644
--- a/gcc/fortran/data.cc
+++ b/gcc/fortran/data.cc
@@ -618,6 +618,10 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index,
gfc_convert_type (expr, &lvalue->ts, 0);
}
+ if (IS_POINTER (symbol)
+ && !gfc_check_pointer_assign (lvalue, rvalue, false, true))
+ return false;
+
if (last_con == NULL)
symbol->value = expr;
else
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index cb136f875f4..f8fd1ba8b95 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -3897,6 +3897,9 @@ bool gfc_is_finalizable (gfc_symbol *, gfc_expr **);
&& CLASS_DATA (sym) \
&& CLASS_DATA (sym)->attr.dimension \
&& !CLASS_DATA (sym)->attr.class_pointer)
+#define IS_POINTER(sym) \
+ (sym->ts.type == BT_CLASS && sym->attr.class_ok && CLASS_DATA (sym) \
+ ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer)
/* frontend-passes.cc */
diff --git a/gcc/testsuite/gfortran.dg/data_pointer_2.f90 b/gcc/testsuite/gfortran.dg/data_pointer_2.f90
new file mode 100644
index 00000000000..e1677d1c3fb
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/data_pointer_2.f90
@@ -0,0 +1,21 @@
+! { dg-do compile }
+! { dg-options "-O -g" }
+! PR fortran/77693 - ICE in rtl_for_decl_init
+! Contributed by G.Steinmetz
+
+program p
+ implicit none
+ complex, target :: y = (1.,2.)
+ complex, target :: z(2) = (3.,4.)
+ complex, pointer :: a => y
+ complex, pointer :: b => z(1)
+ complex, pointer :: c, d, e
+ data c /NULL()/ ! Valid
+ data d /y/ ! Valid
+ data e /(1.,2.)/ ! { dg-error "Pointer assignment target" }
+ if (associated (a)) print *, a% re
+ if (associated (b)) print *, b% im
+ if (associated (c)) print *, c% re
+ if (associated (d)) print *, d% im
+ if (associated (e)) print *, e% re
+end
More information about the Gcc-cvs
mailing list