Source file standard.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
[%%metapackage "metapp"]
[%%metadir "config/.clangml_config.objs/byte"]

type t =
  | C89
  | C94
  | Gnu89
  | C99
  | Gnu99
  | C11
  | Gnu11
  | C17
  | Gnu17
  | C2x
  | Gnu2x
  | Cxx98
  | Gnucxx98
  | Cxx11
  | Gnucxx11
  | Cxx14
  | Gnucxx14
  | Cxx17
  | Gnucxx17
  | Cxx20
  | Gnucxx20
  | Opencl10
  | Opencl11
  | Opencl12
  | Opencl20
  | Openclcpp10
  | Openclcpp2021
  | Cuda
  | Hip
      [@@deriving refl]

exception Unavailable of t

let to_clang : t -> Clang__bindings.clang_ext_langstandards = function
  | C89 -> C89
  | C94 -> C94
  | Gnu89 -> Gnu89
  | C99 -> C99
  | Gnu99 -> Gnu99
  | C11 -> C11
  | Gnu11 -> Gnu11
  | C17 ->
      [%meta if Clangml_config.version.major >= 6 then [%expr
        C17]
      else [%expr
        raise (Unavailable C17)]]
  | Gnu17 ->
      [%meta if Clangml_config.version.major >= 6 then [%expr
        Gnu17]
      else [%expr
        raise (Unavailable Gnu17)]]
  | C2x ->
      [%meta if Clangml_config.version.major >= 9 then [%expr
        C2x]
      else [%expr
        raise (Unavailable C2x)]]
  | Gnu2x ->
      [%meta if Clangml_config.version.major >= 9 then [%expr
        Gnu2x]
      else [%expr
        raise (Unavailable Gnu2x)]]
  | Cxx98 -> Cxx98
  | Gnucxx98 -> Gnucxx98
  | Cxx11 -> Cxx11
  | Gnucxx11 -> Gnucxx11
  | Cxx14 ->
      [%meta if
        Clangml_config.version >= { major = 3; minor = 5; subminor = 0 }
      then [%expr
        Cxx14]
      else [%expr
        Cxx1y]]
  | Gnucxx14 ->
      [%meta if
        Clangml_config.version >= { major = 3; minor = 5; subminor = 0 }
      then [%expr
        Gnucxx14]
      else [%expr
        Gnucxx1y]]
  | Cxx17 ->
      [%meta if Clangml_config.version.major >= 5 then [%expr
        Cxx17]
      else if
        Clangml_config.version >= { major = 3; minor = 5; subminor = 0 }
      then [%expr
        Cxx1z]
      else [%expr
        raise (Unavailable Cxx17)]]
  | Gnucxx17 ->
      [%meta if Clangml_config.version.major >= 5 then [%expr
        Gnucxx17]
      else if
        Clangml_config.version >= { major = 3; minor = 5; subminor = 0 }
      then [%expr
        Gnucxx1z]
      else [%expr
        raise (Unavailable Gnucxx17)]]
  | Cxx20 ->
      [%meta if Clangml_config.version.major >= 10 then [%expr
        Cxx20]
      else if Clangml_config.version.major >= 5 then [%expr
        Cxx2a]
      else [%expr
        raise (Unavailable Cxx20)]]
  | Gnucxx20 ->
      [%meta if Clangml_config.version.major >= 10 then [%expr
        Gnucxx20]
      else if Clangml_config.version.major >= 5 then [%expr
        Gnucxx2a]
      else [%expr
        raise (Unavailable Gnucxx20)]]
  | Opencl10 ->
      [%meta if Clangml_config.version.major >= 5 then [%expr
        Opencl10]
      else [%expr
        raise (Unavailable Opencl10)]]
  | Opencl11 -> Opencl11
  | Opencl12 -> Opencl12
  | Opencl20 ->
      [%meta if
        Clangml_config.version >= { major = 3; minor = 6; subminor = 0 }
      then [%expr
        Opencl20]
      else [%expr
        raise (Unavailable Opencl20)]]
  | Openclcpp10 ->
      [%meta if Clangml_config.version.major >= 14 then [%expr
        Openclcpp10]
      else if Clangml_config.version.major >= 7 then [%expr
        Openclcpp]
      else [%expr
        raise (Unavailable Openclcpp10)]]
  | Openclcpp2021 ->
      [%meta if Clangml_config.version.major >= 14 then [%expr
        Openclcpp2021]
      else [%expr
        raise (Unavailable Openclcpp2021)]]
  | Cuda -> Cuda
  | Hip ->
      [%meta if Clangml_config.version.major >= 7 then [%expr
        Hip]
      else [%expr
        raise (Unavailable Hip)]]