diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -2115,9 +2115,18 @@ ParsingOpenMPDirectiveRAII NormalScope(*this, /*Value=*/false); llvm::SmallVector Decls; - DKind = parseOpenMPDirectiveKind(*this); - while (DKind != OMPD_end_declare_target && Tok.isNot(tok::eof) && - Tok.isNot(tok::r_brace)) { + while (Tok.isNot(tok::eof) && Tok.isNot(tok::r_brace)) { + if (Tok.isAnnotation() && Tok.is(tok::annot_pragma_openmp)) { + TentativeParsingAction TPA(*this); + ConsumeAnnotationToken(); + DKind = parseOpenMPDirectiveKind(*this); + if (DKind != OMPD_end_declare_target) + TPA.Revert(); + else + TPA.Commit(); + } + if (DKind == OMPD_end_declare_target) + break; DeclGroupPtrTy Ptr; // Here we expect to see some function declaration. if (AS == AS_none) { @@ -2133,15 +2142,6 @@ DeclGroupRef Ref = Ptr.get(); Decls.append(Ref.begin(), Ref.end()); } - if (Tok.isAnnotation() && Tok.is(tok::annot_pragma_openmp)) { - TentativeParsingAction TPA(*this); - ConsumeAnnotationToken(); - DKind = parseOpenMPDirectiveKind(*this); - if (DKind != OMPD_end_declare_target) - TPA.Revert(); - else - TPA.Commit(); - } } ParseOMPEndDeclareTargetDirective(DKind, DTLoc); diff --git a/clang/test/OpenMP/declare_target_ast_print.cpp b/clang/test/OpenMP/declare_target_ast_print.cpp --- a/clang/test/OpenMP/declare_target_ast_print.cpp +++ b/clang/test/OpenMP/declare_target_ast_print.cpp @@ -277,4 +277,8 @@ // CHECK-NEXT: int ts = 1; // CHECK-NEXT: #pragma omp end declare target +// Do not expect anything here since the region is empty. +#pragma omp declare target +#pragma omp end declare target + #endif