================ @@ -50,6 +52,35 @@ OpenACCDirectiveKind ParseOpenACCDirectiveKind(Parser &P) { 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(); + switch (DirKind) { + default: + // Nothing to do except in the below cases, as they should be diagnosed as + // a clause. + break; + case OpenACCDirectiveKind::Parallel: + if (P.getPreprocessor().getSpelling(SecondTok) == "loop") { + P.ConsumeToken(); + return OpenACCDirectiveKind::ParallelLoop; + } + break; + case OpenACCDirectiveKind::Serial: + if (P.getPreprocessor().getSpelling(SecondTok) == "loop") { + P.ConsumeToken(); + return OpenACCDirectiveKind::SerialLoop; + } + break; + case OpenACCDirectiveKind::Kernels: + if (P.getPreprocessor().getSpelling(SecondTok) == "loop") { + P.ConsumeToken(); + return OpenACCDirectiveKind::KernelsLoop; + } + break; + } ---------------- alexey-bataev wrote:
```suggestion if (GetOpenACCDirectiveKind(P.getPreprocessor().getSpelling(SecondTok)) == OpenACCDirectiveKind::Loop) { P.ConsumeToken(); switch (DirKind) { default: // error?? break; case OpenACCDirectiveKind::Parallel: return OpenACCDirectiveKind::ParallelLoop; case OpenACCDirectiveKind::Serial: return OpenACCDirectiveKind::SerialLoop; case OpenACCDirectiveKind::Kernels: return OpenACCDirectiveKind::KernelsLoop; } } ``` https://github.com/llvm/llvm-project/pull/72692 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits