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

Clang in VS 17.7p1 doesn't grok _addcarry_u64/_subborrow_u64 #3713

Closed
CaseyCarter opened this issue May 17, 2023 · 3 comments · Fixed by #3866
Closed

Clang in VS 17.7p1 doesn't grok _addcarry_u64/_subborrow_u64 #3713

CaseyCarter opened this issue May 17, 2023 · 3 comments · Fixed by #3866
Labels
bug Something isn't working external This issue is unrelated to the STL fixed Something works now, yay!

Comments

@CaseyCarter
Copy link
Contributor

CaseyCarter commented May 17, 2023

The compiler is emitting calls as if these were separately-compiled functions instead of intrinsics that it should expand inline. This is not the case when installing LLVM 16.0.1 directly, so I suspect some kind of corruption of the VS in-box Clang. We need to figure out what's going on here, and communicate with the MS-internal folks who handle the in-box Clang to get it straightened out before 17.7 ships.

EDIT:
This bug has the same root cause as DevCom-10369658/VSO-1822920 "Clang 16.0 offsetof behavior difference". The issue is in how VS packages LLVM.

@CaseyCarter CaseyCarter added bug Something isn't working external This issue is unrelated to the STL labels May 17, 2023
@CaseyCarter
Copy link
Contributor Author

CaseyCarter commented May 26, 2023

Compiling this file (from DevCom-10369658):

#include <cstddef>

struct X { int a; int b; };

static_assert(offsetof(X, b) == 4);

with clang-cl /c /std:c++20 derp.cpp /showIncludes produces:

  • for the Clang 15.0.1 included in VS 17.6:
    Note: including file: c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\include\cstddef
    Note: including file:  c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\include\yvals_core.h
    Note: including file:   c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\include\vcruntime.h
    Note: including file:    c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\include\sal.h
    Note: including file:     c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\include\concurrencysal.h
    Note: including file:    c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\Llvm\x64\lib\clang\15.0.1\include\vadefs.h
    Note: including file:     c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\include\vadefs.h
    Note: including file:   c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\include\xkeycheck.h
    Note: including file:  c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\Llvm\x64\lib\clang\15.0.1\include\stddef.h
    Note: including file:   c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\Llvm\x64\lib\clang\15.0.1\include/__stddef_max_align_t.h
    Note: including file:  c:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.36.32532\include\xtr1common
    
  • for the Clang 16.0.1 included in LLVM-16.0.1:
    Note: including file: c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\cstddef
    Note: including file:  c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\yvals_core.h
    Note: including file:   c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\vcruntime.h
    Note: including file:    c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\sal.h
    Note: including file:     c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\concurrencysal.h
    Note: including file:    C:\Program Files\LLVM\lib\clang\16\include\vadefs.h
    Note: including file:     c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\vadefs.h
    Note: including file:   c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\xkeycheck.h
    Note: including file:  C:\Program Files\LLVM\lib\clang\16\include\stddef.h
    Note: including file:   C:\Program Files\LLVM\lib\clang\16\include/__stddef_max_align_t.h
    Note: including file:  c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\xtr1common  ```
    
  • for the Clang 16.0.1 in-box with VS17.7p1:
    Note: including file: c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\cstddef
    Note: including file:  c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\yvals_core.h
    Note: including file:   c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\vcruntime.h
    Note: including file:    c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\sal.h
    Note: including file:     c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\concurrencysal.h
    Note: including file:    c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\vadefs.h
    Note: including file:   c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\xkeycheck.h
    Note: including file:  C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt\stddef.h
    Note: including file:   C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt\corecrt.h
    Note: including file:  c:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.37.32705\include\xtr1common
    derp.cpp(5,15): error: static assertion expression is not an integral constant expression
    static_assert(offsetof(X, b) == 4);
                  ^~~~~~~~~~~~~~~~~~~
    C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt\stddef.h(47,31): note: expanded from macro 'offsetof'
            #define offsetof(s,m) ((::size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
                                  ^
    derp.cpp(5,15): note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
    C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt\stddef.h(47,32): note: expanded from macro 'offsetof'
            #define offsetof(s,m) ((::size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
                                  ^
    1 error generated.
    

The vs17.7p1 Clang isn't including its override headers??!?

@CaseyCarter
Copy link
Contributor Author

Aha! The bug is in the above: Clang 16 now expects to find its includes in $\lib\clang\16\include instead of $lib\clang\16.0.1\include where VS puts them.

@CaseyCarter
Copy link
Contributor Author

The layout problem has been fixed for VS 2022 v17.7 Preview 3. I'm going to leave this issue open as a reminder for us to remove the workarounds when 17.7p3 ships.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working external This issue is unrelated to the STL fixed Something works now, yay!
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants