sem_dim.adb (Analyze_Dimension): Analyze object declaration and identifier nodes...
authorEd Schonberg <schonberg@adacore.com>
Thu, 19 Jan 2017 11:33:17 +0000 (11:33 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 19 Jan 2017 11:33:17 +0000 (12:33 +0100)
2017-01-19  Ed Schonberg  <schonberg@adacore.com>

* sem_dim.adb (Analyze_Dimension): Analyze object declaration and
identifier nodes that do not come from source, to handle properly
dimensionality check within an inlined body which inclddes both
original operands and rewritten operands. This removes spurious
dimensionality errors in the presence of front-end inlining,
as well as in SPARK mode.

From-SVN: r244614

gcc/ada/ChangeLog
gcc/ada/sem_dim.adb

index 5b2244353358d21c3f998fe1c76c9487a6ad3961..625643f21fe2a817b22dd7938a06642b8c8100ad 100644 (file)
@@ -1,3 +1,12 @@
+2017-01-19  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_dim.adb (Analyze_Dimension): Analyze object declaration and
+       identifier nodes that do not come from source, to handle properly
+       dimensionality check within an inlined body which inclddes both
+       original operands and rewritten operands. This removes spurious
+       dimensionality errors in the presence of front-end inlining,
+       as well as in SPARK mode.
+
 2017-01-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR driver/49726
index 44794ba1e0a5e691a53062d037f43ad46c95a0e2..2c57bcb5227190ff1cb1c83c3e408e8c847cd3ed 100644 (file)
@@ -1122,16 +1122,22 @@ package body Sem_Dim is
       --  Aspect is an Ada 2012 feature. Note that there is no need to check
       --  dimensions for nodes that don't come from source, except for subtype
       --  declarations where the dimensions are inherited from the base type,
-      --  and for explicit dereferences generated when expanding iterators.
+      --  for explicit dereferences generated when expanding iterators, and
+      --  for object declarations generated for inlining.
 
       if Ada_Version < Ada_2012 then
          return;
 
-      elsif not Comes_From_Source (N)
-        and then Nkind (N) /= N_Subtype_Declaration
-        and then Nkind (N) /= N_Explicit_Dereference
-      then
-         return;
+      elsif not Comes_From_Source (N) then
+         if Nkind_In (N, N_Explicit_Dereference,
+                         N_Identifier,
+                         N_Object_Declaration,
+                         N_Subtype_Declaration)
+         then
+            null;
+         else
+            return;
+         end if;
       end if;
 
       case Nkind (N) is
@@ -2138,7 +2144,8 @@ package body Sem_Dim is
             end if;
          end if;
 
-         --  Removal of dimensions in expression
+         --  Remove dimensions in expression after checking consistency
+         --  with given type.
 
          Remove_Dimensions (Expr);
       end if;