| 6346 | } |
| 6347 | |
| 6348 | void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& qualifier, TType& type) |
| 6349 | { |
| 6350 | if (qualifier.isMemory()) { |
| 6351 | type.getQualifier().volatil = qualifier.volatil; |
| 6352 | type.getQualifier().nontemporal = qualifier.nontemporal; |
| 6353 | type.getQualifier().coherent = qualifier.coherent; |
| 6354 | type.getQualifier().devicecoherent = qualifier.devicecoherent ; |
| 6355 | type.getQualifier().queuefamilycoherent = qualifier.queuefamilycoherent; |
| 6356 | type.getQualifier().workgroupcoherent = qualifier.workgroupcoherent; |
| 6357 | type.getQualifier().subgroupcoherent = qualifier.subgroupcoherent; |
| 6358 | type.getQualifier().shadercallcoherent = qualifier.shadercallcoherent; |
| 6359 | type.getQualifier().nonprivate = qualifier.nonprivate; |
| 6360 | type.getQualifier().readonly = qualifier.readonly; |
| 6361 | type.getQualifier().writeonly = qualifier.writeonly; |
| 6362 | type.getQualifier().restrict = qualifier.restrict; |
| 6363 | } |
| 6364 | |
| 6365 | if (qualifier.isAuxiliary() || |
| 6366 | qualifier.isInterpolation()) |
| 6367 | error(loc, "cannot use auxiliary or interpolation qualifiers on a function parameter", "", ""); |
| 6368 | if (qualifier.hasLayout()) |
| 6369 | error(loc, "cannot use layout qualifiers on a function parameter", "", ""); |
| 6370 | if (qualifier.invariant) |
| 6371 | error(loc, "cannot use invariant qualifier on a function parameter", "", ""); |
| 6372 | if (qualifier.isNoContraction()) { |
| 6373 | if (qualifier.isParamOutput()) |
| 6374 | type.getQualifier().setNoContraction(); |
| 6375 | else |
| 6376 | warn(loc, "qualifier has no effect on non-output parameters", "precise", ""); |
| 6377 | } |
| 6378 | if (qualifier.isNonUniform()) |
| 6379 | type.getQualifier().nonUniform = qualifier.nonUniform; |
| 6380 | if (qualifier.isSpirvByReference()) |
| 6381 | type.getQualifier().setSpirvByReference(); |
| 6382 | if (qualifier.isSpirvLiteral()) { |
| 6383 | if (type.getBasicType() == EbtFloat || type.getBasicType() == EbtInt || type.getBasicType() == EbtUint || |
| 6384 | type.getBasicType() == EbtBool) |
| 6385 | type.getQualifier().setSpirvLiteral(); |
| 6386 | else |
| 6387 | error(loc, "cannot use spirv_literal qualifier", type.getBasicTypeString().c_str(), ""); |
| 6388 | } |
| 6389 | |
| 6390 | paramCheckFixStorage(loc, qualifier.storage, type); |
| 6391 | } |
| 6392 | |
| 6393 | void TParseContext::nestedBlockCheck(const TSourceLoc& loc, const bool allowedInnerStruct) |
| 6394 | { |
no test coverage detected