<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
</head>
<body>
<div class="moz-cite-prefix">Ok, no problems!<br>
<pre class="moz-signature" cols="72">Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team</pre>
19.03.2015 17:29, xiaohui chen пишет:<br>
</div>
<blockquote
cite="mid:CALpPt09nfjp8UAomNoa-ydMR4c7FuBTnnUXga4C1O5b3DcDAsA@mail.gmail.com"
type="cite">
<div dir="ltr">Hi Alexey,
<div><br>
</div>
<div>make sense. My confusion comes from the fact that GCC could
compile and run the code. But your explanation is compatible </div>
<div>with OpenMP specification. Thanks very much! </div>
<div><br>
</div>
<div>Sincerely</div>
<div>Xiaohui</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Mar 18, 2015 at 11:56 PM,
Bataev, Alexey <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:a.bataev@hotmail.com" target="_blank">a.bataev@hotmail.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<div>Hi,<br>
I don't think your code is correct, because actually
there are 2 structured blocks where you think there is
only one.<br>
According to OpenMP standard structured block "For
C/C++, an executable statement, ...", i.e. single
statement, not several statements. So, the detection is
correct.<br>
You have to enclose two first stmts into braces to make
it compatible with OpenMP standard.<span class="HOEnZb"><font
color="#888888"><br>
<br>
<pre cols="72">--
Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team</pre>
<br>
18.03.2015 21:08, xiaohui chen пишет:<br>
</font></span></div>
<div>
<div class="h5">
<blockquote type="cite">
<div dir="ltr"><br>
<div class="gmail_extra">just correct a typo,
please read the below message. </div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Mar 18, 2015 at
1:01 PM, xiaohui chen <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:xchen198812@gmail.com"
target="_blank">xchen198812@gmail.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote"
style="margin:0 0 0 .8ex;border-left:1px
#ccc solid;padding-left:1ex">
<div dir="ltr">Hi,
<div>I am using clang version 3.6.0 (trunk
224915).</div>
<div><br>
</div>
<div>Clang can not parse the following
valid OpenMP code:</div>
<div><br>
</div>
<div>
<div> 1 #include<omp.h></div>
<div> 2 void main()</div>
<div> 3 {</div>
<div> 4 int i;</div>
<div> 5 #pragma omp parallel</div>
<div> 6 #pragma omp sections</div>
<div> 7 {</div>
<div> 8 i++;</div>
<div> 9 i++;</div>
<div> 10 #pragma omp
section</div>
<div> 11 i++;</div>
<div> 12 }</div>
<div> 13 }</div>
</div>
<div><br>
</div>
<div>The bug comes from line 8 and 9.</div>
<div><br>
</div>
<div>In OpenMP documentation (<a
moz-do-not-send="true"
href="http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf"
target="_blank">http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf</a>)
page 62,</div>
<div>it says"Each structured block in the
sections construct is preceded by a
section directive </div>
<div>except possibly the first block, for
which a preceding section directive is
optional." .</div>
<div><br>
</div>
<div>it means that the section directive
is optional for the first block, but not
the first statement.</div>
<div><br>
</div>
<div>in function StmtResult
Sema::ActOnOpenMPSectionsDirective, </div>
<div><br>
</div>
<div>
<div>3021 StmtResult
Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause
*> Clauses,</div>
<div>3022
Stmt *AStmt,</div>
<div>3023
SourceLocation
StartLoc,</div>
<div>3024
SourceLocation EndLoc)
{</div>
<div>3025 assert(AStmt &&
isa<CapturedStmt>(AStmt)
&& "Captured statement
expected");</div>
<div>3026 auto BaseStmt = AStmt;</div>
<div>3027 while (CapturedStmt *CS =
dyn_cast_or_null<CapturedStmt>(BaseStmt))</div>
<div>3028 BaseStmt =
CS->getCapturedStmt();</div>
<div>3029 if (auto C =
dyn_cast_or_null<CompoundStmt>(BaseStmt))
{</div>
<div>3030 auto S = C->children();</div>
<div>3031 if (!S)</div>
<div>3032 return StmtError();</div>
<div>3033 // All associated
statements must be '#pragma omp
section' except for</div>
<div>3034 // the first one.</div>
<div>3035 for (++S; S; ++S) {</div>
<div>3036 auto SectionStmt = *S;</div>
<div>3037 if (!SectionStmt ||
!isa<OMPSectionDirective>(SectionStmt))
{</div>
<div>3038 if (SectionStmt)</div>
<div>3039
Diag(SectionStmt->getLocStart(),</div>
<div>3040
diag::err_omp_sections_substmt_not_section);</div>
<div>3041 return StmtError();</div>
<div>3042 }</div>
<div>3043 }</div>
<div>3044 } else {</div>
<div>3045
Diag(AStmt->getLocStart(),
diag::err_omp_sections_not_compound_stmt);</div>
<div>3046 return StmtError();</div>
<div>3047 }</div>
<div>3048 </div>
<div>3049
getCurFunction()->setHasBranchProtectedScope();</div>
<div>3050 </div>
<div>3051 return
OMPSectionsDirective::Create(Context,
StartLoc, EndLoc, Clauses,</div>
<div>3052
AStmt);</div>
<div>3053 }</div>
</div>
<div><br>
</div>
<div>Notice from line 3035 to line 3042,
it just checks the first statement not
the first block.</div>
<div><br>
</div>
<div><br>
</div>
</div>
<br>
</blockquote>
</div>
<br>
</div>
</div>
<br>
<br>
<br>
<br>
</blockquote>
<br>
<br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</blockquote>
<br>
</body>
</html>