[Ada] Don't accept illegal (e.g., Integer'(null)) generic actuals
authorSteve Baird <baird@adacore.com>
Tue, 17 Sep 2019 08:02:04 +0000 (08:02 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 17 Sep 2019 08:02:04 +0000 (08:02 +0000)
commit0a39f241944cfb7090d73e076913ff068a1cc32f
treeeb5d50a2f03300f0c13f29d8a6da5403b0d41ff7
parent77562afd5b514434c7f6cacaeb1eaaa234d19736
[Ada] Don't accept illegal (e.g., Integer'(null)) generic actuals

Sem_Util.Wrong_Type usually emits an error message, but in some cases it
does not. The code which prevents emitting an error message was going
too far in some cases, causing illegal constructs to be accepted. For
example, a qualified expression such as Integer'(null) might be passed
in as an actual parameter in an instantiation of a generic and generate
no error message.

Running this command:

  gcc -c inst.ads

On the following sources:

package Inst is
   type Ptr is new Integer;

   generic
      type TElement is private;
      NonDefini : TElement;
   package ArbMgr is
   end ArbMgr;

   package Pack is new ArbMgr (Ptr, Ptr'(null));

   procedure Dummy;
end Inst;

Should produce the following output:

  inst.ads:10:42: expected type "Ptr" defined at line 2
  inst.ads:10:42: found an access type
  compilation abandoned due to previous error

2019-09-17  Steve Baird  <baird@adacore.com>

gcc/ada/

* sem_util.adb (Wrong_Type): In deciding to suppress a message,
it is not enough for In_Instance to be True; in addition,
In_Generic_Actual (Expr) must be False.
* sem_type.adb (In_Generic_Actual): Fix bug where traversal of
parents skips every other node.

From-SVN: r275786
gcc/ada/ChangeLog
gcc/ada/sem_type.adb
gcc/ada/sem_util.adb