From f4367c6b7b7229835fb8786d85a853cb4641b29c Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 4 Nov 2025 00:10:55 +0100 Subject: [PATCH] Ada: Fix misleading diagnostic about abstract new in type derivation The current error message is: abstract1.ads:7:13: error: "abstract" not allowed here, ignored but "abstract" is indeed allowed there if you complete the declaration. The patch changes it to: abstract1.ads:7:13: error: "abstract" allowed only for record extension, ... gcc/ada/ PR ada/55324 * par-ch3.adb (P_Type_Declaration): Give a better error message for illegal "abstract" in a type derivation. gcc/testsuite/ * gnat.dg/specs/abstract1.ads: New test. --- gcc/ada/par-ch3.adb | 11 ++++++++--- gcc/testsuite/gnat.dg/specs/abstract1.ads | 9 +++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/specs/abstract1.ads diff --git a/gcc/ada/par-ch3.adb b/gcc/ada/par-ch3.adb index 56c1b894c0d..ee0958d051f 100644 --- a/gcc/ada/par-ch3.adb +++ b/gcc/ada/par-ch3.adb @@ -757,8 +757,7 @@ package body Ch3 is Typedef_Node := P_Derived_Type_Def_Or_Private_Ext_Decl; if Saved_Token = Tok_Synchronized then - if Nkind (Typedef_Node) = - N_Derived_Type_Definition + if Nkind (Typedef_Node) = N_Derived_Type_Definition then Error_Msg_N ("SYNCHRONIZED not allowed for record extension", @@ -864,7 +863,13 @@ package body Ch3 is Set_Abstract_Present (Typedef_Node, Abstract_Present); elsif Abstract_Present then - Error_Msg ("ABSTRACT not allowed here, ignored", Abstract_Loc); + if Nkind (Typedef_Node) = N_Derived_Type_Definition then + Error_Msg + ("ABSTRACT allowed only for record extension, ignored", + Abstract_Loc); + else + Error_Msg ("ABSTRACT not allowed here, ignored", Abstract_Loc); + end if; end if; Decl_Node := New_Node (N_Full_Type_Declaration, Type_Loc); diff --git a/gcc/testsuite/gnat.dg/specs/abstract1.ads b/gcc/testsuite/gnat.dg/specs/abstract1.ads new file mode 100644 index 00000000000..4674424211a --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/abstract1.ads @@ -0,0 +1,9 @@ +-- { dg-do compile } + +package Abstract1 is + + type T is abstract tagged null record; + + type S is abstract new T; -- { dg-error "allowed only for record extension" } + +end Abstract1; -- 2.47.3