[patch.,fortran] PR102595 ICE in var_element, at fortran/decl.c

Message ID dbce44ba-6020-ee61-d657-5676a5432e79@gmail.com
State New
Headers
Series [patch.,fortran] PR102595 ICE in var_element, at fortran/decl.c |

Commit Message

Jerry D Jan. 21, 2023, 1:46 a.m. UTC
  A PARAMETER value is not allowed in a DATA statement, similar to an 
EQUIVALENCE.

The check for this was in gfc_assign_data_value() in data.cc which turns 
out to be too late when trying to assign a zero sized array.

To correct this, the check is moved to match_variable() in primary.cc 
where  a similar check for EQUIVALENCE is already being performed.

Regression tested on x86_64-linux-gnu.  I will create a test case from 
the case presented in the PR which is trivial.  There are already two 
other tests in the test suite that exercise this check.

OK for trunk?

Regards,

Jerry
  

Comments

Jerry D Jan. 21, 2023, 5:16 a.m. UTC | #1
On 1/20/23 5:46 PM, Jerry D wrote:
> A PARAMETER value is not allowed in a DATA statement, similar to an 
> EQUIVALENCE.
> 
> The check for this was in gfc_assign_data_value() in data.cc which turns 
> out to be too late when trying to assign a zero sized array.

Correction, the chunk in data.cc must remain for one test case. I 
spotted this after rerunning check-fortran for several variations.

Regards,

Jerry
  
Jerry D Jan. 21, 2023, 6:27 p.m. UTC | #2
On 1/20/23 9:16 PM, Jerry D wrote:
> On 1/20/23 5:46 PM, Jerry D wrote:
>> A PARAMETER value is not allowed in a DATA statement, similar to an 
>> EQUIVALENCE.
>>
>> The check for this was in gfc_assign_data_value() in data.cc which 
>> turns out to be too late when trying to assign a zero sized array.
> 
> Correction, the chunk in data.cc must remain for one test case. I 
> spotted this after rerunning check-fortran for several variations.
> 

Attached patch is revised to include a new test case and adjustment of 
an existing test case.  It also adds in a return MATCH_ERROR I 
accidentally left of the first submit when I was cleaning some things up.

Ok for Mainline?

Jeyy
  
Harald Anlauf Jan. 21, 2023, 7:14 p.m. UTC | #3
Hi Jerry,

Am 21.01.23 um 19:27 schrieb Jerry D via Gcc-patches:
> On 1/20/23 9:16 PM, Jerry D wrote:
>> On 1/20/23 5:46 PM, Jerry D wrote:
>>> A PARAMETER value is not allowed in a DATA statement, similar to an
>>> EQUIVALENCE.
>>>
>>> The check for this was in gfc_assign_data_value() in data.cc which
>>> turns out to be too late when trying to assign a zero sized array.
>>
>> Correction, the chunk in data.cc must remain for one test case. I
>> spotted this after rerunning check-fortran for several variations.
>>
>
> Attached patch is revised to include a new test case and adjustment of
> an existing test case.  It also adds in a return MATCH_ERROR I
> accidentally left of the first submit when I was cleaning some things up.
>
> Ok for Mainline?

the patch looks good to me, so ok for mainline.
But please provide a commit message next time.

Thanks,
Harald

>
> Jeyy
  

Patch

diff --git a/gcc/fortran/data.cc b/gcc/fortran/data.cc
index 443d35da9cf..d29eb12c1b1 100644
--- a/gcc/fortran/data.cc
+++ b/gcc/fortran/data.cc
@@ -244,13 +244,6 @@  gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index,
 		    "array-element nor a scalar-structure-component";
 
   symbol = lvalue->symtree->n.sym;
-  if (symbol->attr.flavor == FL_PARAMETER)
-    {
-      gfc_error ("PARAMETER %qs shall not appear in a DATA statement at %L",
-		 symbol->name, &lvalue->where);
-      return false;
-    }
-
   init = symbol->value;
   last_ts = &symbol->ts;
   last_con = NULL;
diff --git a/gcc/fortran/primary.cc b/gcc/fortran/primary.cc
index 543d9cc0de4..158f039f225 100644
--- a/gcc/fortran/primary.cc
+++ b/gcc/fortran/primary.cc
@@ -4076,6 +4076,11 @@  match_variable (gfc_expr **result, int equiv_flag, int host_flag)
 	  gfc_error ("Named constant at %C in an EQUIVALENCE");
 	  return MATCH_ERROR;
 	}
+      if (gfc_in_match_data())
+	{
+	  gfc_error ("PARAMETER %qs shall not appear in a DATA statement at %C",
+		      sym->name);
+	}
       /* Otherwise this is checked for and an error given in the
 	 variable definition context checks.  */
       break;