[Ada] Static predicate check on characters of a string literal
authorEd Schonberg <schonberg@adacore.com>
Thu, 31 May 2018 10:47:29 +0000 (10:47 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 31 May 2018 10:47:29 +0000 (10:47 +0000)
commit2a35a4ca1429dca015b8c635dc607e8fb7963808
tree1c11e3873c2bb91aa4ad11eeeb9622fb5974e14a
parentd9898483059a497f1f632ab688bcef729e6cb6e0
[Ada] Static predicate check on characters of a string literal

This patch implements the rule given in R< 4.2 (11): if the component type of
a string literal is a character type with a static predicate, that predicate
must be applied to each character in the string.

Compiling the example below must yield:

   gcc -c -gnata main.adb

  main.adb:4:23: warning: static expression fails static predicate check on "C"
  main.adb:4:23: warning: expression is no longer considered static
  main.adb:4:24: warning: static expression fails static predicate check on "C"
  main.adb:4:24: warning: expression is no longer considered static
  main.adb:4:25: warning: static expression fails static predicate check on "C"
  main.adb:4:25: warning: expression is no longer considered static

Execution must yield:

  raised SYSTEM.ASSERTIONS.ASSERT_FAILURE :
                                        Static_Predicate failed at main.adb:4
----

procedure Main is
   subtype C is Character with Static_Predicate => C in 'A' | 'B' | 'C';
   type S is array (Positive range <>) of C;
   X : constant S := "abc";
begin
   null;
end;

2018-05-31  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_res.adb (Resolve_String_Literal): If the type is a string type
whose component subtype has a static predicate, ensure that the
predicate is applied to each character by expanding the string into the
equivalent aggregate. This is also done if the component subtype is
constrained.

From-SVN: r261014
gcc/ada/ChangeLog
gcc/ada/sem_res.adb