[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