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

xiaohui chen via cfe-dev cfe-dev at lists.llvm.org
Wed Sep 21 07:20:05 PDT 2016


😃, you are totally right. Thank you Alexey.

On Wed, Sep 21, 2016 at 7:13 AM, Alexey Bataev <a.bataev at hotmail.com> wrote:

> Seems to me you're missing clangFormat library
>
> Best regards,
> Alexey Bataev
>
> On 09/21/2016 04:57 PM, xiaohui chen wrote:
>
>
> Hi guys,
>
> I am writing a libtooling tool.
> My tool can compile and run with Clang version 3.6.2.
> However, if I compile with Clang version 3.9.0, it reports an error:
>
> /Project/clang+llvm-3.9.0-x86_64-linux-gnu-ubuntu-14.04/bin/
> ../lib/libclangTooling.a(Refactoring.cpp.o): In function
> `clang::tooling::formatAndApplyAllReplacements(std::set<clang::tooling::Replacement,
> std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement>
> > const&, clang::Rewriter&, llvm::StringRef)':
> /home/development/llvm/3.9.0/final/llvm.src/tools/clang/lib/
> Tooling/Refactoring.cpp:(.text._ZN5clang7tooling29formatAndA
> pplyAllReplacementsERKSt3setINS0_11ReplacementESt4lessIS2_ES
> aIS2_EERNS_8RewriterEN4llvm9StringRefE+0x184): undefined reference to
> `clang::format::getStyle(llvm::StringRef, llvm::StringRef,
> llvm::StringRef, clang::vfs::FileSystem*)'
> /home/development/llvm/3.9.0/final/llvm.src/tools/clang/lib/
> Tooling/Refactoring.cpp:(.text._ZN5clang7tooling29formatAndA
> pplyAllReplacementsERKSt3setINS0_11ReplacementESt4lessIS2_ES
> aIS2_EERNS_8RewriterEN4llvm9StringRefE+0x19f): undefined reference to
> `clang::format::formatReplacements(llvm::StringRef,
> std::set<clang::tooling::Replacement, std::less<clang::tooling::Replacement>,
> std::allocator<clang::tooling::Replacement> > const&,
> clang::format::FormatStyle const&)'
> clang-3.9: error: linker command failed with exit code 1 (use -v to see
> invocation)
> make: *** [main] Error 1
>
>
> Do you have any hints?
>
> Best
> xiaohui
>
>
> On Wed, Mar 18, 2015 at 10:01 AM, 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-docu
>> ments/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_com
>> pound_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 statement.
>>
>>
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160921/39aaabaa/attachment.html>


More information about the cfe-dev mailing list