r325369 - [OPENMP] Fix parsing of the directives with inner directives.
Alexey Bataev via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 16 10:36:44 PST 2018
Author: abataev
Date: Fri Feb 16 10:36:44 2018
New Revision: 325369
URL: http://llvm.org/viewvc/llvm-project?rev=325369&view=rev
Log:
[OPENMP] Fix parsing of the directives with inner directives.
The parsing may lead to compiler hanging because of the incorrect
processing of inner OpenMP pragmas.
Modified:
cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
cfe/trunk/lib/Parse/ParseOpenMP.cpp
cfe/trunk/lib/Parse/ParsePragma.cpp
cfe/trunk/test/OpenMP/openmp_check.cpp
Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=325369&r1=325368&r2=325369&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Fri Feb 16 10:36:44 2018
@@ -1072,7 +1072,7 @@ def warn_pragma_expected_colon_r_paren :
def err_omp_unknown_directive : Error<
"expected an OpenMP directive">;
def err_omp_unexpected_directive : Error<
- "unexpected OpenMP directive '#pragma omp %0'">;
+ "unexpected OpenMP directive %select{|'#pragma omp %1'}0">;
def err_omp_expected_punc : Error<
"expected ',' or ')' in '%0' %select{clause|directive}1">;
def err_omp_unexpected_clause : Error<
Modified: cfe/trunk/lib/Parse/ParseOpenMP.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseOpenMP.cpp?rev=325369&r1=325368&r2=325369&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseOpenMP.cpp (original)
+++ cfe/trunk/lib/Parse/ParseOpenMP.cpp Fri Feb 16 10:36:44 2018
@@ -851,7 +851,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpen
case OMPD_target_teams_distribute_parallel_for_simd:
case OMPD_target_teams_distribute_simd:
Diag(Tok, diag::err_omp_unexpected_directive)
- << getOpenMPDirectiveName(DKind);
+ << 1 << getOpenMPDirectiveName(DKind);
break;
}
while (Tok.isNot(tok::annot_pragma_openmp_end))
@@ -1107,7 +1107,7 @@ StmtResult Parser::ParseOpenMPDeclarativ
case OMPD_declare_target:
case OMPD_end_declare_target:
Diag(Tok, diag::err_omp_unexpected_directive)
- << getOpenMPDirectiveName(DKind);
+ << 1 << getOpenMPDirectiveName(DKind);
SkipUntil(tok::annot_pragma_openmp_end);
break;
case OMPD_unknown:
Modified: cfe/trunk/lib/Parse/ParsePragma.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParsePragma.cpp?rev=325369&r1=325368&r2=325369&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParsePragma.cpp (original)
+++ cfe/trunk/lib/Parse/ParsePragma.cpp Fri Feb 16 10:36:44 2018
@@ -2117,9 +2117,21 @@ PragmaOpenMPHandler::HandlePragma(Prepro
Tok.setKind(tok::annot_pragma_openmp);
Tok.setLocation(FirstTok.getLocation());
- while (Tok.isNot(tok::eod)) {
+ while (Tok.isNot(tok::eod) && Tok.isNot(tok::eof)) {
Pragma.push_back(Tok);
PP.Lex(Tok);
+ if (Tok.is(tok::annot_pragma_openmp)) {
+ PP.Diag(Tok, diag::err_omp_unexpected_directive) << 0;
+ unsigned InnerPragmaCnt = 1;
+ while (InnerPragmaCnt != 0) {
+ PP.Lex(Tok);
+ if (Tok.is(tok::annot_pragma_openmp))
+ ++InnerPragmaCnt;
+ else if (Tok.is(tok::annot_pragma_openmp_end))
+ --InnerPragmaCnt;
+ }
+ PP.Lex(Tok);
+ }
}
SourceLocation EodLoc = Tok.getLocation();
Tok.startToken();
Modified: cfe/trunk/test/OpenMP/openmp_check.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/openmp_check.cpp?rev=325369&r1=325368&r2=325369&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/openmp_check.cpp (original)
+++ cfe/trunk/test/OpenMP/openmp_check.cpp Fri Feb 16 10:36:44 2018
@@ -7,7 +7,11 @@
// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++11 %s
// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
+#define p _Pragma("omp parallel")
+
int nested(int a) {
+#pragma omp parallel p // expected-error {{unexpected OpenMP directive}}
+ ++a;
#pragma omp parallel
++a;
@@ -16,8 +20,6 @@ int nested(int a) {
// expected-warning at -2 {{'auto' type specifier is a C++11 extension}}
// expected-error at -3 {{expected expression}}
// expected-error at -4 {{expected ';' at end of declaration}}
-#else
- // expected-no-diagnostics
#endif
#pragma omp parallel
More information about the cfe-commits
mailing list