aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2019-07-01 13:37:47 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-07-01 13:37:47 +0000
commitd21c7dd6a2cf854da4776082cc6903acbdf8391f (patch)
treebad13ae0930e056837e7a5850e4f592197534b5a /gcc
parent6578a6bfec1ae4a6a077055ebf0024e0079b80f7 (diff)
downloadgcc-d21c7dd6a2cf854da4776082cc6903acbdf8391f.zip
gcc-d21c7dd6a2cf854da4776082cc6903acbdf8391f.tar.gz
gcc-d21c7dd6a2cf854da4776082cc6903acbdf8391f.tar.bz2
[Ada] Spurious error on inst. of partially defaulted formal package
This patch removes a spurious error on an instantiation whose generic unit has a formal package where some formal parameters are box-initialiaed. Previously the code assumed that box-initialization for a formal package applied to all its formal parameters. 2019-07-01 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * sem_ch12.adb (Is_Defaulted): New predicate in Check_Formal_Package_Intance, to skip the conformance of checks on parameters of a formal package that are defaulted, gcc/testsuite/ * gnat.dg/generic_inst3.adb, gnat.dg/generic_inst3_kafka_lib-topic.ads, gnat.dg/generic_inst3_kafka_lib.ads, gnat.dg/generic_inst3_markets.ads, gnat.dg/generic_inst3_traits-encodables.ads, gnat.dg/generic_inst3_traits.ads: New testcase. From-SVN: r272883
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/sem_ch12.adb35
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gnat.dg/generic_inst3.adb20
-rw-r--r--gcc/testsuite/gnat.dg/generic_inst3_kafka_lib-topic.ads7
-rw-r--r--gcc/testsuite/gnat.dg/generic_inst3_kafka_lib.ads2
-rw-r--r--gcc/testsuite/gnat.dg/generic_inst3_markets.ads10
-rw-r--r--gcc/testsuite/gnat.dg/generic_inst3_traits-encodables.ads8
-rw-r--r--gcc/testsuite/gnat.dg/generic_inst3_traits.ads3
9 files changed, 100 insertions, 0 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 51ff642..6396196 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2019-07-01 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch12.adb (Is_Defaulted): New predicate in
+ Check_Formal_Package_Intance, to skip the conformance of checks
+ on parameters of a formal package that are defaulted,
+
2019-07-01 Hristian Kirtchev <kirtchev@adacore.com>
* checks.adb, exp_ch9.adb, exp_unst.adb, sem_ch4.adb,
diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index 0395af9..9ddfc97 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -6195,6 +6195,12 @@ package body Sem_Ch12 is
-- Common error routine for mismatch between the parameters of the
-- actual instance and those of the formal package.
+ function Is_Defaulted (Param : Entity_Id) return Boolean;
+ -- If the formql package has partly box-initialized formals, skip
+ -- conformace check for these formals. Previously the code assumed
+ -- that boc initialization for a formal package applied to all
+ -- its formal parameters.
+
function Same_Instantiated_Constant (E1, E2 : Entity_Id) return Boolean;
-- The formal may come from a nested formal package, and the actual may
-- have been constant-folded. To determine whether the two denote the
@@ -6245,6 +6251,32 @@ package body Sem_Ch12 is
end if;
end Check_Mismatch;
+ ------------------
+ -- Is_Defaulted --
+ ------------------
+
+ function Is_Defaulted (Param : Entity_Id) return Boolean is
+ Assoc : Node_Id;
+ begin
+ Assoc := First (Generic_Associations
+ (Parent (Associated_Formal_Package (Actual_Pack))));
+
+ while Present (Assoc) loop
+ if Nkind (Assoc) = N_Others_Choice then
+ return True;
+
+ elsif Nkind (Assoc) = N_Generic_Association
+ and then Chars (Selector_Name (Assoc)) = Chars (Param)
+ then
+ return Box_Present (Assoc);
+ end if;
+
+ Next (Assoc);
+ end loop;
+
+ return False;
+ end Is_Defaulted;
+
--------------------------------
-- Same_Instantiated_Constant --
--------------------------------
@@ -6414,6 +6446,9 @@ package body Sem_Ch12 is
then
goto Next_E;
+ elsif Is_Defaulted (E1) then
+ goto Next_E;
+
elsif Is_Type (E1) then
-- Subtypes must statically match. E1, E2 are the local entities
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8af4499..8936a8e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,14 @@
2019-07-01 Ed Schonberg <schonberg@adacore.com>
+ * gnat.dg/generic_inst3.adb,
+ gnat.dg/generic_inst3_kafka_lib-topic.ads,
+ gnat.dg/generic_inst3_kafka_lib.ads,
+ gnat.dg/generic_inst3_markets.ads,
+ gnat.dg/generic_inst3_traits-encodables.ads,
+ gnat.dg/generic_inst3_traits.ads: New testcase.
+
+2019-07-01 Ed Schonberg <schonberg@adacore.com>
+
* gnat.dg/enum_rep.adb, gnat.dg/enum_rep.ads: New testcase.
2019-07-01 Ed Schonberg <schonberg@adacore.com>
diff --git a/gcc/testsuite/gnat.dg/generic_inst3.adb b/gcc/testsuite/gnat.dg/generic_inst3.adb
new file mode 100644
index 0000000..545d72e
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/generic_inst3.adb
@@ -0,0 +1,20 @@
+-- { dg-do compile }
+
+with Generic_Inst3_Kafka_Lib.Topic;
+with Generic_Inst3_Traits.Encodables;
+with Generic_Inst3_Markets;
+
+procedure Generic_Inst3 is
+ generic
+ with package Values is new Generic_Inst3_Traits.Encodables (<>);
+ with package Topic is new Generic_Inst3_Kafka_Lib.Topic
+ (Values => Values, others => <>);
+ package Dummy is
+ end Dummy;
+
+ package Inst is new Dummy
+ (Values => Generic_Inst3_Markets.Data_Encodables,
+ Topic => Generic_Inst3_Markets.Data_Topic);
+begin
+ null;
+end Generic_Inst3;
diff --git a/gcc/testsuite/gnat.dg/generic_inst3_kafka_lib-topic.ads b/gcc/testsuite/gnat.dg/generic_inst3_kafka_lib-topic.ads
new file mode 100644
index 0000000..b0ff8ff
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/generic_inst3_kafka_lib-topic.ads
@@ -0,0 +1,7 @@
+with Generic_Inst3_Traits.Encodables;
+generic
+ Topic_Name : String;
+ with package Keys is new Generic_Inst3_Traits.Encodables (<>);
+ with package Values is new Generic_Inst3_Traits.Encodables (<>);
+package Generic_Inst3_Kafka_Lib.Topic is
+end Generic_Inst3_Kafka_Lib.Topic;
diff --git a/gcc/testsuite/gnat.dg/generic_inst3_kafka_lib.ads b/gcc/testsuite/gnat.dg/generic_inst3_kafka_lib.ads
new file mode 100644
index 0000000..2fbaee9
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/generic_inst3_kafka_lib.ads
@@ -0,0 +1,2 @@
+package Generic_Inst3_Kafka_Lib is
+end Generic_Inst3_Kafka_Lib;
diff --git a/gcc/testsuite/gnat.dg/generic_inst3_markets.ads b/gcc/testsuite/gnat.dg/generic_inst3_markets.ads
new file mode 100644
index 0000000..9add3ab
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/generic_inst3_markets.ads
@@ -0,0 +1,10 @@
+with Generic_Inst3_Kafka_Lib.Topic;
+with Generic_Inst3_Traits.Encodables;
+package Generic_Inst3_Markets is
+ type Data_Type is null record;
+ function Image (D : Data_Type) return String is ("");
+ package Data_Encodables is new Generic_Inst3_Traits.Encodables (Data_Type, Image);
+ package Data_Topic is new Generic_Inst3_Kafka_Lib.Topic
+ (Keys => Data_Encodables, Values => Data_Encodables,
+ Topic_Name => "bla");
+end Generic_Inst3_Markets;
diff --git a/gcc/testsuite/gnat.dg/generic_inst3_traits-encodables.ads b/gcc/testsuite/gnat.dg/generic_inst3_traits-encodables.ads
new file mode 100644
index 0000000..3e8814e
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/generic_inst3_traits-encodables.ads
@@ -0,0 +1,8 @@
+with Ada.Streams;
+generic
+ pragma Warnings (Off, "is not referenced");
+ type T (<>) is private;
+ with function Image (Val : in T) return String;
+package Generic_Inst3_Traits.Encodables is
+ pragma Pure;
+end Generic_Inst3_Traits.Encodables;
diff --git a/gcc/testsuite/gnat.dg/generic_inst3_traits.ads b/gcc/testsuite/gnat.dg/generic_inst3_traits.ads
new file mode 100644
index 0000000..aeb2cd1
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/generic_inst3_traits.ads
@@ -0,0 +1,3 @@
+package Generic_Inst3_Traits is
+ pragma Pure;
+end Generic_Inst3_Traits;