[cfe-dev] bugs in Clang function StmtResult Sema::ActOnOpenMPSectionsDirective
xiaohui chen
xchen198812 at gmail.com
Wed Mar 18 10:01:18 PDT 2015
Hi,
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<CapturedStmt>(AStmt) && "Captured statement
expected");
3026 auto BaseStmt = AStmt;
3027 while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt))
3028 BaseStmt = CS->getCapturedStmt();
3029 if (auto C = dyn_cast_or_null<CompoundStmt>(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<OMPSectionDirective>(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 }
3048
3049 getCurFunction()->setHasBranchProtectedScope();
3050
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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150318/54530f07/attachment.html>
More information about the cfe-dev
mailing list