[PATCH] D70172: [CUDA][HIP][OpenMP] Emit deferred diagnostics by a post-parsing AST travese

Yaxun Liu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 27 20:23:40 PST 2020


yaxunl added a comment.

I still got assertion when I use the built clang with check-mlir. The reduced testcase is

  class A {
  public:
    int foo();
  };
  
  static A a;
  
  struct B {
    B(int x = a.foo());
  };
  
  void test() {
    B x;
  }

The assertion I got is:

  clang: /home/yaxunl/git/llvm/llvm/tools/clang/lib/CodeGen/CGExpr.cpp:2628: clang::CodeGen::LValue clang::CodeGen::CodeGenFunction::EmitDeclRefLValue(const clang::DeclRefExpr *): Assertion `(ND->isUsed(false) || !isa<VarDecl>(ND) || E->isNonOdrUse() || !E->getLocation().isValid()) && "Should not use decl without marking it used!"' failed.
  Stack dump:
  
  
   #0 0x000000000258c614 PrintStackTraceSignalHandler(void*) (/home/yaxunl/git/llvm/assert/bin/clang+0x258c614)
   #1 0x000000000258a1ae llvm::sys::RunSignalHandlers() (/home/yaxunl/git/llvm/assert/bin/clang+0x258a1ae)
   #2 0x000000000258b7a2 llvm::sys::CleanupOnSignal(unsigned long) (/home/yaxunl/git/llvm/assert/bin/clang+0x258b7a2)
   #3 0x000000000251d0c3 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) (/home/yaxunl/git/llvm/assert/bin/clang+0x251d0c3)
   #4 0x000000000251d1fc CrashRecoverySignalHandler(int) (/home/yaxunl/git/llvm/assert/bin/clang+0x251d1fc)
   #5 0x00007f0dde3bf390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
   #6 0x00007f0ddcf29428 raise /build/glibc-LK5gWL/glibc-2.23/signal/../sysdeps/unix/sysv/linux/raise.c:54:0
   #7 0x00007f0ddcf2b02a abort /build/glibc-LK5gWL/glibc-2.23/stdlib/abort.c:91:0
   #8 0x00007f0ddcf21bd7 __assert_fail_base /build/glibc-LK5gWL/glibc-2.23/assert/assert.c:92:0
   #9 0x00007f0ddcf21c82 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc82)
  #10 0x0000000002a1a5df clang::CodeGen::CodeGenFunction::EmitDeclRefLValue(clang::DeclRefExpr const*) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a1a5df)
  #11 0x0000000002a0dfb6 clang::CodeGen::CodeGenFunction::EmitLValue(clang::Expr const*) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a0dfb6)
  #12 0x0000000002a39973 clang::CodeGen::CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(clang::CallExpr const*, clang::CXXMethodDecl const*, clang::CodeGen::ReturnValueSlot, bool, clang::NestedNameSpecifier*, bool, clang::Expr const*) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a39973)
  #13 0x0000000002a389b9 clang::CodeGen::CodeGenFunction::EmitCXXMemberCallExpr(clang::CXXMemberCallExpr const*, clang::CodeGen::ReturnValueSlot) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a389b9)
  #14 0x0000000002a28f95 clang::CodeGen::CodeGenFunction::EmitCallExpr(clang::CallExpr const*, clang::CodeGen::ReturnValueSlot) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a28f95)
  #15 0x0000000002a5be29 (anonymous namespace)::ScalarExprEmitter::VisitCallExpr(clang::CallExpr const*) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a5be29)
  #16 0x0000000002a55b19 clang::StmtVisitorBase<std::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::Visit(clang::Stmt*) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a55b19)
  #17 0x0000000002a4b615 clang::CodeGen::CodeGenFunction::EmitScalarExpr(clang::Expr const*, bool) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a4b615)
  #18 0x0000000002a0da30 clang::CodeGen::CodeGenFunction::EmitAnyExpr(clang::Expr const*, clang::CodeGen::AggValueSlot, bool) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a0da30)
  #19 0x0000000002a0edde clang::CodeGen::CodeGenFunction::EmitAnyExprToTemp(clang::Expr const*) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a0edde)
  #20 0x00000000029cdd6b clang::CodeGen::CodeGenFunction::EmitCallArg(clang::CodeGen::CallArgList&, clang::Expr const*, clang::QualType) (/home/yaxunl/git/llvm/assert/bin/clang+0x29cdd6b)
  #21 0x00000000029ccc41 clang::CodeGen::CodeGenFunction::EmitCallArgs(clang::CodeGen::CallArgList&, llvm::ArrayRef<clang::QualType>, llvm::iterator_range<clang::Stmt::CastIterator<clang::Expr, clang::Expr const* const, clang::Stmt const* const> >, clang::CodeGen::CodeGenFunction::AbstractCallee, unsigned int, clang::CodeGen::CodeGenFunction::EvaluationOrder) (/home/yaxunl/git/llvm/assert/bin/clang+0x29ccc41)
  #22 0x00000000028d8e7b void clang::CodeGen::CodeGenFunction::EmitCallArgs<clang::FunctionProtoType>(clang::CodeGen::CallArgList&, clang::FunctionProtoType const*, llvm::iterator_range<clang::Stmt::CastIterator<clang::Expr, clang::Expr const* const, clang::Stmt const* const> >, clang::CodeGen::CodeGenFunction::AbstractCallee, unsigned int, clang::CodeGen::CodeGenFunction::EvaluationOrder) (/home/yaxunl/git/llvm/assert/bin/clang+0x28d8e7b)
  #23 0x00000000029de431 clang::CodeGen::CodeGenFunction::EmitCXXConstructorCall(clang::CXXConstructorDecl const*, clang::CXXCtorType, bool, bool, clang::CodeGen::AggValueSlot, clang::CXXConstructExpr const*) (/home/yaxunl/git/llvm/assert/bin/clang+0x29de431)
  #24 0x0000000002a3b84e clang::CodeGen::CodeGenFunction::EmitCXXConstructExpr(clang::CXXConstructExpr const*, clang::CodeGen::AggValueSlot) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a3b84e)
  #25 0x0000000002a32a8b (anonymous namespace)::AggExprEmitter::VisitCXXConstructExpr(clang::CXXConstructExpr const*) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a32a8b)
  #26 0x0000000002a2d44f clang::CodeGen::CodeGenFunction::EmitAggExpr(clang::Expr const*, clang::CodeGen::AggValueSlot) (/home/yaxunl/git/llvm/assert/bin/clang+0x2a2d44f)
  #27 0x00000000029f96fc clang::CodeGen::CodeGenFunction::EmitExprAsInit(clang::Expr const*, clang::ValueDecl const*, clang::CodeGen::LValue, bool) (/home/yaxunl/git/llvm/assert/bin/clang+0x29f96fc)
  #28 0x00000000029f68d9 clang::CodeGen::CodeGenFunction::EmitAutoVarInit(clang::CodeGen::CodeGenFunction::AutoVarEmission const&) (/home/yaxunl/git/llvm/assert/bin/clang+0x29f68d9)
  #29 0x00000000029f1ca5 clang::CodeGen::CodeGenFunction::EmitVarDecl(clang::VarDecl const&) (/home/yaxunl/git/llvm/assert/bin/clang+0x29f1ca5)
  #30 0x00000000029f1935 clang::CodeGen::CodeGenFunction::EmitDecl(clang::Decl const&) (/home/yaxunl/git/llvm/assert/bin/clang+0x29f1935)
  #31 0x00000000027e07fb clang::CodeGen::CodeGenFunction::EmitDeclStmt(clang::DeclStmt const&) (/home/yaxunl/git/llvm/assert/bin/clang+0x27e07fb)
  #32 0x00000000027d7a4c clang::CodeGen::CodeGenFunction::EmitSimpleStmt(clang::Stmt const*) (/home/yaxunl/git/llvm/assert/bin/clang+0x27d7a4c)
  #33 0x00000000027d66cb clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) (/home/yaxunl/git/llvm/assert/bin/clang+0x27d66cb)
  #34 0x00000000027e15f0 clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) (/home/yaxunl/git/llvm/assert/bin/clang+0x27e15f0)
  #35 0x000000000282ffb6 clang::CodeGen::CodeGenFunction::GenerateCode(clang::GlobalDecl, llvm::Function*, clang::CodeGen::CGFunctionInfo const&) (/home/yaxunl/git/llvm/assert/bin/clang+0x282ffb6)
  #36 0x000000000284dc52 clang::CodeGen::CodeGenModule::EmitGlobalFunctionDefinition(clang::GlobalDecl, llvm::GlobalValue*) (/home/yaxunl/git/llvm/assert/bin/clang+0x284dc52)
  #37 0x0000000002845cc7 clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) (/home/yaxunl/git/llvm/assert/bin/clang+0x2845cc7)
  #38 0x0000000002852271 clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) (/home/yaxunl/git/llvm/assert/bin/clang+0x2852271)

It is weird since this is not en OpenMP nor CUDA program and there is no deferred diags involved.

It seems somehow my change caused some decl missing used flag.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D70172/new/

https://reviews.llvm.org/D70172





More information about the cfe-commits mailing list