[cfe-dev] bugs in Clang function StmtResult Sema::ActOnOpenMPSectionsDirective

xiaohui chen xchen198812 at gmail.com
Wed Mar 18 11:08:36 PDT 2015


just correct a typo, please read the below message.

On Wed, Mar 18, 2015 at 1:01 PM, xiaohui chen <xchen198812 at gmail.com> wrote:

> 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 block.
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150318/166f8822/attachment.html>


More information about the cfe-dev mailing list