sem_ch6.adb
445 KB
-
[Ada] Missing consistency check for constant modifier · 44f83ca4
This patch fixes an issue whereby instantiations of generic packages were incorrectly allowed despite formal and actual subprograms not having matching declarations with anonymous constant access type parameters. ------------ -- Source -- ------------ -- gen1.ads package Gen1 is generic with procedure View (IA : not null access constant Integer); procedure Dispatch (IA : access Integer); end; -- gen2.adb package body Gen1 is procedure Dispatch (IA : access Integer) is begin View (IA); end; end; -- bad1.ads with Gen1; package Bad1 is procedure Bad_View (IA : not null access Integer); procedure Bad_Dispatch is new Gen1.Dispatch (Bad_View); end; -- bad1.adb package body Bad1 is procedure Bad_View (IA : not null access Integer) is begin IA.all := IA.all + 1; end; end; -- gen2.ads package Gen2 is generic with procedure View (IA : access constant Integer); procedure Dispatch (IA : access Integer); end; -- gen2.adb package body Gen2 is procedure Dispatch (IA : access Integer) is begin View (IA); end; end; -- bad2.ads with Gen2; package Bad2 is procedure Bad_View (IA : access Integer); procedure Bad_Dispatch is new Gen2.Dispatch (Bad_View); end; -- bad2.adb package body Bad2 is procedure Bad_View (IA : access Integer) is begin IA.all := IA.all + 1; end; end; ----------------- -- Compilation -- ----------------- $ gnatmake -q bad1.adb $ bad1.ads:4:04: instantiation error at gen1.ads:3 $ bad1.ads:4:04: not mode conformant with declaration at line 3 $ bad1.ads:4:04: constant modifier does not match $ gnatmake: "bad1.adb" compilation error $ gnatmake -q bad2.adb $ bad2.ads:4:04: instantiation error at gen2.ads:3 $ bad2.ads:4:04: not mode conformant with declaration at line 3 $ bad2.ads:4:04: constant modifier does not match $ gnatmake: "bad2.adb" compilation error 2019-07-03 Justin Squirek <squirek@adacore.com> gcc/ada/ * sem_ch6.adb (Check_Conformance): Add expression checking for constant modifiers in anonymous access types (in addition to "non-null" types) so that they are considered "matching" for subsequent conformance tests. From-SVN: r272963Justin Squirek committed