[llvm-bugs] [Bug 34401] Assertion failure/bad codegen: too many args w/inherited constructor from virtual base in ctor-initializer

via llvm-bugs llvm-bugs at lists.llvm.org
Tue Nov 2 19:01:25 PDT 2021


https://bugs.llvm.org/show_bug.cgi?id=34401

hstong at ca.ibm.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|WORKSFORME                  |---
             Status|RESOLVED                    |REOPENED

--- Comment #2 from hstong at ca.ibm.com ---
This reproduces (with a slightly different assertion) with the same
instructions as was originally provided using a build with assertions enabled:
/llvm/clang/lib/CodeGen/CGCall.cpp:4669: clang::CodeGen::RValue
clang::CodeGen::CodeGenFunction::EmitCall(const clang::CodeGen::CGFunctionInfo
&, const clang::CodeGen::CGCallee &, clang::CodeGen::ReturnValueSlot, const
clang::CodeGen::CallArgList &, llvm::CallBase **, bool, clang::SourceLocation):
Assertion `IRFuncTy == TypeFromVal' failed.

The arguments to the inherited constructor are "passed into the void".

It seems that a different symptom of the same problem is how such arguments
with non-trivial destruction fail to get destroyed when compiling for the MS
ABI.

### ONLINE COMPILER LINK:
https://godbolt.org/z/d4a5x8MYq

### SOURCE:
struct NonTriv {
  NonTriv(int);
  ~NonTriv();
};
extern "C" void LookForThis(void);
NonTriv::~NonTriv() {
  LookForThis();
}
NonTriv LookForThat(void);
struct V { V() = default; V(NonTriv); };
struct A : virtual V {
  using V::V;
  A() : A(LookForThat()) { }
};
struct B : A { };
void foo() { B b; }

### OPTIONS:
-target x86_64-pc-windows -emit-llvm -O -g0

### IR output (snippet):
define dso_local void @"?foo@@YAXXZ"() local_unnamed_addr #2 personality i32
(...)* @__CxxFrameHandler3 {
  %1 = alloca %struct.NonTriv, align 1
  %2 = getelementptr inbounds %struct.NonTriv, %struct.NonTriv* %1, i64 0, i32
0
  call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %2)
  call void @"?LookForThat@@YA?AUNonTriv@@XZ"(%struct.NonTriv* nonnull
sret(%struct.NonTriv) align 1 %1)
  call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %2)
  ret void
}

### OBSERVATIONS:
It appears that there is no mechanism in the above by which the NonTriv
temporary is destroyed.

Aside: I will open a GCC defect for its failure to process the side-effects of
the argument initialization.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20211103/233ee45e/attachment.html>


More information about the llvm-bugs mailing list