boostorg / boostorg/type_traits

MSVC clang-cl causes redefinition error

Open Beginner friendly
#205 0 comments 0 reactions 0 assignees View on GitHub
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.