forked from OSchip/llvm-project
				
			[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. llvm-svn: 325369
This commit is contained in:
		
							parent
							
								
									79bd39db80
								
							
						
					
					
						commit
						96dae81d7f
					
				| 
						 | 
				
			
			@ -1072,7 +1072,7 @@ def warn_pragma_expected_colon_r_paren : Warning<
 | 
			
		|||
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<
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -851,7 +851,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
 | 
			
		|||
  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::ParseOpenMPDeclarativeOrExecutableDirective(
 | 
			
		|||
  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:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2117,9 +2117,21 @@ PragmaOpenMPHandler::HandlePragma(Preprocessor &PP,
 | 
			
		|||
  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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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@-2 {{'auto' type specifier is a C++11 extension}}
 | 
			
		||||
  // expected-error@-3 {{expected expression}}
 | 
			
		||||
  // expected-error@-4 {{expected ';' at end of declaration}}
 | 
			
		||||
#else
 | 
			
		||||
  // expected-no-diagnostics
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#pragma omp parallel
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue