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

Bataev, Alexey a.bataev at hotmail.com
Fri Mar 20 00:26:05 PDT 2015


Ok, no problems!

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

19.03.2015 17:29, xiaohui chen пишет:
> 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!
>
> Sincerely
> Xiaohui
>
> On Wed, Mar 18, 2015 at 11:56 PM, Bataev, Alexey <a.bataev at hotmail.com 
> <mailto:a.bataev at hotmail.com>> wrote:
>
>     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/20150320/f204e058/attachment.html>


More information about the cfe-dev mailing list