boostorg / boostorg/type_traits
MSVC clang-cl causes redefinition error
- Dominant language
- C++
- Stars
- 66
- Forks
- 87
- PR merge metrics
- No merged PRs in 30d
Description
In this [two blocks of definitions](https://github.com/boostorg/type_traits/blob/boost-1.91.0/include/boost/type_traits/type_with_alignment.hpp#L86-L206) we have:
```
#if (defined(__GNUC__) || (defined (__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130)) || defined(__clang__)) && !defined(BOOST_TT_DISABLE_INTRINSICS)
[...]
#endif
#if (defined(BOOST_MSVC) || (defined(BOOST_INTEL) && defined(_MSC_VER))) && !defined(BOOST_TT_DISABLE_INTRINSICS)
[...]
#endif
```
Problem is when using `clang-cl` both `__clang__` and `BOOST_MSVC` are defined hence the preprocessor does not discard either of the two blocks.
As a result the redefinition error.
The two definition blocks are obviously mutually exclusive hence should be chained by `#elif`.
Here a sample.
```
C:\PROGRA~1\MICROS~4\18\COMMUN~1\VC\Tools\Llvm\x64\bin\clang-cl.exe /nologo -TP -DBOOST_ALL_DYN_LINK -DBOOST_ALL_NO_LIB -DBOOST_ASIO_NO_DEPRECATED -DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT -DBOOST_ATOMIC_DYN_LINK -DBOOST_ATOMIC_NO_LIB -DBOOST_CHRONO_DYN_LINK -DBOOST_CHRONO_NO_LIB -DBOOST_CONTAINER_DYN_LINK -DBOOST_CONTAINER_NO_LIB -DBOOST_DATE_TIME_DYN_LINK -DBOOST_DATE_TIME_NO_LIB -DBOOST_FILESYSTEM_DYN_LINK=1 -DBOOST_FILESYSTEM_NO_LIB -DBOOST_LOG_DYN_LINK -DBOOST_LOG_NO_LIB -DBOOST_PROGRAM_OPTIONS_DYN_LINK -DBOOST_PROGRAM_OPTIONS_NO_LIB -DBOOST_SERIALIZATION_DYN_LINK -DBOOST_SERIALIZATION_NO_LIB -DBOOST_THREAD_DYN_LINK -DBOOST_THREAD_NO_LIB -DBOOST_THREAD_USE_DLL -DNOMINMAX -DNO_MISALIGNED_ACCESSES -DOPENSSL_API_COMPAT=0x10100000L -DPSAPI_VERSION=2 -DVC_EXTRALEAN -DWIN32_LEAN_AND_MEAN -D_SCL_SECURE_NO_WARNINGS -D_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING -D_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING -D_WIN32_WINNT=0x0A00 -I -I\src -imsvc\build\Debug\vcpkg_installed\x64-windows\include /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /permissive- /Zc:__cplusplus /W4 /WX /w44287 /w44388 /wd4127 /wd4068 /wd4324 /wd4701 /wd4714 /wd5030 /GA /EHsc /MDd -Wno-c++20-extensions /std:c++17 /showIncludes /Fosrc\xxxxxxx\config\CMakeFiles\xxxxxxx.config.dir\PeersConfiguration.cpp.obj /Fdsrc\xxxxxxx\config\CMakeFiles\xxxxxxx.config.dir\xxxxxxx.config.pdb -c -- \src\xxxxxxx\config\PeersConfiguration.cpp
In file included from \src\xxxxxxx\config\PeersConfiguration.cpp:32:
In file included from \build\Debug\vcpkg_installed\x64-windows\include\boost/property_tree/json_parser.hpp:14:
In file included from \build\Debug\vcpkg_installed\x64-windows\include\boost/property_tree/ptree.hpp:16:
In file included from \build\Debug\vcpkg_installed\x64-windows\include\boost/property_tree/string_path.hpp:15:
In file included from \build\Debug\vcpkg_installed\x64-windows\include\boost/property_tree/id_translator.hpp:16:
In file included from \build\Debug\vcpkg_installed\x64-windows\include\boost/optional/optional.hpp:37:
\build\Debug\vcpkg_installed\x64-windows\include\boost/type_traits/type_with_alignment.hpp(133,29): error: redefinition of 'a8'
133 | struct __declspec(align(8)) a8 {
| ^
\build\Debug\vcpkg_installed\x64-windows\include\boost/type_traits/type_with_alignment.hpp(90,40): note: previous definition is here
90 | struct __attribute__((__aligned__(8))) a8 {};
| ^
\build\Debug\vcpkg_installed\x64-windows\include\boost/type_traits/type_with_alignment.hpp(137,30): error: redefinition of 'a16'
137 | struct __declspec(align(16)) a16 {
| ^
\build\Debug\vcpkg_installed\x64-windows\include\boost/type_traits/type_with_alignment.hpp(91,41): note: previous definition is here
91 | struct __attribute__((__aligned__(16))) a16 {};
| ^
\build\Debug\vcpkg_installed\x64-windows\include\boost/type_traits/type_with_alignment.hpp(141,30): error: redefinition of 'a32'
141 | struct __declspec(align(32)) a32 {
| ^
\build\Debug\vcpkg_installed\x64-windows\include\boost/type_traits/type_with_alignment.hpp(92,41): note: previous definition is here
92 | struct __attribute__((__aligned__(32))) a32 {};
| ^
\build\Debug\vcpkg_installed\x64-windows\include\boost/type_traits/type_with_alignment.hpp(145,30): error: redefinition of 'a64'
145 | struct __declspec(align(64)) a64
| ^
\build\Debug\vcpkg_installed\x64-windows\include\boost/type_traits/type_with_alignment.hpp(93,41): note: previous definition is here
93 | struct __attribute__((__aligned__(64))) a64 {};
| ^
\build\Debug\vcpkg_installed\x64-windows\include\boost/type_traits/type_with_alignment.hpp(150,31): error: redefinition of 'a128'
150 | struct __declspec(align(128)) a128 {
| ^
\build\Debug\vcpkg_installed\x64-windows\include\boost/type_traits/type_with_alignment.hpp(94,42): note: previous definition is here
94 | struct __attribute__((__aligned__(128))) a128 {};
```
Contributor guide
No contributing guide indexed for this repository
Research direction
Inspect include/boost/type_traits/type_with_alignment.hpp around the two definition blocks at lines 86-206, starting with the preprocessor conditions shown in the issue. Build a small case with the supplied clang-cl command and confirm that only one block is selected and the a8 through a128 redefinition errors are gone.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 1/5
- Estimated time
- Under an hour
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 88/100