sem_util.adb (Normalize_Actuals): Take into account extra actuals that may have been...
authorEd Schonberg <schonberg@adacore.com>
Mon, 2 May 2016 09:44:54 +0000 (09:44 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 2 May 2016 09:44:54 +0000 (11:44 +0200)
2016-05-02  Ed Schonberg  <schonberg@adacore.com>

* sem_util.adb (Normalize_Actuals): Take into account extra
actuals that may have been introduced previously. Normally extra
actuals are introduced when a call is expanded, but a validity
check may copy and reanalyze a call that carries an extra actual
(e.g. an accessibility parameter) before the call itself is
marked Analzyed, and the analysis of the copy has to be able to
cope with the added actual.

From-SVN: r235723

gcc/ada/ChangeLog
gcc/ada/sem_util.adb

index d05918c29b9c629bf146360c812edb49155cc023..72a1ae50a764bd7efe6fe4f773ccec0dd3a2ae23 100644 (file)
@@ -1,3 +1,13 @@
+2016-05-02  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_util.adb (Normalize_Actuals): Take into account extra
+       actuals that may have been introduced previously. Normally extra
+       actuals are introduced when a call is expanded, but a validity
+       check may copy and reanalyze a call that carries an extra actual
+       (e.g. an accessibility parameter) before the call itself is
+       marked Analzyed, and the analysis of the copy has to be able to
+       cope with the added actual.
+
 2016-05-02  Bob Duff  <duff@adacore.com>
 
        * sem_ch10.adb (Analyze_Compilation_Unit): Preserve
index 863ff308d9a90a507e4be98a069dd710b597fed4..4fc783f511dcae489dedea34e22fc8c2ce6fe10c 100644 (file)
@@ -17088,9 +17088,24 @@ package body Sem_Util is
                  and then Actual /= Last
                  and then No (Next_Named_Actual (Actual))
                then
-                  Error_Msg_N ("unmatched actual & in call",
-                    Selector_Name (Actual));
-                  exit;
+                  --  A validity check may introduce a copy of a call that
+                  --  includes an extra actual (for example for an unrelated
+                  --  accessibility check). Check that the extra actual matches
+                  --  some extra formal, which must exist already because
+                  --  subprogram must be frozen at this point.
+
+                  if Present (Extra_Formals (S))
+                    and then not Comes_From_Source (Actual)
+                    and then Nkind (Actual) = N_Parameter_Association
+                    and then Chars (Extra_Formals (S)) =
+                               Chars (Selector_Name (Actual))
+                  then
+                     null;
+                  else
+                     Error_Msg_N
+                       ("unmatched actual & in call", Selector_Name (Actual));
+                     exit;
+                  end if;
                end if;
 
                Next (Actual);