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

Alexey Bataev via cfe-dev cfe-dev at lists.llvm.org
Wed Sep 21 07:13:00 PDT 2016


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._ZN5clang7tooling29formatAndApplyAllReplacementsERKSt3setINS0_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._ZN5clang7tooling29formatAndApplyAllReplacementsERKSt3setINS0_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<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 statement.





-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160921/b8cbecd3/attachment.html>


More information about the cfe-dev mailing list