================
@@ -7842,6 +7842,47 @@ 
SemaOpenMP::checkOpenMPDeclareVariantFunction(SemaOpenMP::DeclGroupPtrTy DG,
   return std::make_pair(FD, cast<Expr>(DRE));
 }
 
+/// Check prefer_type fr()/attr() arguments in an OMPInteropInfo for validity.
+/// Returns true if all arguments are valid; emits a diagnostic and returns
+/// false on the first invalid argument.
+static bool checkPreferTypeArgs(SemaOpenMP &S, const OMPInteropInfo &Info) {
+  for (const OMPInteropPref &P : Info.Prefs) {
+    const Expr *E = P.Fr;
+    if (!E) {
+      assert(Info.HasPreferAttrs && "null Fr requires OMP 6.0 syntax");
+    } else if (!E->isValueDependent() && !E->isTypeDependent() &&
+               !E->isInstantiationDependent() &&
+               !E->containsUnexpandedParameterPack()) {
+      if (!E->isIntegerConstantExpr(S.getASTContext()) &&
+          !isa<StringLiteral>(E)) {
+        S.Diag(E->getExprLoc(), diag::err_omp_interop_prefer_type);
+        return false;
+      }
+    }
+    for (const Expr *A : P.Attrs) {
+      if (A->isValueDependent() || A->isTypeDependent() ||
+          A->isInstantiationDependent() || 
A->containsUnexpandedParameterPack())
+        continue;
+      const auto *SL = dyn_cast<StringLiteral>(A);
+      if (!SL) {
+        S.Diag(A->getExprLoc(), diag::err_omp_interop_attr_not_string);
+        return false;
+      }
+      if (!SL->getString().starts_with("ompx_")) {
+        S.Diag(A->getExprLoc(), diag::err_omp_interop_attr_missing_ompx_prefix)
+            << SL->getString();
+        return false;
+      }
+      if (SL->getString().contains(',')) {
+        S.Diag(A->getExprLoc(), diag::err_omp_interop_attr_contains_comma)
+            << SL->getString();
+        return false;
+      }
+    }
+  }
+  return true;
+}
----------------
zahiraam wrote:

Something like this?

```suggestion
static bool checkPreferTypeArgs(SemaOpenMP &S, const OMPInteropInfo &Info) {    
                                                                                
                                             
    auto isDependent = [](const Expr *E) {
      return E->isValueDependent() || E->isTypeDependent() ||                   
                                                                                
                                               
             E->isInstantiationDependent() || 
E->containsUnexpandedParameterPack();                                           
                                                                                
 
    };                                                                          
                                                                                
                                              
    for (const OMPInteropPref &P : Info.Prefs) {                                
                                                                                
                                               
      const Expr *E = P.Fr;
      if (!E) {
        assert(Info.HasPreferAttrs && "null Fr requires OMP 6.0 syntax");
      } else if (!isDependent(E)) {
        if (!E->isIntegerConstantExpr(S.getASTContext()) &&
            !isa<StringLiteral>(E)) {
          S.Diag(E->getExprLoc(), diag::err_omp_interop_prefer_type);
          return false;
        }
      }
      for (const Expr *A : P.Attrs) {
        if (isDependent(A))
          continue;
        const auto *SL = dyn_cast<StringLiteral>(A);
        if (!SL) {
          S.Diag(A->getExprLoc(), diag::err_omp_interop_attr_not_string);       
                                                                                
                                               
          return false;                                                         
                                                                                
                                               
        }                                                                       
                                                                                
                                            
        StringRef Str = SL->getString();                                        
                                                                                
                                               
        if (!Str.starts_with("ompx_")) {                                        
                                                                                
                                               
          S.Diag(A->getExprLoc(), 
diag::err_omp_interop_attr_missing_ompx_prefix)                                 
                                                                                
             
              << Str;                                                           
                                                                                
                                               
          return false;                                                         
                                                                                
                                               
        }                                                                       
                                                                                
                                               
        if (Str.contains(',')) {                                                
                                                                                
                                               
          S.Diag(A->getExprLoc(), diag::err_omp_interop_attr_contains_comma)    
                                                                                
                                               
              << Str;                                                           
                                                                                
                                               
          return false;                                                         
                                                                                
                                               
        }                                                                       
                                                                                
                                               
      }           
    }                                                                           
                                                                                
                                               
    return true;  
  }
```

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

Reply via email to