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

Bataev, Alexey a.bataev at hotmail.com
Wed Mar 18 20:56:35 PDT 2015


Hi,
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.

-- 
Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team


18.03.2015 21:08, xiaohui chen пишет:
>
> just correct a typo, please read the below message.
>
> On Wed, Mar 18, 2015 at 1:01 PM, xiaohui chen <xchen198812 at gmail.com 
> <mailto: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/20150319/4073a0cd/attachment.html>


More information about the cfe-dev mailing list