This patch implements a syntactic language extension that allows
declarative items to appear in a sequence of statements.  For example:

    for X in S'Range loop
        Item : Character renames S (X);
        Item := Transform (Item);
    end loop;

Previously, declare/begin/end was required, which is just noise.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

        * par.adb (P_Declarative_Items): New function to parse a
        sequence of declarative items.
        (P_Sequence_Of_Statements): Add Handled flag, to indicate
        whether to wrap the result in a block statement.
        * par-ch3.adb (P_Declarative_Item): Rename P_Declarative_Items
        to be P_Declarative_Item, because it really only parses a single
        declarative item, and to avoid conflict with the new
        P_Declarative_Items. Add In_Statements.  We keep the old
        error-recovery mechanisms in place when In_Statements is False.
        When True, we don't want to complain about statements, because
        we are parsing a sequence of statements.
        (P_Identifier_Declarations): If In_Statements, and we see what
        looks like a statement, we no longer give an error. We return to
        P_Sequence_Of_Statements with Done = True, so it can parse the
        statement.
        * par-ch5.adb (P_Sequence_Of_Statements): Call
        P_Declarative_Items to parse declarative items that appear in
        the statement list.  Remove error handling code that complained
        about such items.  Check some errors conservatively.  Wrap the
        result in a block statement when necessary.
        * par-ch11.adb (P_Handled_Sequence_Of_Statements): Pass
        Handled => True to P_Sequence_Of_Statements.
        * types.ads (No, Present): New functions for querying
        Source_Ptrs (equal, not equal No_Location).

Attachment: patch.diff.gz
Description: application/gzip

Reply via email to