]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: different character lengths in array constructor [PR93289]
authorHarald Anlauf <anlauf@gmx.de>
Sat, 1 Feb 2025 18:14:21 +0000 (19:14 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Mon, 3 Feb 2025 21:36:20 +0000 (22:36 +0100)
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
gcc/testsuite/gfortran.dg/char_array_constructor_5.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/unlimited_polymorphic_1.f03

index 7954a845bc097a58e51db28fa90c5ad8e9f694fb..5a46658651aa9a617fc11993b905191f16e9b773 100644 (file)
@@ -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 (file)
index 0000000..0cbe6b1
--- /dev/null
@@ -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
index 8634031ad818449d4a72cb3f98e27a5e7aca8887..51483ed03325ea0c00b3feb4cfbd3a4867aa473e 100644 (file)
@@ -155,7 +155,7 @@ END MODULE
   call foo([a(8),a(9)], res)\r
   if (trim (res) .ne. "type(a) array   8   9") STOP 1
 \r
-  call foo([sun, " & rain"], res)\r
+  call foo([sun, " & rain "], res)
   if (trim (res) .ne. "char( 8, 2)sunshine & rain") STOP 1
 \r
   call foo([sun//" never happens", " & rain always happens"], res)\r