| 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