[clang] [OpenACC] Implement compound construct parsing (PR #72692)

Erich Keane via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 17 13:50:52 PST 2023


================
@@ -45,11 +47,36 @@ OpenACCDirectiveKind ParseOpenACCDirectiveKind(Parser &P) {
   P.ConsumeToken();
   std::string FirstTokSpelling = P.getPreprocessor().getSpelling(FirstTok);
 
-  OpenACCDirectiveKind DirKind = GetOpenACCDirectiveKind(FirstTokSpelling);
+  OpenACCDirectiveKind DirKind = getOpenACCDirectiveKind(FirstTokSpelling);
 
   if (DirKind == OpenACCDirectiveKind::Invalid)
     P.Diag(FirstTok, diag::err_acc_invalid_directive) << FirstTokSpelling;
 
+  // Combined Constructs allows parallel loop, serial loop, or kernels loop. Any
+  // other attempt at a combined construct will be diagnosed as an invalid
+  // clause.
+  Token SecondTok = P.getCurToken();
+  if (!SecondTok.isAnnotation() &&
+      P.getPreprocessor().getSpelling(SecondTok) == "loop") {
----------------
erichkeane wrote:

Hmm... while I see the benefit of that, I'm actually a bit concerned about the performance implications of doing what amounts to a dozen string comparisons in that case, vs 1 here.  Extracting this above has already increased the number of checks significantly (by checking for loop ALWAYS rather than just 1x), but it seems significantly worse to do multiples here.  WDYT?

https://github.com/llvm/llvm-project/pull/72692


More information about the cfe-commits mailing list