[Ada] Missing predicate check on return value
authorEd Schonberg <schonberg@adacore.com>
Wed, 26 Sep 2018 09:17:16 +0000 (09:17 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 26 Sep 2018 09:17:16 +0000 (09:17 +0000)
commitbcbe14db192f03018ea74cf6eb24c04a110ecac0
tree6f0259bd94fa7634186de098bbb969e0fec3564d
parent4453a8221c65f386ae361670fa932643521374d7
[Ada] Missing predicate check on return value

The semantics of the return statement includes an implicit conversion of
the value to the return type of the funcction. This conversion, as
elsewhere, entails a predicate check if the return type has a predicate
aspect.

We do not apply the check to a case expression because in the context of
a return statement it will be expanded into a series of return
statements, each of which will receive a predicate check.

2018-09-26  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_ch6.adb (Analyze_Function_Return): If the return type has
a dynamic_predicate, apply a Predicate_Check to the expression,
given that it is implicitly converted to the return type.
Exclude case expressions from the check, because in this context
the expression is expanded into individual return statements.

gcc/testsuite/

* gnat.dg/predicate3.adb, gnat.dg/predicate3_pkg.ads: New
testcase.

From-SVN: r264611
gcc/ada/ChangeLog
gcc/ada/sem_ch6.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/predicate3.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/predicate3_pkg.ads [new file with mode: 0644]