xref: /llvm-project/flang/test/Semantics/resolve83.f90 (revision 43a263f570dbe88524ab3689bc994df60c531310)
16c1ac141SIvan Zhechev! RUN: %python %S/test_errors.py %s %flang_fc1
2e17e7173SPete Steinfeldmodule m
3e17e7173SPete Steinfeld
4e17e7173SPete Steinfeld  ! For C1543
5e17e7173SPete Steinfeld  interface intFace
6e17e7173SPete Steinfeld    !WARNING: Attribute 'MODULE' cannot be used more than once
7e17e7173SPete Steinfeld    module pure module real function moduleFunc()
8e17e7173SPete Steinfeld    end function moduleFunc
9e17e7173SPete Steinfeld  end interface
10e17e7173SPete Steinfeld
11e17e7173SPete Steinfeldcontains
12e17e7173SPete Steinfeld
13e17e7173SPete Steinfeld! C1543 A prefix shall contain at most one of each prefix-spec.
14e17e7173SPete Steinfeld!
15e17e7173SPete Steinfeld! R1535 subroutine-stmt is
16e17e7173SPete Steinfeld!   [prefix] SUBROUTINE subroutine-name [ ( [dummy-arg-list] )
17e17e7173SPete Steinfeld!   [proc-language-binding-spec] ]
18e17e7173SPete Steinfeld!
19e17e7173SPete Steinfeld! R1526  prefix is
20e17e7173SPete Steinfeld!   prefix-spec[prefix-spec]...
21e17e7173SPete Steinfeld!
22e17e7173SPete Steinfeld!   prefix-spec values are:
23e17e7173SPete Steinfeld!      declaration-type-spec, ELEMENTAL, IMPURE, MODULE, NON_RECURSIVE,
24e17e7173SPete Steinfeld!      PURE, RECURSIVE
25e17e7173SPete Steinfeld
26e17e7173SPete Steinfeld    !ERROR: FUNCTION prefix cannot specify the type more than once
27e17e7173SPete Steinfeld    real pure real function realFunc()
28e17e7173SPete Steinfeld    end function realFunc
29e17e7173SPete Steinfeld
30e17e7173SPete Steinfeld    !WARNING: Attribute 'ELEMENTAL' cannot be used more than once
31*43a263f5Speter klausler    elemental real elemental function elementalFunc(x)
32*43a263f5Speter klausler      real, value :: x
33*43a263f5Speter klausler      elementalFunc = x
34e17e7173SPete Steinfeld    end function elementalFunc
35e17e7173SPete Steinfeld
36e17e7173SPete Steinfeld    !WARNING: Attribute 'IMPURE' cannot be used more than once
37e17e7173SPete Steinfeld    impure real impure function impureFunc()
38e17e7173SPete Steinfeld    end function impureFunc
39e17e7173SPete Steinfeld
40e17e7173SPete Steinfeld    !WARNING: Attribute 'PURE' cannot be used more than once
41e17e7173SPete Steinfeld    pure real pure function pureFunc()
42e17e7173SPete Steinfeld    end function pureFunc
43e17e7173SPete Steinfeld
44e17e7173SPete Steinfeld    !ERROR: Attributes 'PURE' and 'IMPURE' conflict with each other
45e17e7173SPete Steinfeld    impure real pure function impurePureFunc()
46e17e7173SPete Steinfeld    end function impurePureFunc
47e17e7173SPete Steinfeld
48e17e7173SPete Steinfeld    !WARNING: Attribute 'RECURSIVE' cannot be used more than once
49e17e7173SPete Steinfeld    recursive real recursive function recursiveFunc()
50e17e7173SPete Steinfeld    end function recursiveFunc
51e17e7173SPete Steinfeld
52e17e7173SPete Steinfeld    !WARNING: Attribute 'NON_RECURSIVE' cannot be used more than once
53e17e7173SPete Steinfeld    non_recursive real non_recursive function non_recursiveFunc()
54e17e7173SPete Steinfeld    end function non_recursiveFunc
55e17e7173SPete Steinfeld
56e17e7173SPete Steinfeld    !ERROR: Attributes 'RECURSIVE' and 'NON_RECURSIVE' conflict with each other
57e17e7173SPete Steinfeld    non_recursive real recursive function non_recursiveRecursiveFunc()
58e17e7173SPete Steinfeld    end function non_recursiveRecursiveFunc
59e17e7173SPete Steinfeldend module m
60