Re: [PATCH] Fortran: different character lengths in array constructor [PR93289]

2025-02-01 Thread Harald Anlauf

Am 01.02.25 um 21:49 schrieb Harald Anlauf:

So why must we be so tough?


Here's what I get from other compilers:

Intel, Nvidia, AMD flang: silent by default.

ifx -stand f18:

char_array_constructor_5.f90(11): warning #8208: If type specification
is omitted, each ac-value expression  in the array constructor of type
CHARACTER must have the same length type parameters.   ['ab']
print *, [str, "ab", "hjf333"]  ! { dg-warning "must have the same length" }
---^

So no error, but Intel is known to often be on the loose side.

NAG: hard error.

That's what we get with -std=f*, too.



[PATCH] Fortran: different character lengths in array constructor [PR93289]

2025-02-01 Thread Harald Anlauf

Dear all,

the attached patch downgrades different constant character lengths in an
array constructor from a GNU to a legacy extension, so that users get a
warning with -std=gnu.  We continue to generate an error when standard
conformance is requested.

Regtested on x86_64-pc-linux-gnu (found one testcase where this
triggered... :)

OK for mainline?

Thanks,
Harald

From c2ab5fc3e4cc758ca00e1878394c8f1466462f84 Mon Sep 17 00:00:00 2001
From: Harald Anlauf 
Date: Sat, 1 Feb 2025 19:14:21 +0100
Subject: [PATCH] Fortran: different character lengths in array constructor
 [PR93289]

	PR fortran/93289

gcc/fortran/ChangeLog:

	* decl.cc (gfc_set_constant_character_len): Downgrade different
	string lengths in character array constructor to legacy extension.

gcc/testsuite/ChangeLog:

	* gfortran.dg/unlimited_polymorphic_1.f03: Pad element in character
	array constructor to correct length.
	* gfortran.dg/char_array_constructor_5.f90: New test.
---
 gcc/fortran/decl.cc   | 20 +--
 .../gfortran.dg/char_array_constructor_5.f90  | 13 
 .../gfortran.dg/unlimited_polymorphic_1.f03   |  2 +-
 3 files changed, 28 insertions(+), 7 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/char_array_constructor_5.f90

diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc
index 7954a845bc0..5a46658651a 100644
--- a/gcc/fortran/decl.cc
+++ b/gcc/fortran/decl.cc
@@ -1889,12 +1889,20 @@ gfc_set_constant_character_len (gfc_charlen_t len, gfc_expr *expr,
 
   /* Apply the standard by 'hand' otherwise it gets cleared for
 	 initializers.  */
-  if (check_len != -1 && slen != check_len
-  && !(gfc_option.allow_std & GFC_STD_GNU))
-	gfc_error_now ("The CHARACTER elements of the array constructor "
-		   "at %L must have the same length (%ld/%ld)",
-		   &expr->where, (long) slen,
-		   (long) check_len);
+  if (check_len != -1 && slen != check_len)
+	{
+	  if (!(gfc_option.allow_std & GFC_STD_GNU))
+	gfc_error_now ("The CHARACTER elements of the array constructor "
+			   "at %L must have the same length (%ld/%ld)",
+			   &expr->where, (long) slen,
+			   (long) check_len);
+	  else
+	gfc_notify_std (GFC_STD_LEGACY,
+			"The CHARACTER elements of the array constructor "
+			"at %L must have the same length (%ld/%ld)",
+			&expr->where, (long) slen,
+			(long) check_len);
+	}
 
   s[len] = '\0';
   free (expr->value.character.string);
diff --git a/gcc/testsuite/gfortran.dg/char_array_constructor_5.f90 b/gcc/testsuite/gfortran.dg/char_array_constructor_5.f90
new file mode 100644
index 000..0cbe6b1468d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/char_array_constructor_5.f90
@@ -0,0 +1,13 @@
+! { dg-do compile }
+! { dg-additional-options "-std=gnu" }
+!
+! PR fortran/93289
+!
+! Contributed by Tobias Burnus
+
+character(len=*), parameter ::  str = "abj", str2 = "1234"
+print *, [character(5) :: str, "ab", "hjf333"]
+print *, [character(5) :: str, str2]
+print *, [str, "ab", "hjf333"]  ! { dg-warning "must have the same length" }
+print *, [str, str2]! { dg-warning "must have the same length" }
+end
diff --git a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_1.f03 b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_1.f03
index 8634031ad81..51483ed0332 100644
--- a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_1.f03
+++ b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_1.f03
@@ -155,7 +155,7 @@ END MODULE
   call foo([a(8),a(9)], res)
   if (trim (res) .ne. "type(a) array   8   9") STOP 1
 
-  call foo([sun, " & rain"], res)
+  call foo([sun, " & rain "], res)
   if (trim (res) .ne. "char( 8, 2)sunshine & rain") STOP 1
 
   call foo([sun//" never happens", " & rain always happens"], res)
-- 
2.43.0



Re: [PATCH] Fortran: different character lengths in array constructor [PR93289]

2025-02-01 Thread Harald Anlauf

Am 01.02.25 um 21:03 schrieb Steve Kargl:

On Sat, Feb 01, 2025 at 07:25:51PM +0100, Harald Anlauf wrote:


the attached patch downgrades different constant character lengths in an
array constructor from a GNU to a legacy extension, so that users get a
warning with -std=gnu.  We continue to generate an error when standard
conformance is requested.

Regtested on x86_64-pc-linux-gnu (found one testcase where this
triggered... :)

OK for mainline?



My vote is 'no'.

This is either a GNU extension or an error.  It is certainly
not a legacy issue as array constructors simple cannot appear
old moldy *legacy* codes.


legacy /= moldy.

My intention is to downgrade existing, potentially dangerous
GNU extensions (like this one) carefully to "legacy", but not
with an axe.


I would be in favor of making it a hard error.  If you believe
gfortan must be able to compile invalid source, then add an option
such as -fallow-invalid-scalar-character-entities-in-array-constructor.


I don't see why we shall scare users by making code that is currently
accepted silently, because it is a GNU extension, suddenly to a hard
error.

So why must we be so tough?


$0.02





Re: [PATCH] Fortran: different character lengths in array constructor [PR93289]

2025-02-01 Thread Jerry D

On 2/1/25 10:25 AM, Harald Anlauf wrote:

Dear all,

the attached patch downgrades different constant character lengths in an
array constructor from a GNU to a legacy extension, so that users get a
warning with -std=gnu.  We continue to generate an error when standard
conformance is requested.

Regtested on x86_64-pc-linux-gnu (found one testcase where this
triggered... :)

OK for mainline?

Thanks,
Harald



Yes, OK, and thanks

Jerry


Re: [PATCH] Fortran: different character lengths in array constructor [PR93289]

2025-02-01 Thread Steve Kargl
On Sat, Feb 01, 2025 at 07:25:51PM +0100, Harald Anlauf wrote:
> 
> the attached patch downgrades different constant character lengths in an
> array constructor from a GNU to a legacy extension, so that users get a
> warning with -std=gnu.  We continue to generate an error when standard
> conformance is requested.
> 
> Regtested on x86_64-pc-linux-gnu (found one testcase where this
> triggered... :)
> 
> OK for mainline?
> 

My vote is 'no'.

This is either a GNU extension or an error.  It is certainly
not a legacy issue as array constructors simple cannot appear
old moldy *legacy* codes.  

I would be in favor of making it a hard error.  If you believe
gfortan must be able to compile invalid source, then add an option
such as -fallow-invalid-scalar-character-entities-in-array-constructor.

$0.02

-- 
Steve


Re: [PATCH] Fortran: different character lengths in array constructor [PR93289]

2025-02-01 Thread Steve Kargl
On Sat, Feb 01, 2025 at 09:49:17PM +0100, Harald Anlauf wrote:
> Am 01.02.25 um 21:03 schrieb Steve Kargl:
> > On Sat, Feb 01, 2025 at 07:25:51PM +0100, Harald Anlauf wrote:
> > > 
> > > the attached patch downgrades different constant character lengths in an
> > > array constructor from a GNU to a legacy extension, so that users get a
> > > warning with -std=gnu.  We continue to generate an error when standard
> > > conformance is requested.
> > > 
> > > Regtested on x86_64-pc-linux-gnu (found one testcase where this
> > > triggered... :)
> > > 
> > > OK for mainline?
> > > 
> > 
> > My vote is 'no'.
> > 
> > This is either a GNU extension or an error.  It is certainly
> > not a legacy issue as array constructors simple cannot appear
> > old moldy *legacy* codes.
> 
> legacy /= moldy.
> 
> My intention is to downgrade existing, potentially dangerous
> GNU extensions (like this one) carefully to "legacy", but not
> with an axe.
> 
> > I would be in favor of making it a hard error.  If you believe
> > gfortan must be able to compile invalid source, then add an option
> > such as -fallow-invalid-scalar-character-entities-in-array-constructor.
> 
> I don't see why we shall scare users by making code that is currently
> accepted silently, because it is a GNU extension, suddenly to a hard
> error.
> 
> So why must we be so tough?
> 

Because -std=legacy allows a whole bunch of garbage.

Instead of fixing broken code, a user will slap -std=legacy
in a Makefile and move on.  Then years from now, you'll see
-std=legacy in a whole bunch of Makefiles whether it is needed
or not.  See -maligned-double and -fallow-argument-mismatch as
poster children.

Removing these types of extensions and legacy features
will hopefully make gfortran easier to maintain.

Again, just my $0.02.

-- 
Steve


Re: [PATCH] Fortran: different character lengths in array constructor [PR93289]

2025-02-01 Thread Jerry D

On 2/1/25 12:49 PM, Harald Anlauf wrote:

Am 01.02.25 um 21:03 schrieb Steve Kargl:

On Sat, Feb 01, 2025 at 07:25:51PM +0100, Harald Anlauf wrote:


the attached patch downgrades different constant character lengths in an
array constructor from a GNU to a legacy extension, so that users get a
warning with -std=gnu.  We continue to generate an error when standard
conformance is requested.

Regtested on x86_64-pc-linux-gnu (found one testcase where this
triggered... :)

OK for mainline?



My vote is 'no'.

This is either a GNU extension or an error.  It is certainly
not a legacy issue as array constructors simple cannot appear
old moldy *legacy* codes.


legacy /= moldy.

My intention is to downgrade existing, potentially dangerous
GNU extensions (like this one) carefully to "legacy", but not
with an axe.


I would be in favor of making it a hard error.  If you believe
gfortan must be able to compile invalid source, then add an option
such as -fallow-invalid-scalar-character-entities-in-array-constructor.


I don't see why we shall scare users by making code that is currently
accepted silently, because it is a GNU extension, suddenly to a hard
error.

So why must we be so tough?


$0.02





What do other compilers do? Do they reject it outright?

--