public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Pierre-Marie de Rodat <derodat@adacore.com>
To: gcc-patches@gcc.gnu.org
Cc: Steve Baird <baird@adacore.com>
Subject: [Ada] Don't accept illegal (e.g., Integer'(null)) generic actuals
Date: Tue, 17 Sep 2019 08:06:00 -0000	[thread overview]
Message-ID: <20190917080633.GA37548@adacore.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1226 bytes --]

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

Tested on x86_64-pc-linux-gnu, committed on trunk

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.

[-- Attachment #2: patch.diff --]
[-- Type: text/x-diff, Size: 1811 bytes --]

--- gcc/ada/sem_type.adb
+++ gcc/ada/sem_type.adb
@@ -2849,7 +2849,7 @@ package body Sem_Type is
          return False;
 
       else
-         return In_Generic_Actual (Parent (Par));
+         return In_Generic_Actual (Par);
       end if;
    end In_Generic_Actual;
 

--- gcc/ada/sem_util.adb
+++ gcc/ada/sem_util.adb
@@ -26689,7 +26689,7 @@ package body Sem_Util is
          return;
 
       --  In  an instance, there is an ongoing problem with completion of
-      --  type derived from private types. Their structure is what Gigi
+      --  types derived from private types. Their structure is what Gigi
       --  expects, but the  Etype is the parent type rather than the
       --  derived private type itself. Do not flag error in this case. The
       --  private completion is an entity without a parent, like an Itype.
@@ -26700,7 +26700,17 @@ package body Sem_Util is
       --  same reason: inserted body may be outside of the original package
       --  and only partial views are visible at the point of insertion.
 
-      elsif In_Instance or else In_Inlined_Body then
+      --  If In_Generic_Actual (Expr) is True then we cannot assume that
+      --  the successful semantic analysis of the generic guarantees anything
+      --  useful about type checking of this instance, so we ignore
+      --  In_Instance in that case. There may be cases where this is not
+      --  right (the symptom would probably be rejecting something
+      --  that ought to be accepted) but we don't currently have any
+      --  concrete examples of this.
+
+      elsif (In_Instance and then not In_Generic_Actual (Expr))
+        or else In_Inlined_Body
+      then
          if Etype (Etype (Expr)) = Etype (Expected_Type)
            and then
              (Has_Private_Declaration (Expected_Type)


                 reply	other threads:[~2019-09-17  8:06 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190917080633.GA37548@adacore.com \
    --to=derodat@adacore.com \
    --cc=baird@adacore.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).