<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>