From 4652e4baafb6b544fa5d6820f155700a312ef44f Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Wed, 12 Aug 2015 07:10:54 +0000 Subject: [PATCH] [OPENMP] Fix for http://llvm.org/PR24430: clang hangs on invalid input with openmp directive Add parsing of openmp directives inside structs/unions in C mode. llvm-svn: 244719 --- clang/lib/Parse/ParseDecl.cpp | 8 ++++++++ clang/test/OpenMP/openmp_common.c | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 40687d8..debbd50 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -3615,6 +3615,14 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc, continue; } + if (Tok.is(tok::annot_pragma_openmp)) { + // Result can be ignored, because it must be always empty. + auto Res = ParseOpenMPDeclarativeDirective(); + assert(!Res); + // Silence possible warnings. + (void)Res; + continue; + } if (!Tok.is(tok::at)) { auto CFieldCallback = [&](ParsingFieldDeclarator &FD) { // Install the declarator into the current TagDecl. diff --git a/clang/test/OpenMP/openmp_common.c b/clang/test/OpenMP/openmp_common.c index 3765f4c..ed55796 100644 --- a/clang/test/OpenMP/openmp_common.c +++ b/clang/test/OpenMP/openmp_common.c @@ -7,3 +7,8 @@ void foo() { #pragma omp // expected-error {{expected an OpenMP directive}} #pragma omp unknown_directive // expected-error {{expected an OpenMP directive}} } + +typedef struct S { +#pragma omp parallel for private(j) schedule(static) if (tree1->totleaf > 1024) // expected-error {{unexpected OpenMP directive '#pragma omp parallel for'}} +} St; + -- 2.7.4