[clang] [llvm] [HLSL][DXIL] Implement `refract` intrinsic (PR #147342)
Sarah Spall via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 15 11:55:29 PDT 2025
================
@@ -46,6 +46,47 @@ static bool CheckAllArgsHaveSameType(Sema *S, CallExpr *TheCall) {
return false;
}
+static bool CheckAllArgTypesAreCorrect(
+ Sema *S, CallExpr *TheCall,
+ llvm::ArrayRef<
+ llvm::function_ref<bool(Sema *, SourceLocation, int, QualType)>>
+ Checks) {
+ unsigned NumArgs = TheCall->getNumArgs();
+ assert(Checks.size() == NumArgs &&
+ "Wrong number of checks for Number of args.");
+ // Apply each check to the corresponding argument
+ for (unsigned I = 0; I < NumArgs; ++I) {
+ Expr *Arg = TheCall->getArg(I);
+ if (Checks[I](S, Arg->getBeginLoc(), I + 1, Arg->getType()))
+ return true;
+ }
+ return false;
+}
+
+static bool CheckFloatOrHalfRepresentation(Sema *S, SourceLocation Loc,
+ int ArgOrdinal,
+ clang::QualType PassedType) {
+ clang::QualType BaseType =
+ PassedType->isVectorType()
+ ? PassedType->castAs<clang::VectorType>()->getElementType()
+ : PassedType;
+ if (!BaseType->isHalfType() && !BaseType->isFloat32Type())
+ return S->Diag(Loc, diag::err_builtin_invalid_arg_type)
+ << ArgOrdinal << /* scalar or vector of */ 5 << /* no int */ 0
+ << /* half or float */ 2 << PassedType;
+ return false;
+}
+
+static bool CheckFloatOrHalfScalarRepresentation(Sema *S, SourceLocation Loc,
+ int ArgOrdinal,
+ clang::QualType PassedType) {
+ if (!PassedType->isHalfType() && !PassedType->isFloat32Type())
----------------
spall wrote:
add
```
&& !PassedType->isFloat16Type()
```
https://github.com/llvm/llvm-project/pull/147342
More information about the llvm-commits
mailing list