[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