[gcc r16-1761] Fix compilation of concatenation with illegal character constant
Eric Botcazou
ebotcazou@gcc.gnu.org
Sat Jun 28 15:44:43 GMT 2025
https://gcc.gnu.org/g:0788add46a172b7b1c565fafdef80979be3dc2a6
commit r16-1761-g0788add46a172b7b1c565fafdef80979be3dc2a6
Author: Eric Botcazou <ebotcazou@adacore.com>
Date: Sat Jun 28 17:42:26 2025 +0200
Fix compilation of concatenation with illegal character constant
This fixes an error recovery issue, whereby the compilation of a string
concatenation with an illegal character constant hangs.
gcc/ada/
PR ada/120854
* sem_eval.adb (Get_String_Val): Be prepared for an integer literal
after a serious error is detected, and raise PE on other nodes.
gcc/testsuite/
* gnat.dg/concat6.adb: New test.
Diff:
---
gcc/ada/sem_eval.adb | 11 +++++++++--
gcc/testsuite/gnat.dg/concat6.adb | 9 +++++++++
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb
index fcab3e79d332..2d64d845ae24 100644
--- a/gcc/ada/sem_eval.adb
+++ b/gcc/ada/sem_eval.adb
@@ -5287,9 +5287,16 @@ package body Sem_Eval is
begin
if Nkind (N) in N_String_Literal | N_Character_Literal then
return N;
- else
- pragma Assert (Is_Entity_Name (N));
+ elsif Is_Entity_Name (N) then
return Get_String_Val (Constant_Value (Entity (N)));
+ elsif Nkind (N) = N_Integer_Literal then
+ pragma Assert (Serious_Errors_Detected /= 0);
+ return
+ Make_Character_Literal (Sloc (N),
+ Chars => Error_Name,
+ Char_Literal_Value => Intval (N));
+ else
+ raise Program_Error;
end if;
end Get_String_Val;
diff --git a/gcc/testsuite/gnat.dg/concat6.adb b/gcc/testsuite/gnat.dg/concat6.adb
new file mode 100644
index 000000000000..015be56bcb2b
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/concat6.adb
@@ -0,0 +1,9 @@
+-- { dg-do compile }
+
+with Ada.Text_IO; use Ada.Text_IO;
+
+procedure Concat6 is
+ C : constant character := 16#00#; -- { dg-error "expected type|found type" }
+begin
+ Put_Line ("Test " & C);
+end;
More information about the Gcc-cvs
mailing list