================
@@ -17424,6 +17437,52 @@ OMPClause 
*SemaOpenMP::ActOnOpenMPThreadsetClause(OpenMPThreadsetKind Kind,
       OMPThreadsetClause(Kind, KindLoc, StartLoc, LParenLoc, EndLoc);
 }
 
+static OMPClause *CreateTransparentClause(Sema &SemaRef, ASTContext &Ctx,
+                                          Expr *ImpexTypeArg,
+                                          SourceLocation StartLoc,
+                                          SourceLocation LParenLoc,
+                                          SourceLocation EndLoc) {
+  ExprResult ER = SemaRef.DefaultLvalueConversion(ImpexTypeArg);
+  if (ER.isInvalid())
+    return nullptr;
+
+  return new (Ctx) OMPTransparentClause(ER.get(), StartLoc, LParenLoc, EndLoc);
+}
+
+OMPClause *SemaOpenMP::ActOnOpenMPTransparentClause(Expr *ImpexTypeArg,
+                                                    SourceLocation StartLoc,
+                                                    SourceLocation LParenLoc,
+                                                    SourceLocation EndLoc) {
+  QualType Ty = ImpexTypeArg->getType();
+
+  if (const auto *TT = Ty->getAs<TypedefType>()) {
+    const TypedefNameDecl *TypedefDecl = TT->getDecl();
+    llvm::StringRef TypedefName = TypedefDecl->getName();
+    IdentifierInfo &II = SemaRef.PP.getIdentifierTable().get(TypedefName);
+    ParsedType ImpexTy =
+        SemaRef.getTypeName(II, StartLoc, SemaRef.getCurScope());
+    if (!ImpexTy.getAsOpaquePtr() || ImpexTy.get().isNull()) {
+      SemaRef.Diag(StartLoc, diag::err_omp_implied_type_not_found)
+          << TypedefName;
+      return nullptr;
+    }
+    return CreateTransparentClause(SemaRef, getASTContext(), ImpexTypeArg,
+                                   StartLoc, LParenLoc, EndLoc);
+  }
+
+  if (Ty->isEnumeralType())
----------------
abhinavgaba wrote:

I think it's a quality-of-implementation/usability vs maintainability decision. 
From OpenMP's point of view, the impex-type argument does not need to be a 
constant, so a user can have something like:

```c
// (A)
int var = 123;
... transparent(var)
```

in which case, this cannot be diagnosed at compile-time, so the runtime will 
have to handle it.

Unlike `allocator_handle` type, for which OpenMP says it can be a scoped enum 
in C++, which would prevent such cases involving using an integer as an 
argument, there is no such wording for `OpenMP impex type`, which means such 
implicit conversion is allowed even for C++ as it's just defined as a `typedef 
enum` in omp.h.

While for cases where the user specifies a constant, it can theoretically be 
diagnosed at compile-time, it's not mandatory as the runtime should do it 
eventually anyway.

It is however more user-friendly to diagnose at compile-time, at the cost of 
adding some redundancy.

```c
// (B)
... transparent(123) // Can be diagnosed at compile-time, but if not,
                     // the runtime can do it since it has to handle (A) anyway.
```


https://github.com/llvm/llvm-project/pull/166810
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to