[cfe-dev] Fwd: bugs in Clang function StmtResult Sema::ActOnOpenMPSectionsDirective
xiaohui chen via cfe-dev
cfe-dev at lists.llvm.org
Wed Sep 21 06:57:52 PDT 2016
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._ZN5clang7tooling29formatAndApp
lyAllReplacementsERKSt3setINS0_11ReplacementESt4lessIS2_ESaIS2_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._ZN5clang7tooling29formatAndApp
lyAllReplacementsERKSt3setINS0_11ReplacementESt4lessIS2_ESaIS2_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/3ac6e351/attachment.html>
More information about the cfe-dev
mailing list