[OPENMP] Fix for http://llvm.org/PR24430: clang hangs on invalid input with openmp...
authorAlexey Bataev <a.bataev@hotmail.com>
Wed, 12 Aug 2015 07:10:54 +0000 (07:10 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Wed, 12 Aug 2015 07:10:54 +0000 (07:10 +0000)
Add parsing of openmp directives inside structs/unions in C mode.

llvm-svn: 244719

clang/lib/Parse/ParseDecl.cpp
clang/test/OpenMP/openmp_common.c

index 40687d8..debbd50 100644 (file)
@@ -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.
index 3765f4c..ed55796 100644 (file)
@@ -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;
+