Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Importing std and redefined symbols #4049

Open
2 tasks
mickes27 opened this issue Jun 8, 2023 · 2 comments
Open
2 tasks

Importing std and redefined symbols #4049

mickes27 opened this issue Jun 8, 2023 · 2 comments

Comments

@mickes27
Copy link

mickes27 commented Jun 8, 2023

Description

When exporting C++20 module with imported nlohmann::json as header unit and std module, a lot of redefinition errors occurs. This is not visible when importing iostream as header unit instead of std module.

Reproduction steps

Create primary interface module and import std module and nlohmann::json as header unit

Expected vs. actual results

It is expected to compile code without any error. As actual result, compilation fails.

Minimal code example

export module foo;
import std;
import <nlohmann/json.hpp>;

export class foo {
public:
	void helloworld();
};

void foo::helloworld()
{
	nlohmann::json v;
	v["example"] = "value";
	std::cout << v.dump() << std::endl;
}

Error messages

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2358,52): error C2572: 'std::basic_string': redefinition of default argument: parameter 1 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2359,1): message : see declaration of 'std::basic_string' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2358,87): error C2572: 'std::basic_string': redefinition of default argument: parameter 2 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2359,1): message : see declaration of 'std::basic_string' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\vector(437,49): error C2572: 'std::vector': redefinition of default argument: parameter 1 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\format(71,7): message : see declaration of 'std::vector' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstddef(135,35): error C2572: 'std::less': redefinition of default argument: parameter 1 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstddef(136,1): message : see declaration of 'std::less' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xtr1common(42,47): error C2572: 'std::enable_if': redefinition of default argument: parameter 1 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xtr1common(43,1): message : see declaration of 'std::enable_if' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(116,9): error C7570: 'std::move_constructible': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(116,9): message : see declaration of 'std::move_constructible' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  PrivatePath\JsonModule\include\JsonModule\json.ixx(12,17): message : see reference to class template instantiation 'nlohmann::json_abi_v3_11_2::basic_json<std::map,std::vector,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,bool,int64_t,uint64_t,double,std::allocator,nlohmann::json_abi_v3_11_2::adl_serializer,std::vector<uint8_t,std::allocator<uint8_t>>>' being compiled [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(105,9): error C7570: 'std::constructible_from': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(105,9): message : see declaration of 'std::constructible_from' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(102,9): error C7570: 'std::destructible': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(102,9): message : see declaration of 'std::destructible' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(44,9): error C7570: 'std::convertible_to': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(44,9): message : see declaration of 'std::convertible_to' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(93,9): error C7570: 'std::assignable_from': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(93,9): message : see declaration of 'std::assignable_from' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(56,9): error C7570: 'std::common_reference_with': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(56,9): message : see declaration of 'std::common_reference_with' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(36,9): error C7570: 'std::same_as': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(36,9): message : see declaration of 'std::same_as' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
PrivatePath\JsonModule\include\JsonModule\json.ixx(12,1): error C2752: 'std::vector<bool,std::allocator<bool>>': more than one partial specialization matches the template argument list 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\vector(2212): message : could be 'std::vector<bool,_Alloc>' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\vector(2212): message : or       'std::vector<bool,_Alloc>' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(591,9): error C7570: 'std::input_iterator': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(591,9): message : see declaration of 'std::input_iterator' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  PrivatePath\JsonModule\include\JsonModule\json.ixx(12,1): message : see reference to class template instantiation 'std::vector<bool,std::allocator<bool>>' being compiled [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\__msvc_iter_core.hpp(391,9): error C7570: 'std::input_or_output_iterator': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\__msvc_iter_core.hpp(391,9): message : see declaration of 'std::input_or_output_iterator' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\__msvc_iter_core.hpp(378,9): error C7570: 'std::weakly_incrementable': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\__msvc_iter_core.hpp(378,9): message : see declaration of 'std::weakly_incrementable' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(253,9): error C7570: 'std::movable': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(253,9): message : see declaration of 'std::movable' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(167,9): error C7570: 'std::swappable': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(167,9): message : see declaration of 'std::swappable' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(509,9): error C7570: 'std::indirectly_readable': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(509,9): message : see declaration of 'std::indirectly_readable' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(39,9): error C7570: 'std::derived_from': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(39,9): message : see declaration of 'std::derived_from' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\map(72,58): error C2572: 'std::map': redefinition of default argument: parameter 1 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\map(73,1): message : see declaration of 'std::map' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\map(72,85): error C2572: 'std::map': redefinition of default argument: parameter 2 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\map(73,1): message : see declaration of 'std::map' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
PrivatePath\JsonModule\out\build\x64-Debug\_deps\json-src\include\nlohmann\detail\iterators\iter_impl.hpp(50): error C2752: 'std::conditional<false,nlohmann::json_abi_v3_11_2::basic_json<std::map,std::vector,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,bool,int64_t,uint64_t,double,std::allocator,nlohmann::json_abi_v3_11_2::adl_serializer,std::vector<uint8_t,std::allocator<uint8_t>>>,const BasicJsonType>': more than one partial specialization matches the template argument list 
            with
            [
                BasicJsonType=nlohmann::json_abi_v3_11_2::basic_json<std::map,std::vector,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,bool,int64_t,uint64_t,double,std::allocator,nlohmann::json_abi_v3_11_2::adl_serializer,std::vector<uint8_t,std::allocator<uint8_t>>>
            ]
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xtr1common(59): message : could be 'std::conditional<false,_Ty1,_Ty2>' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xtr1common(59): message : or       'std::conditional<false,_Ty1,_Ty2>' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  PrivatePath\JsonModule\out\build\x64-Debug\_deps\json-src\include\nlohmann\json.hpp(730,1): message : see reference to class template instantiation 'nlohmann::json_abi_v3_11_2::detail::iter_impl<nlohmann::json_abi_v3_11_2::basic_json<std::map,std::vector,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,bool,int64_t,uint64_t,double,std::allocator,nlohmann::json_abi_v3_11_2::adl_serializer,std::vector<uint8_t,std::allocator<uint8_t>>>>' being compiled [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\__msvc_iter_core.hpp(395,9): error C7570: 'std::sentinel_for': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\__msvc_iter_core.hpp(395,9): message : see declaration of 'std::sentinel_for' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(266,9): error C7570: 'std::semiregular': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(266,9): message : see declaration of 'std::semiregular' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(259,9): error C7570: 'std::copyable': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(259,9): message : see declaration of 'std::copyable' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(181,9): error C7570: 'std::copy_constructible': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(181,9): message : see declaration of 'std::copy_constructible' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(109,9): error C7570: 'std::default_initializable': variable template has already been defined 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\concepts(109,9): message : see declaration of 'std::default_initializable' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
PrivatePath\JsonModule\out\build\x64-Debug\_deps\json-src\include\nlohmann\detail\iterators\iter_impl.hpp(82,1): error C2752: 'std::conditional<false,const nlohmann::json_abi_v3_11_2::basic_json<std::map,std::vector,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,bool,int64_t,uint64_t,double,std::allocator,nlohmann::json_abi_v3_11_2::adl_serializer,std::vector<uint8_t,std::allocator<uint8_t>>> *,nlohmann::json_abi_v3_11_2::basic_json<std::map,std::vector,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,bool,int64_t,uint64_t,double,std::allocator,nlohmann::json_abi_v3_11_2::adl_serializer,std::vector<uint8_t,std::allocator<uint8_t>>> *>': more than one partial specialization matches the template argument list 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xtr1common(59): message : could be 'std::conditional<false,_Ty1,_Ty2>' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xtr1common(59): message : or       'std::conditional<false,_Ty1,_Ty2>' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
PrivatePath\JsonModule\out\build\x64-Debug\_deps\json-src\include\nlohmann\detail\iterators\iter_impl.hpp(87,1): error C2752: 'std::conditional<false,const nlohmann::json_abi_v3_11_2::basic_json<std::map,std::vector,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,bool,int64_t,uint64_t,double,std::allocator,nlohmann::json_abi_v3_11_2::adl_serializer,std::vector<uint8_t,std::allocator<uint8_t>>> &,nlohmann::json_abi_v3_11_2::basic_json<std::map,std::vector,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,bool,int64_t,uint64_t,double,std::allocator,nlohmann::json_abi_v3_11_2::adl_serializer,std::vector<uint8_t,std::allocator<uint8_t>>> &>': more than one partial specialization matches the template argument list 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xtr1common(59): message : could be 'std::conditional<false,_Ty1,_Ty2>' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xtr1common(59): message : or       'std::conditional<false,_Ty1,_Ty2>' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(930,52): error C2572: 'std::basic_string_view': redefinition of default argument: parameter 1 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(1202,1): message : see declaration of 'std::basic_string_view' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\iosfwd(191,52): error C2572: 'std::basic_stringbuf': redefinition of default argument: parameter 1 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\sstream(24,1): message : see declaration of 'std::basic_stringbuf' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  PrivatePath\JsonModule\include\JsonModule\json.ixx(12): message : see reference to class template instantiation 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' being compiled [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\iosfwd(191,87): error C2572: 'std::basic_stringbuf': redefinition of default argument: parameter 2 
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\sstream(24,1): message : see declaration of 'std::basic_stringbuf' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
PrivatePath\JsonModule\include\JsonModule\json.ixx(13,13): error C2752: 'std::remove_reference<const char (&)[8]>': more than one partial specialization matches the template argument list [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xtr1common(209): message : could be 'std::remove_reference<_Ty&>' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xtr1common(209): message : or       'std::remove_reference<_Ty&>' [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
  PrivatePath\JsonModule\out\build\x64-Debug\_deps\json-src\include\nlohmann\detail\meta\type_traits.hpp(522,87): message : see reference to alias template instantiation 'nlohmann::json_abi_v3_11_2::detail::uncvref_t<const char(&)[8]>' being compiled [PrivatePath\JsonModule\out\build\x64-Debug\json.vcxproj]
PrivatePath\JsonModule\include\JsonModule\json.ixx(13,1): fatal error C1117: unrecoverable error importing module 'std': symbol 'id' has already been defined

Compiler and operating system

Visual Studio 2022 17.6.2

Library version

3.11.2

Validation

Copy link

This issue has been marked as stale because it has been open for 90 days without activity. If this issue is still relevant, please add a comment or remove the "stale" label. Otherwise, it will be closed in 10 days. Thank you for helping us prioritize our work!

@github-actions github-actions bot added the state: stale the issue has not been updated in a while and will be closed automatically soon unless it is updated label Feb 13, 2025
@Optimierungswerfer
Copy link

Optimierungswerfer commented Feb 13, 2025

I believe that this might be due to this unsolved bug in MSVC: https://developercommunity.visualstudio.com/t/Conflicting-instructions-for-mixing-inc/10790461

This happens when somewhere along the chain there is a direct or transitive #include of STL headers after there was an import std statement. It seems like the include guards don't get imported with import std, which is expected behavior, as pre-processor definitions should not leak outwards from modules, but for some weird reason, all the actual symbol definitions do leak outwards from import std, which is not expected behavior and leads to the ODR violations that we see in the output.

This not only applies to import std, but any imported module, which includes STL headers in its global module fragment.

It's a nasty bug, because it prevents the migration of large codebases, where you will inevitably run into mixed situations of STL header includes and imports.

@github-actions github-actions bot removed the state: stale the issue has not been updated in a while and will be closed automatically soon unless it is updated label Feb 16, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants