aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gnat.dg
diff options
context:
space:
mode:
authorGary Dismukes <dismukes@adacore.com>2019-08-20 09:49:46 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-08-20 09:49:46 +0000
commite0ea5d16a80b1216387ba00c27ee2ea0e808ac42 (patch)
treeefa89048a24e83d59b1769b2e0507a1214159465 /gcc/testsuite/gnat.dg
parentefc00a8893ffcce505f92e0cb8c540ee1766f8fb (diff)
downloadgcc-e0ea5d16a80b1216387ba00c27ee2ea0e808ac42.zip
gcc-e0ea5d16a80b1216387ba00c27ee2ea0e808ac42.tar.gz
gcc-e0ea5d16a80b1216387ba00c27ee2ea0e808ac42.tar.bz2
[Ada] Illegal limited function call accepted in a type conversion
It's illegal to call a function with a result of an immutably limited type inside a type conversion that's used in one of the special contexts that allow such a function call by itself (see RM 7.5 (2.1-2.10)), such as in the initialization expression of an object declaration. The compiler was recursively applying OK_For_Limited_Init_In_05 to the expression inside of a rewritten type conversion, rather than directly to the Original_Node itself (which is what was cased on to get to the type conversion case alternative), which allowed such illegal initialization, and that's corrected by this fix. However, when the expression is not a rewriting of a user-written conversion, the recursive call to OK_For_Limited_Init_In_05 must be applied to the Expression of the conversion. 2019-08-20 Gary Dismukes <dismukes@adacore.com> gcc/ada/ * sem_ch3.adb (OK_For_Limited_Init_In_05): In the case of type conversions, apply the recursive call to the Original_Node of the expression Exp rather than the Expression of the Original_Node, in the case where Exp has been rewritten; otherwise, when Original_Node is the same as Exp, apply the recursive call to the Expression. (Check_Initialization): Revise condition for special check on type conversions of limited function calls to test Original_Node (avoiding spurious errors on expanded unchecked conversions applied to build-in-place dispatching calls). gcc/testsuite/ * gnat.dg/type_conv2.adb, gnat.dg/type_conv2.ads: New testcase. From-SVN: r274731
Diffstat (limited to 'gcc/testsuite/gnat.dg')
-rw-r--r--gcc/testsuite/gnat.dg/type_conv2.adb16
-rw-r--r--gcc/testsuite/gnat.dg/type_conv2.ads13
2 files changed, 29 insertions, 0 deletions
diff --git a/gcc/testsuite/gnat.dg/type_conv2.adb b/gcc/testsuite/gnat.dg/type_conv2.adb
new file mode 100644
index 0000000..d1818c6
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/type_conv2.adb
@@ -0,0 +1,16 @@
+-- { dg-do compile }
+
+package body Type_Conv2 is
+
+ function Wrap (X : Integer) return Root'Class is
+ begin
+ return Der_I'(X => X);
+ end Wrap;
+
+ procedure Proc_Static is
+ D : constant Der_I := Der_I (Wrap (0)); -- { dg-error "initialization of limited object requires aggregate or function call" }
+ begin
+ null;
+ end Proc_Static;
+
+end Type_Conv2;
diff --git a/gcc/testsuite/gnat.dg/type_conv2.ads b/gcc/testsuite/gnat.dg/type_conv2.ads
new file mode 100644
index 0000000..b9ddeb2
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/type_conv2.ads
@@ -0,0 +1,13 @@
+package Type_Conv2 is
+
+ type Root is abstract tagged limited null record;
+
+ type Der_I is new Root with record
+ X : Integer;
+ end record;
+
+ function Wrap (X : Integer) return Root'Class;
+
+ procedure Proc_Static;
+
+end Type_Conv2;