[PATCH] D114688: [Clang] Add __builtin_elementwise_ceil

Florian Hahn via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 1 03:57:06 PST 2021


fhahn added inline comments.


================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:11337
 
+def err_builtin_float_invalid_arg_type: Error <
+  "%ordinal0 argument must be a "
----------------
There's no need to add a new error message here. `err_builtin_invalid_arg_type` already uses `%select` to support different types in the message. You can just add a new option to the `%select{}` (done by `|new option`). You need to adjust the index passed to  `Diag()` accordingly.


================
Comment at: clang/lib/Sema/SemaChecking.cpp:16721
 
+bool Sema::SemaBuiltinElementwiseMathFloatArg(CallExpr *TheCall) {
+  if (checkArgCount(*this, TheCall, 1))
----------------
fhahn wrote:
> If I understand correctly, this is similar to `SemaBuiltinElementwiseMathOneArg`, but with the additional restriction to only allow floating point element types? 
> 
> Do you think it would be possible to extend `SemaBuiltinElementwiseMathOneArg` to handle this case directly, without needing to duplicate most of the other logic?
The latest version s till duplicates most of the logic unfortunately. I think it would be good to allow the caller of `SemaBuiltinElementwiseMathOneArg` to specify additional restrictions on the argument type. This could be done by adding an extra callback argument, like below:

```
-bool Sema::SemaBuiltinElementwiseMathOneArg(CallExpr *TheCall) {
+bool Sema::SemaBuiltinElementwiseMathOneArg(
+    CallExpr *TheCall,
+    std::function<bool(QualType ArgTy, SourceLocation ArgLoc)>
+        ExtraCheckArgTy) {
   if (checkArgCount(*this, TheCall, 1))
     return true;

@@ -16707,16 +16734,10 @@ bool Sema::SemaBuiltinElementwiseMathOneArg(CallExpr *TheCall) {

   TheCall->setArg(0, A.get());
   QualType TyA = A.get()->getType();
-  if (checkMathBuiltinElementType(*this, ArgLoc, TyA))
+  if (checkMathBuiltinElementType(*this, ArgLoc, TyA) ||
+      ExtraCheckArgTy(TyA, ArgLoc))
     return true;

-  QualType EltTy = TyA;
-  if (auto *VecTy = EltTy->getAs<VectorType>())
-    EltTy = VecTy->getElementType();
-  if (EltTy->isUnsignedIntegerType())
-    return Diag(ArgLoc, diag::err_builtin_invalid_arg_type)
-           << 1 << /*signed integer or float ty*/ 3 << TyA;
-
   TheCall->setType(TyA);
   return false;
 }
```

At the call site, it would look something like

```
-    if (SemaBuiltinElementwiseMathOneArg(TheCall))
+    if (SemaBuiltinElementwiseMathOneArg(
+            TheCall, [this](QualType ArgTy, SourceLocation ArgLoc) -> bool {
+              QualType EltTy = ArgTy;
+              if (auto *VecTy = EltTy->getAs<VectorType>())
+                EltTy = VecTy->getElementType();
+              if (EltTy->isUnsignedIntegerType())
+                return Diag(ArgLoc, diag::err_builtin_invalid_arg_type)
+                       << 1 << /*signed integer or float ty*/ 3 << ArgTy;
+              return false;
+            }))
       return ExprError();
     break;
```


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D114688/new/

https://reviews.llvm.org/D114688



More information about the cfe-commits mailing list