(TranslationUnit
    [(Subroutine
        a1
        [(n)
        (A)
        (B)]
        []
        ()
        (TriviaNode
            []
            [(EndOfLine)
            (EndOfLine)]
        )
        []
        []
        []
        [(Declaration
            (AttrType
                TypeInteger
                []
                ()
                ()
                None
            )
            [(AttrIntent
                In
            )]
            [(n
            []
            []
            ()
            ()
            None
            ())]
            ()
        )
        (Declaration
            (AttrType
                TypeReal
                []
                ()
                ()
                None
            )
            [(AttrIntent
                In
            )]
            [(A
            [(1
            n
            DimensionExpr)]
            []
            ()
            ()
            None
            ())]
            ()
        )
        (Declaration
            (AttrType
                TypeReal
                []
                ()
                ()
                None
            )
            [(AttrIntent
                Out
            )]
            [(B
            [(1
            n
            DimensionExpr)]
            []
            ()
            ()
            None
            ())]
            ()
        )
        (Declaration
            (AttrType
                TypeInteger
                []
                ()
                ()
                None
            )
            []
            [(i
            []
            []
            ()
            ()
            None
            ())]
            ()
        )]
        [(Pragma
            0
            OMPPragma
            .false.
            "parallel do"
            []
            ()
        )
        (DoLoop
            0
            ()
            0
            i
            2
            N
            ()
            [(Assignment
                0
                (FuncCallOrArray
                    B
                    []
                    [(()
                    i
                    ()
                    0)]
                    []
                    []
                    []
                )
                (/ (+ (FuncCallOrArray
                    A
                    []
                    [(()
                    i
                    ()
                    0)]
                    []
                    []
                    []
                ) (FuncCallOrArray
                    A
                    []
                    [(()
                    (- i 1)
                    ()
                    0)]
                    []
                    []
                    []
                )) 2)
                ()
            )]
            ()
            ()
        )
        (Pragma
            0
            OMPPragma
            .true.
            "parallel do"
            []
            ()
        )]
        []
        []
    )
    (Subroutine
        parallel_sum
        [(n)
        (a)]
        []
        ()
        ()
        []
        []
        []
        [(Declaration
            (AttrType
                TypeInteger
                []
                ()
                ()
                None
            )
            [(AttrIntent
                In
            )]
            [(n
            []
            []
            ()
            ()
            None
            ())]
            ()
        )
        (Declaration
            (AttrType
                TypeInteger
                []
                ()
                ()
                None
            )
            [(AttrIntent
                In
            )]
            [(a
            [(()
            ()
            DimensionExpr)]
            []
            ()
            ()
            None
            ())]
            ()
        )
        (Declaration
            (AttrType
                TypeInteger
                []
                ()
                ()
                None
            )
            []
            [(partial_sum
            []
            []
            ()
            ()
            None
            ())
            (total_sum
            []
            []
            ()
            ()
            None
            ())
            (i
            []
            []
            ()
            ()
            None
            ())]
            ()
        )]
        [(Assignment
            0
            partial_sum
            0
            ()
        )
        (Assignment
            0
            total_sum
            0
            (TriviaNode
                []
                [(EndOfLine)
                (EndOfLine)]
            )
        )
        (Pragma
            0
            OMPPragma
            .false.
            "parallel"
            [(String "private(partial_sum)" ())
            (String "shared(total_sum)" ())]
            ()
        )
        (Pragma
            0
            OMPPragma
            .false.
            "do"
            []
            ()
        )
        (DoLoop
            0
            ()
            0
            i
            1
            n
            ()
            [(Assignment
                0
                partial_sum
                (+ partial_sum (FuncCallOrArray
                    a
                    []
                    [(()
                    i
                    ()
                    0)]
                    []
                    []
                    []
                ))
                ()
            )]
            ()
            ()
        )
        (Pragma
            0
            OMPPragma
            .true.
            "do"
            []
            (TriviaNode
                []
                [(EndOfLine)
                (EndOfLine)
                (Comment
                    "! TODO:"
                )
                (Comment
                    "! !$omp critical"
                )
                (Comment
                    "!     total_sum = total_sum + partial_sum"
                )
                (Comment
                    "! !$omp end critical"
                )]
            )
        )
        (Pragma
            0
            OMPPragma
            .true.
            "parallel"
            []
            ()
        )]
        []
        []
    )]
)
