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

xiaohui chen xchen198812 at gmail.com
Thu Mar 19 07:29:20 PDT 2015


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>
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>
> 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/9b5df054/attachment.html>


More information about the cfe-dev mailing list