bugs in Clang function StmtResult Sema::ActOnOpenMPSectionsDirective

I am using clang version 3.6.0 (trunk 224915).

Clang can not parse the following valid OpenMP code:

1 #include<omp.h>
2 void main()
3 {
4 int i;
5 #pragma omp parallel
6 #pragma omp sections
7 {
8 i++;
9 i++;
10 #pragma omp section
11 i++;
12 }
13 }

The bug comes from line 8 and 9.

In OpenMP documentation (http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf) page 62,
it says"Each structured block in the sections construct is preceded by a section directive
except possibly the first block, for which a preceding section directive is optional." .

it means that the section directive is optional for the first block, but not the first statement.

in function StmtResult Sema::ActOnOpenMPSectionsDirective,

3021 StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses,
3022 Stmt *AStmt,
3023 SourceLocation StartLoc,
3024 SourceLocation EndLoc) {
3025 assert(AStmt && isa(AStmt) && “Captured statement expected”);
3026 auto BaseStmt = AStmt;
3027 while (CapturedStmt *CS = dyn_cast_or_null(BaseStmt))
3028 BaseStmt = CS->getCapturedStmt();
3029 if (auto C = dyn_cast_or_null(BaseStmt)) {
3030 auto S = C->children();
3031 if (!S)
3032 return StmtError();
3033 // All associated statements must be ‘#pragma omp section’ except for
3034 // the first one.
3035 for (++S; S; ++S) {
3036 auto SectionStmt = *S;
3037 if (!SectionStmt || !isa(SectionStmt)) {
3038 if (SectionStmt)
3039 Diag(SectionStmt->getLocStart(),
3040 diag::err_omp_sections_substmt_not_section);
3041 return StmtError();
3042 }
3043 }
3044 } else {
3045 Diag(AStmt->getLocStart(), diag::err_omp_sections_not_compound_stmt);
3046 return StmtError();
3047 }
3049 getCurFunction()->setHasBranchProtectedScope();
3051 return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses,
3052 AStmt);
3053 }

Notice from line 3035 to line 3042, it just checks the first statement not the first statement.

just correct a typo, please read the below message.

I don't think your code is correct, because actually there are 2 structured blocks where you think there is only one.
According to OpenMP standard structured block "For C/C++, an executable statement, ...", i.e. single statement, not several statements. So, the detection is correct.
You have to enclose two first stmts into braces to make it compatible with OpenMP standard.

Hi Alexey,

make sense. My confusion comes from the fact that GCC could compile and run the code. But your explanation is compatible
with OpenMP specification. Thanks very much!


Ok, no problems!

Best regards,
Alexey Bataev

Hi guys,

I am writing a libtooling tool with pragma, like

#pragma xxx vars(a, b,c)

I register the pragma as usual, like
CI.getPreprocessor().AddPragmaHandler( new …)

Hi guys,

I am writing a libtooling tool.
My tool can compile and run with Clang version 3.6.2.
However, if I compile with Clang version 3.9.0, it reports an error:

/Project/clang+llvm-3.9.0-x86_64-linux-gnu-ubuntu-14.04/bin/…/lib/libclangTooling.a(Refactoring.cpp.o): In function clang::tooling::formatAndApplyAllReplacements(std::set<clang::tooling::Replacement, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement> > const&, clang::Rewriter&, llvm::StringRef)': /home/development/llvm/3.9.0/final/llvm.src/tools/clang/lib/Tooling/Refactoring.cpp:(.text._ZN5clang7tooling29formatAndApplyAllReplacementsERKSt3setINS0_11ReplacementESt4lessIS2_ESaIS2_EERNS_8RewriterEN4llvm9StringRefE+0x184): undefined reference to clang::format::getStyle(llvm::StringRef, llvm::StringRef, llvm::StringRef, clang::vfs::FileSystem*)’
/home/development/llvm/3.9.0/final/llvm.src/tools/clang/lib/Tooling/Refactoring.cpp:(.text._ZN5clang7tooling29formatAndApplyAllReplacementsERKSt3setINS0_11ReplacementESt4lessIS2_ESaIS2_EERNS_8RewriterEN4llvm9StringRefE+0x19f): undefined reference to `clang::format::formatReplacements(llvm::StringRef, std::set<clang::tooling::Replacement, std::lessclang::tooling::Replacement, std::allocatorclang::tooling::Replacement > const&, clang::format::FormatStyle const&)’
clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [main] Error 1

Do you have any hints?



Seems to me you’re missing clangFormat library

:smiley:, you are totally right. Thank you Alexey.