[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