diff options
author | Ed Schonberg <schonberg@adacore.com> | 2019-07-01 13:37:47 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-01 13:37:47 +0000 |
commit | d21c7dd6a2cf854da4776082cc6903acbdf8391f (patch) | |
tree | bad13ae0930e056837e7a5850e4f592197534b5a /gcc | |
parent | 6578a6bfec1ae4a6a077055ebf0024e0079b80f7 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/sem_ch12.adb | 35 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/generic_inst3.adb | 20 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/generic_inst3_kafka_lib-topic.ads | 7 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/generic_inst3_kafka_lib.ads | 2 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/generic_inst3_markets.ads | 10 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/generic_inst3_traits-encodables.ads | 8 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/generic_inst3_traits.ads | 3 |
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; |