1! { dg-do compile }
2! { dg-options "-O2" }
3!
4! PR fortran/52751 (top, "module mod")
5! PR fortran/40973 (bottom, "module m"
6!
7! Ensure that (only) those module variables and procedures which are PRIVATE
8! and have no C-binding label are optimized away.
9!
10      module mod
11        integer :: aa
12        integer, private :: iii
13        integer, private, bind(C) :: jj             ! { dg-warning "PRIVATE but has been given the binding label" }
14        integer, private, bind(C,name='lll') :: kk  ! { dg-warning "PRIVATE but has been given the binding label" }
15        integer, private, bind(C,name='') :: mmmm
16        integer, bind(C) :: nnn
17        integer, bind(C,name='oo') :: pp
18        integer, bind(C,name='') :: qq
19      end module mod
20
21      ! { dg-final { scan-assembler "__mod_MOD_aa" } }
22      ! { dg-final { scan-assembler-not "iii" } }
23      ! { dg-final { scan-assembler "jj" } }
24      ! { dg-final { scan-assembler "lll" } }
25      ! { dg-final { scan-assembler-not "kk" } }
26      ! { dg-final { scan-assembler-not "mmmm" } }
27      ! { dg-final { scan-assembler "nnn" } }
28      ! { dg-final { scan-assembler "oo" } }
29      ! { dg-final { scan-assembler "__mod_MOD_qq" } }
30
31MODULE M
32  PRIVATE :: two, three, four, six
33  PUBLIC :: one, seven, eight, ten
34CONTAINS
35  SUBROUTINE one(a)
36    integer :: a
37    a = two()
38  END SUBROUTINE one
39  integer FUNCTION two()
40     two = 42
41  END FUNCTION two
42  integer FUNCTION three() bind(C) ! { dg-warning "PRIVATE but has been given the binding label" }
43     three = 43
44  END FUNCTION three
45  integer FUNCTION four() bind(C, name='five') ! { dg-warning "PRIVATE but has been given the binding label" }
46     four = 44
47  END FUNCTION four
48  integer FUNCTION six() bind(C, name='')
49     six = 46
50  END FUNCTION six
51  integer FUNCTION seven() bind(C)
52     seven = 46
53  END FUNCTION seven
54  integer FUNCTION eight() bind(C, name='nine')
55     eight = 48
56  END FUNCTION eight
57  integer FUNCTION ten() bind(C, name='')
58     ten = 48
59  END FUNCTION ten
60END MODULE
61
62! { dg-final { scan-assembler "__m_MOD_one" } }
63! { dg-final { scan-assembler-not "two" } }
64! { dg-final { scan-assembler "three" } }
65! { dg-final { scan-assembler-not "four" } }
66! { dg-final { scan-assembler "five" } }
67! { dg-final { scan-assembler-not "six" } }
68! { dg-final { scan-assembler "seven" } }
69! { dg-final { scan-assembler "nine" } }
70! { dg-final { scan-assembler "__m_MOD_ten" } }
71