2 ** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000.
3 ** See ../LICENSE for license information.
9 ** representation of type qualifiers
16 ** just use tokens to represent type qualifiers
17 ** (tokens are defined in cgrammar.y)
22 QU_CONST, QU_VOLATILE, QU_INLINE,
23 QU_EXTERN, QU_STATIC, QU_AUTO, QU_REGISTER,
24 QU_SHORT, QU_LONG, QU_SIGNED, QU_UNSIGNED,
27 QU_TEMP, QU_SHARED, QU_KEEP, QU_KEPT, QU_PARTIAL, QU_SPECIAL,
28 QU_NULL, QU_RELNULL, QU_NULLTERMINATED,
29 QU_EXPOSED, QU_RETURNED, QU_OBSERVER, QU_UNIQUE,
30 QU_OWNED, QU_DEPENDENT, QU_RELDEF,
32 QU_NEVEREXIT, QU_EXITS, QU_MAYEXIT, QU_TRUEEXIT, QU_FALSEEXIT,
33 QU_UNUSED, QU_EXTERNAL, QU_SEF,
35 QU_ABSTRACT, QU_CONCRETE,
36 QU_MUTABLE, QU_IMMUTABLE,
37 QU_REFCOUNTED, QU_REFS, QU_NEWREF, QU_KILLREF, QU_TEMPREF,
38 QU_TRUENULL, QU_FALSENULL,
39 QU_CHECKED, QU_UNCHECKED, QU_CHECKEDSTRICT, QU_CHECKMOD,
41 QU_PRINTFLIKE, QU_SCANFLIKE, QU_MESSAGELIKE,
46 ** qualifiers correspond to tokens in the grammar:
48 ** standard C qualifiers:
49 ** QCONST QVOLATILE QINLINE QEXTERN QSTATIC QAUTO QREGISTER
50 ** QSHORT QLONG QSIGNED QUNSIGNED
51 ** augmented LCL qualifiers:
52 ** QOUT QONLY QTEMP QSHARED QUNIQUE QYIELD
53 ** QEXITS QMAYEXIT QNULLTERMINATED
56 extern qual qual_fromInt (int p_q) /*@*/ ;
57 extern /*@observer@*/ cstring qual_unparse (qual p_q) /*@*/ ;
59 extern bool qual_equal (qual p_q1, qual p_q2) /*@*/ ;
60 # define qual_equal(q1,q2) ((q1) == (q2))
62 extern bool qual_isUnknown (qual) /*@*/ ;
63 extern bool qual_isTrueNull (qual) /*@*/ ;
64 extern bool qual_isFalseNull (qual) /*@*/ ;
65 extern bool qual_isOwned (qual) /*@*/ ;
66 extern bool qual_isDependent (qual) /*@*/ ;
67 extern bool qual_isRefCounted (qual) /*@*/ ;
68 extern bool qual_isRefs (qual) /*@*/ ;
69 extern bool qual_isNewRef (qual) /*@*/ ;
70 extern bool qual_isKillRef (qual) /*@*/ ;
71 extern bool qual_isTempRef (qual) /*@*/ ;
72 extern bool qual_isLong (qual) /*@*/ ;
73 extern bool qual_isShort (qual) /*@*/ ;
74 extern bool qual_isSigned (qual) /*@*/ ;
75 extern bool qual_isUnsigned (qual) /*@*/ ;
76 extern bool qual_isUnique (qual) /*@*/ ;
77 extern bool qual_isExits (qual) /*@*/ ;
78 extern bool qual_isMayExit (qual) /*@*/ ;
79 extern bool qual_isNeverExit (qual) /*@*/ ;
80 extern bool qual_isTrueExit (qual) /*@*/ ;
81 extern bool qual_isFalseExit (qual) /*@*/ ;
82 extern bool qual_isConst (qual) /*@*/ ;
83 extern bool qual_isVolatile (qual) /*@*/ ;
84 extern bool qual_isInline (qual) /*@*/ ;
85 extern bool qual_isExtern (qual) /*@*/ ;
86 extern bool qual_isStatic (qual) /*@*/ ;
87 extern bool qual_isAuto (qual) /*@*/ ;
88 extern bool qual_isRegister (qual) /*@*/ ;
89 extern bool qual_isOut (qual) /*@*/ ;
90 extern bool qual_isIn (qual) /*@*/ ;
91 extern bool qual_isYield (qual) /*@*/ ;
92 extern bool qual_isOnly (qual) /*@*/ ;
93 extern bool qual_isImpOnly (qual) /*@*/ ;
94 extern bool qual_isPartial (qual) /*@*/ ;
95 extern bool qual_isSpecial (qual) /*@*/ ;
96 extern bool qual_isKeep (qual) /*@*/ ;
97 extern bool qual_isKept (qual) /*@*/ ;
98 extern bool qual_isTemp (qual) /*@*/ ;
99 extern bool qual_isShared (qual) /*@*/ ;
100 extern bool qual_isRelDef (qual) /*@*/ ;
101 extern bool qual_isChecked (qual) /*@*/ ;
102 extern bool qual_isCheckMod (qual) /*@*/ ;
103 extern bool qual_isCheckedStrict (qual) /*@*/ ;
104 extern bool qual_isUnchecked (qual) /*@*/ ;
105 extern bool qual_isNull (qual) /*@*/ ;
106 extern bool qual_isRelNull (qual) /*@*/ ;
107 extern bool qual_isNotNull (qual) /*@*/ ;
108 extern bool qual_isReturned (qual) /*@*/ ;
109 extern bool qual_isExposed (qual) /*@*/ ;
110 extern bool qual_isObserver (qual) /*@*/ ;
111 extern bool qual_isUnused (qual) /*@*/ ;
112 extern bool qual_isExternal (qual) /*@*/ ;
113 extern bool qual_isSef (qual) /*@*/ ;
114 extern bool qual_isAbstract (qual) /*@*/ ;
115 extern bool qual_isConcrete (qual) /*@*/ ;
116 extern bool qual_isMutable (qual) /*@*/ ;
117 extern bool qual_isImmutable (qual) /*@*/ ;
118 extern bool qual_isNullPred (/*@sef@*/ qual) /*@*/ ;
119 extern bool qual_isRefQual (/*@sef@*/ qual) /*@*/ ;
120 extern bool qual_isUndef (/*@sef@*/ qual) /*@*/ ;
121 extern bool qual_isKilled (/*@sef@*/ qual) /*@*/ ;
122 extern /*@unused@*/ bool qual_isTypeQual (/*@sef@*/ qual) /*@*/ ;
123 extern /*@unused@*/ bool qual_isControlQual (/*@sef@*/ qual) /*@*/ ;
124 extern /*@unused@*/ bool qual_isStorageClass (/*@sef@*/ qual) /*@*/ ;
125 extern bool qual_isCQual (/*@sef@*/ qual) /*@*/ ;
126 extern bool qual_isAllocQual (/*@sef@*/ qual) /*@*/ ;
127 extern bool qual_isGlobalQual (/*@sef@*/ qual) /*@*/ ;
128 extern bool qual_isImplied (/*@sef@*/ qual) /*@*/ ;
129 extern bool qual_isExQual (/*@sef@*/ qual) /*@*/ ;
130 extern bool qual_isAliasQual (/*@sef@*/ qual) /*@*/ ;
131 /* start modifications */
132 extern bool qual_isNullTerminated (qual) /*@*/ ;
133 extern bool qual_isBufQualifier (qual) /*@*/ ;
134 /* end modifications */
136 # define qual_isUnknown(q) ((q) == QU_UNKNOWN)
137 # define qual_isTrueNull(q) ((q) == QU_TRUENULL)
138 # define qual_isFalseNull(q) ((q) == QU_FALSENULL)
139 # define qual_isOwned(q) ((q) == QU_OWNED)
140 # define qual_isDependent(q) ((q) == QU_DEPENDENT)
141 # define qual_isRefCounted(q) ((q) == QU_REFCOUNTED)
142 # define qual_isRefs(q) ((q) == QU_REFS)
143 # define qual_isNewRef(q) ((q) == QU_NEWREF)
144 # define qual_isKillRef(q) ((q) == QU_KILLREF)
145 # define qual_isTempRef(q) ((q) == QU_TEMPREF)
146 # define qual_isLong(q) ((q) == QU_LONG)
147 # define qual_isShort(q) ((q) == QU_SHORT)
148 # define qual_isSigned(q) ((q) == QU_SIGNED)
149 # define qual_isUnsigned(q) ((q) == QU_UNSIGNED)
150 # define qual_isUnique(q) ((q) == QU_UNIQUE)
151 # define qual_isExits(q) ((q) == QU_EXITS)
152 # define qual_isMayExit(q) ((q) == QU_MAYEXIT)
153 # define qual_isNeverExit(q) ((q) == QU_NEVEREXIT)
154 # define qual_isTrueExit(q) ((q) == QU_TRUEEXIT)
155 # define qual_isFalseExit(q) ((q) == QU_FALSEEXIT)
156 # define qual_isConst(q) ((q) == QU_CONST)
157 # define qual_isVolatile(q) ((q) == QU_VOLATILE)
158 # define qual_isInline(q) ((q) == QU_INLINE)
159 # define qual_isExtern(q) ((q) == QU_EXTERN)
160 # define qual_isStatic(q) ((q) == QU_STATIC)
161 # define qual_isAuto(q) ((q) == QU_AUTO)
162 # define qual_isRegister(q) ((q) == QU_REGISTER)
163 # define qual_isOut(q) ((q) == QU_OUT)
164 # define qual_isIn(q) ((q) == QU_IN)
165 # define qual_isYield(q) ((q) == QU_YIELD)
166 # define qual_isOnly(q) ((q) == QU_ONLY)
167 # define qual_isImpOnly(q) ((q) == QU_IMPONLY)
168 # define qual_isPartial(q) ((q) == QU_PARTIAL)
169 # define qual_isSpecial(q) ((q) == QU_SPECIAL)
170 # define qual_isKeep(q) ((q) == QU_KEEP)
171 # define qual_isKept(q) ((q) == QU_KEPT)
172 # define qual_isTemp(q) ((q) == QU_TEMP)
173 # define qual_isShared(q) ((q) == QU_SHARED)
174 # define qual_isRelDef(q) ((q) == QU_RELDEF)
175 # define qual_isNull(q) ((q) == QU_NULL)
176 # define qual_isRelNull(q) ((q) == QU_RELNULL)
177 # define qual_isNotNull(q) ((q) == QU_NOTNULL)
178 # define qual_isReturned(q) ((q) == QU_RETURNED)
179 # define qual_isExposed(q) ((q) == QU_EXPOSED)
180 # define qual_isObserver(q) ((q) == QU_OBSERVER)
181 # define qual_isUnused(q) ((q) == QU_UNUSED)
182 # define qual_isExternal(q) ((q) == QU_EXTERNAL)
183 # define qual_isSef(q) ((q) == QU_SEF)
184 # define qual_isAbstract(q) ((q) == QU_ABSTRACT)
185 # define qual_isConcrete(q) ((q) == QU_CONCRETE)
186 # define qual_isMutable(q) ((q) == QU_MUTABLE)
187 # define qual_isImmutable(q) ((q) == QU_IMMUTABLE)
188 # define qual_isChecked(q) ((q) == QU_CHECKED)
189 # define qual_isCheckMod(q) ((q) == QU_CHECKMOD)
190 # define qual_isCheckedStrict(q) ((q) == QU_CHECKEDSTRICT)
191 # define qual_isUnchecked(q) ((q) == QU_UNCHECKED)
192 # define qual_isUndef(q) ((q) == QU_UNDEF)
193 # define qual_isKilled(q) ((q) == QU_KILLED)
194 # define qual_isNullTerminated(q) ((q) == QU_NULLTERMINATED)
196 extern qual qual_createTrueNull (void) /*@*/ ;
197 extern qual qual_createFalseNull (void) /*@*/ ;
198 extern qual qual_createRefCounted (void) /*@*/ ;
199 extern qual qual_createRefs (void) /*@*/ ;
200 extern qual qual_createNewRef (void) /*@*/ ;
201 extern qual qual_createKillRef (void) /*@*/ ;
202 extern qual qual_createTempRef (void) /*@*/ ;
203 extern qual qual_createNotNull (void) /*@*/ ;
204 extern qual qual_createAbstract (void) /*@*/ ;
205 extern qual qual_createConcrete (void) /*@*/ ;
206 extern qual qual_createMutable (void) /*@*/ ;
207 extern qual qual_createImmutable (void) /*@*/ ;
208 extern qual qual_createShort (void) /*@*/ ;
209 extern qual qual_createLong (void) /*@*/ ;
210 extern qual qual_createSigned (void) /*@*/ ;
211 extern qual qual_createUnsigned (void) /*@*/ ;
212 extern qual qual_createUnique (void) /*@*/ ;
213 extern qual qual_createMayExit (void) /*@*/ ;
214 extern qual qual_createExits (void) /*@*/ ;
215 extern qual qual_createNeverExit (void) /*@*/ ;
216 extern qual qual_createFalseExit (void) /*@*/ ;
217 extern qual qual_createTrueExit (void) /*@*/ ;
218 extern qual qual_createConst (void) /*@*/ ;
219 extern qual qual_createVolatile (void) /*@*/ ;
220 extern qual qual_createInline (void) /*@*/ ;
221 extern qual qual_createExtern (void) /*@*/ ;
222 extern qual qual_createStatic (void) /*@*/ ;
223 extern qual qual_createAuto (void) /*@*/ ;
224 extern qual qual_createRegister (void) /*@*/ ;
225 extern qual qual_createOut (void) /*@*/ ;
226 extern qual qual_createIn (void) /*@*/ ;
227 extern qual qual_createYield (void) /*@*/ ;
228 extern qual qual_createOnly (void) /*@*/ ;
229 extern qual qual_createOwned (void) /*@*/ ;
230 extern qual qual_createDependent (void) /*@*/ ;
231 extern qual qual_createRelDef (void) /*@*/ ;
232 extern qual qual_createImpOnly (void) /*@*/ ;
233 extern qual qual_createPartial (void) /*@*/ ;
234 extern qual qual_createSpecial (void) /*@*/ ;
235 extern qual qual_createKeep (void) /*@*/ ;
236 extern qual qual_createKept (void) /*@*/ ;
237 extern qual qual_createTemp (void) /*@*/ ;
238 extern qual qual_createShared (void) /*@*/ ;
239 extern qual qual_createNull (void) /*@*/ ;
240 extern qual qual_createRelNull (void) /*@*/ ;
241 extern qual qual_createReturned (void) /*@*/ ;
242 extern qual qual_createExposed (void) /*@*/ ;
243 extern qual qual_createObserver (void) /*@*/ ;
244 extern qual qual_createUnused (void) /*@*/ ;
245 extern qual qual_createExternal (void) /*@*/ ;
246 extern qual qual_createSef (void) /*@*/ ;
247 extern qual qual_createChecked (void) /*@*/ ;
248 extern qual qual_createCheckMod (void) /*@*/ ;
249 extern qual qual_createUnchecked (void) /*@*/ ;
250 extern qual qual_createCheckedStrict (void) /*@*/ ;
251 extern qual qual_createUndef (void) /*@*/ ;
252 extern qual qual_createKilled (void) /*@*/ ;
253 extern qual qual_createNullTerminated (void) /*@*/ ;
256 extern qual qual_createUnknown (void) /*@*/ ;
257 # define qual_createUnknown() (QU_UNKNOWN)
259 extern qual qual_createPrintfLike (void) /*@*/ ;
260 extern qual qual_createScanfLike (void) /*@*/ ;
261 extern qual qual_createMessageLike (void) /*@*/ ;
263 # define qual_createPrintfLike() (QU_PRINTFLIKE)
264 # define qual_createScanfLike() (QU_SCANFLIKE)
265 # define qual_createMessageLike() (QU_MESSAGELIKE)
268 # define qual_createTrueNull() (QU_TRUENULL)
269 # define qual_createFalseNull() (QU_FALSENULL)
270 # define qual_createRefCounted() (QU_REFCOUNTED)
271 # define qual_createRefs() (QU_REFS)
272 # define qual_createNewRef() (QU_NEWREF)
273 # define qual_createKillRef() (QU_KILLREF)
274 # define qual_createTempRef() (QU_TEMPREF)
275 # define qual_createNotNull() (QU_NOTNULL)
276 # define qual_createAbstract() (QU_ABSTRACT)
277 # define qual_createConcrete() (QU_CONCRETE)
278 # define qual_createMutable() (QU_MUTABLE)
279 # define qual_createImmutable() (QU_IMMUTABLE)
280 # define qual_createShort() (QU_SHORT)
281 # define qual_createLong() (QU_LONG)
282 # define qual_createSigned() (QU_SIGNED)
283 # define qual_createUnsigned() (QU_UNSIGNED)
284 # define qual_createUnique() (QU_UNIQUE)
285 # define qual_createMayExit() (QU_MAYEXIT)
286 # define qual_createExits() (QU_EXITS)
287 # define qual_createNeverExit() (QU_NEVEREXIT)
288 # define qual_createTrueExit() (QU_TRUEEXIT)
289 # define qual_createFalseExit() (QU_FALSEEXIT)
290 # define qual_createConst() (QU_CONST)
291 # define qual_createVolatile() (QU_VOLATILE)
292 # define qual_createInline() (QU_INLINE)
293 # define qual_createExtern() (QU_EXTERN)
294 # define qual_createStatic() (QU_STATIC)
295 # define qual_createAuto() (QU_AUTO)
296 # define qual_createRegister() (QU_REGISTER)
297 # define qual_createOut() (QU_OUT)
298 # define qual_createIn() (QU_IN)
299 # define qual_createYield() (QU_YIELD)
300 # define qual_createOnly() (QU_ONLY)
301 # define qual_createOwned() (QU_OWNED)
302 # define qual_createDependent() (QU_DEPENDENT)
303 # define qual_createRelDef() (QU_RELDEF)
304 # define qual_createImpOnly() (QU_IMPONLY)
305 # define qual_createPartial() (QU_PARTIAL)
306 # define qual_createSpecial() (QU_SPECIAL)
307 # define qual_createKeep() (QU_KEEP)
308 # define qual_createKept() (QU_KEPT)
309 # define qual_createTemp() (QU_TEMP)
310 # define qual_createShared() (QU_SHARED)
311 # define qual_createNull() (QU_NULL)
312 # define qual_createRelNull() (QU_RELNULL)
313 # define qual_createReturned() (QU_RETURNED)
314 # define qual_createExposed() (QU_EXPOSED)
315 # define qual_createObserver() (QU_OBSERVER)
316 # define qual_createUnused() (QU_UNUSED)
317 # define qual_createExternal() (QU_EXTERNAL)
318 # define qual_createSef() (QU_SEF)
319 # define qual_createChecked() (QU_CHECKED)
320 # define qual_createCheckMod() (QU_CHECKMOD)
321 # define qual_createCheckedStrict() (QU_CHECKEDSTRICT)
322 # define qual_createUnchecked() (QU_UNCHECKED)
323 # define qual_createUndef() (QU_UNDEF)
324 # define qual_createKilled() (QU_KILLED)
325 # define qual_createNullTerminated() (QU_NULLTERMINATED)
327 extern bool qual_isGlobCheck (/*@sef@*/ qual p_q) /*@*/ ;
328 # define qual_isGlobCheck(q) \
329 (qual_isChecked (q) || qual_isCheckMod (q) \
330 || qual_isUnchecked (q) || qual_isCheckedStrict (q))
332 # define qual_isNullPred(q) \
333 (qual_isTrueNull (q) || qual_isFalseNull (q))
335 # define qual_isRefQual(q) \
336 (qual_isRefCounted(q) || qual_isRefs(q) || qual_isNewRef (q) || \
337 qual_isKillRef (q) || qual_isTempRef (q))
339 # define qual_isTypeQual(q) \
340 (qual_isAbstract(q) || qual_isMutable(q) || qual_isImmutable(q))
342 # define qual_isControlQual(q) (qual_isExits(q) || qual_isMayExit (q))
343 # define qual_isStorageClass(q) (qual_isExtern(q) || qual_isStatic(q))
344 # define qual_isCQual(q) \
345 (qual_isAuto(q) || qual_isRegister(q) || qual_isInline(q) \
346 || qual_isConst(q) || qual_isVolatile(q) || qual_isShort(q) \
347 || qual_isLong (q) || qual_isSigned (q) || qual_isUnsigned (q))
349 # define qual_isAllocQual(q) \
350 (qual_isOut (q) || qual_isIn (q) || qual_isSpecial (q) \
351 || qual_isPartial (q) || qual_isRelDef (q))
353 /* start modifications */
354 /* This is used to check if we the qualifier matches any of the
355 len/size/nullterminated types */
357 # define qual_isBufQualifier(q) \
358 (qual_isNullTerminated(q))
360 /* end of modification/s */
362 # define qual_isGlobalQual(q) \
363 (qual_isUndef(q) || qual_isKilled (q))
365 # define qual_isImplied(q) (qual_isImpOnly(q))
367 # define qual_isExQual(q) (qual_isExposed (q) || qual_isObserver (q))
369 # define qual_isAliasQual(q) \
370 (qual_isOnly(q) || qual_isImpOnly(q) || qual_isTemp(q) \
371 || qual_isOwned (q) || qual_isShared (q) || qual_isUnique (q) \
372 || qual_isDependent (q) || qual_isKeep (q) || qual_isKept (q))
374 extern bool qual_isExitQual (/*@sef@*/ qual p_q) /*@*/ ;
375 # define qual_isExitQual(q) \
376 (qual_isExits (q) || qual_isNeverExit (q) || qual_isMayExit (q) \
377 || qual_isTrueExit (q) || qual_isFalseExit (q))
380 # error "Multiple include"