Issue 162640
Summary [clang-cl] Inherited constructors dll export discrepancy compared to MSVC
Labels new issue
Assignees
Reporter poretga99
    There is a discrepancy between the  MSVC's `cl.exe` and LLVM's `clang-cl.exe` when it comes to symbol exporting via `__declspec(dllexport)` in case of an inherited constructors.

Consider the following case:

```cpp
// Base.h
#pragma once
#define DLL_EXPORT __declspec(dllexport)

class DLL_EXPORT Base {
public:
    Base(int);
 Base(double);
};

class DLL_EXPORT Child : public Base {
public:
 using Base::Base;
};
```
```cpp
// Base.cpp
#include "Base.h"
Base::Base(int) {}
Base::Base(double) {}
```
```CMake
cmake_minimum_required(VERSION 3.29)

project(dll_export LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)

add_library(export SHARED Base.cpp)
```

Build the shared library using `cl.exe` and `clang-cl.exe`. When I inspect the resulting `export.lib` file with `llvm-nm`, there is a difference between the two. In `cl.exe` case, `Child` class also exports the inherited constructors, whereas in `clang-cl.exe`, only copy and move ctors/assignments are seen:

```
llvm-nm clang-cl\export.lib
 
export.dll:
00000000 i .idata$2
00000000 ? .idata$4
00000000 ? .idata$5
00000000 i .idata$6
00000000 I __IMPORT_DESCRIPTOR_export
 U __NULL_IMPORT_DESCRIPTOR
         U export_NULL_THUNK_DATA
 
export.dll:
00000000 I __NULL_IMPORT_DESCRIPTOR
 
export.dll:
00000000 I export_NULL_THUNK_DATA
 
export.dll:
00000000 T ??0Base@@QEAA@H@Z
00000000 T __imp_??0Base@@QEAA@H@Z
 
export.dll:
00000000 T ??0Base@@QEAA@N@Z
00000000 T __imp_??0Base@@QEAA@N@Z
 
export.dll:
00000000 T ??4Base@@QEAAAEAV0@$$QEAV0@@Z
00000000 T __imp_??4Base@@QEAAAEAV0@$$QEAV0@@Z
 
export.dll:
00000000 T ??4Base@@QEAAAEAV0@AEBV0@@Z
00000000 T __imp_??4Base@@QEAAAEAV0@AEBV0@@Z
 
export.dll:
00000000 T ??4Child@@QEAAAEAV0@$$QEAV0@@Z
00000000 T __imp_??4Child@@QEAAAEAV0@$$QEAV0@@Z
 
export.dll:
00000000 T ??4Child@@QEAAAEAV0@AEBV0@@Z
00000000 T __imp_??4Child@@QEAAAEAV0@AEBV0@@Z
```

```
llvm-nm cl\export.lib
 
export.dll:
c0000040 i .idata$2
c0000040 ? .idata$4
c0000040 ? .idata$5
00000000 i .idata$6
01017ccc a @comp.id
00000000 I __IMPORT_DESCRIPTOR_export
         U __NULL_IMPORT_DESCRIPTOR
         U export_NULL_THUNK_DATA
 
export.dll:
01017ccc a @comp.id
00000000 I __NULL_IMPORT_DESCRIPTOR
 
export.dll:
01017ccc a @comp.id
00000000 I export_NULL_THUNK_DATA
 
export.dll:
00000000 T ??0Base@@QEAA@H@Z
00000000 T __imp_??0Base@@QEAA@H@Z
 
export.dll:
00000000 T ??0Base@@QEAA@N@Z
00000000 T __imp_??0Base@@QEAA@N@Z
 
export.dll:
00000000 T ??0Child@@QEAA@H@Z
00000000 T __imp_??0Child@@QEAA@H@Z
 
export.dll:
00000000 T ??0Child@@QEAA@N@Z
00000000 T __imp_??0Child@@QEAA@N@Z
 
export.dll:
00000000 T ??4Base@@QEAAAEAV0@$$QEAV0@@Z
00000000 T __imp_??4Base@@QEAAAEAV0@$$QEAV0@@Z
 
export.dll:
00000000 T ??4Base@@QEAAAEAV0@AEBV0@@Z
00000000 T __imp_??4Base@@QEAAAEAV0@AEBV0@@Z
 
export.dll:
00000000 T ??4Child@@QEAAAEAV0@$$QEAV0@@Z
00000000 T __imp_??4Child@@QEAAAEAV0@$$QEAV0@@Z
 
export.dll:
00000000 T ??4Child@@QEAAAEAV0@AEBV0@@Z
00000000 T __imp_??4Child@@QEAAAEAV0@AEBV0@@Z
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to