vscode-cpptools
vscode-cpptools copied to clipboard
Weird interaction with C++20's abbreviated function template
Bug type: Language Service
Describe the bug
- OS and Version: Windows 10
- VS Code Version: 1.55.2
- C/C++ Extension Version: 1.3.1
- Other extensions you installed (and if the issue persists after disabling them):
- If using SSH remote, specify OS of remote machine:
- A clear and concise description of what the bug is, including information about the workspace (i.e. is the workspace a single project or multiple projects, size of the project, etc).
The language service compiler EDG fails to compile a valid C++20 code when using abbreviated function templates.
There are precisely two problems here: the two occurrences of abbreviated function template parameters
constexpr bind_back_wrap(const Fn &fn, auto &&...args)
and
constexpr auto operator()(auto &&...args)
They cause problems for EDG, but compiles fine with MSVC with C++20 (I used cl /c /MD /std:c++latest main.cpp)
EDG successfully compiles when you replace the occurrences with:
template <typename... Args>
constexpr bind_back_wrap(const Fn &fn, Args &&...args) : fn(fn), back_args{std::forward<Args>(args)...} {}
and
template <typename... Args>
constexpr auto operator()(Args &&...args) const
{
return std::apply(fn, std::tuple_cat(std::forward_as_tuple(std::forward<Args>(args)...), back_args));
}
Sorry if this repro is a little complex, as I couldn't repro the issue any other way.
Steps to reproduce
- Create a
main.cpp - Paste the following code:
#include <utility>
#include <functional>
#include <tuple>
template <typename Fn, typename... BackArgs>
struct bind_back_wrap
{
const Fn &fn;
std::tuple<BackArgs...> back_args;
constexpr bind_back_wrap(const Fn &fn, auto &&...args) : fn(fn),
back_args{std::forward<decltype(args)>(args)...} {}
constexpr auto operator()(auto &&...args) const
{
return std::apply(fn, std::tuple_cat(std::forward_as_tuple(std::forward<decltype(args)>(args)...), back_args));
}
};
template <typename Fn, typename... Args>
constexpr auto bind_back(const Fn &fn, Args &&...args)
{
return bind_back_wrap<Fn, Args...>(fn, std::forward<Args>(args)...);
}
inline constexpr auto add = [](const auto &a, const auto &b) { return a + b; };
int main()
{
auto foo = bind_back(add, 2);
foo(1);
}
- See error (or compile with
cl /BE /c /MD /std:c++latest main.cpp)
Expected behavior
Code should compile fine and no errors
Code sample and logs
-
Code sample
-
Configurations in
c_cpp_properties.json
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/Preview/VC/Tools/MSVC/14.29.30031/bin/Hostx64/x64/cl.exe",
"cStandard": "c17",
"cppStandard": "c++20",
"intelliSenseMode": "windows-msvc-x64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}
- Logs from running
C/C++: Log Diagnosticsfrom the VS Code command palette
-------- Diagnostics - 2021-04-30, 11:15:59 a.m.
Version: 1.3.1
Current Configuration:
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/Preview/VC/Tools/MSVC/14.29.30031/bin/Hostx64/x64/cl.exe",
"cStandard": "c17",
"cppStandard": "c++20",
"intelliSenseMode": "windows-msvc-x64",
"configurationProvider": "ms-vscode.cmake-tools",
"compilerArgs": [],
"intelliSenseModeIsExplicit": true,
"cStandardIsExplicit": true,
"cppStandardIsExplicit": true,
"compilerPathIsExplicit": true,
"browse": {
"path": [
"${workspaceFolder}/**"
],
"limitSymbolsToIncludedHeaders": true
}
}
Translation Unit Mappings:
[ C:\Users\Sam Huang\Projects\cpptools-repro-sandbox\main.cpp ]:
C:\USERS\SAM HUANG\PROJECTS\CPPTOOLS-REPRO-SANDBOX\MAIN.CPP
Translation Unit Configurations:
[ C:\Users\Sam Huang\Projects\cpptools-repro-sandbox\main.cpp ]:
Process ID: 3964
Memory Usage: 34 MB
Compiler Path: C:/Program Files (x86)/Microsoft Visual Studio/2019/Preview/VC/Tools/MSVC/14.29.30031/bin/Hostx64/x64/cl.exe
Includes:
C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\PREVIEW\VC\TOOLS\MSVC\14.29.30031\INCLUDE
C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.19041.0\UM
C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.19041.0\UCRT
C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.19041.0\SHARED
C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.19041.0\WINRT
C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.19041.0\CPPWINRT
Defines:
_DEBUG
UNICODE
_UNICODE
Standard Version: ms_c++latest
IntelliSense Mode: windows-msvc-x64
Total Memory Usage: 34 MB
------- Workspace parsing diagnostics -------
Number of files discovered (not excluded): 4809
- Logs from the language server logging
cpptools/didChangeCppProperties
MSVC intelliSenseMode specified. Configuring for compiler cl.exe.
Code browsing service initialized
MSVC intelliSenseMode specified. Configuring for compiler cl.exe.
Folder: C:/PROGRAM FILES (X86)/MICROSOFT VISUAL STUDIO/2019/PREVIEW/VC/TOOLS/MSVC/14.29.30031/INCLUDE/* will be indexed
Folder: C:/PROGRAM FILES (X86)/WINDOWS KITS/10/INCLUDE/10.0.19041.0/CPPWINRT/ will be indexed
Folder: C:/PROGRAM FILES (X86)/WINDOWS KITS/10/INCLUDE/10.0.19041.0/SHARED/ will be indexed
Folder: C:/PROGRAM FILES (X86)/WINDOWS KITS/10/INCLUDE/10.0.19041.0/UCRT/ will be indexed
Folder: C:/PROGRAM FILES (X86)/WINDOWS KITS/10/INCLUDE/10.0.19041.0/UM/ will be indexed
Folder: C:/PROGRAM FILES (X86)/WINDOWS KITS/10/INCLUDE/10.0.19041.0/WINRT/ will be indexed
Folder: C:/USERS/SAM HUANG/PROJECTS/CPPTOOLS-REPRO-SANDBOX/ will be indexed
cpptools/clearCustomConfigurations
Populate include completion cache.
Discovering files...
Processing folder (non-recursive): C:/PROGRAM FILES (X86)/MICROSOFT VISUAL STUDIO/2019/PREVIEW/VC/TOOLS/MSVC/14.29.30031/INCLUDE
Processing folder (recursive): C:/PROGRAM FILES (X86)/WINDOWS KITS/10/INCLUDE/10.0.19041.0/CPPWINRT/
Processing folder (recursive): C:/PROGRAM FILES (X86)/WINDOWS KITS/10/INCLUDE/10.0.19041.0/SHARED/
Processing folder (recursive): C:/PROGRAM FILES (X86)/WINDOWS KITS/10/INCLUDE/10.0.19041.0/UCRT/
Processing folder (recursive): C:/PROGRAM FILES (X86)/WINDOWS KITS/10/INCLUDE/10.0.19041.0/UM/
Processing folder (recursive): C:/PROGRAM FILES (X86)/WINDOWS KITS/10/INCLUDE/10.0.19041.0/WINRT/
Processing folder (recursive): C:/USERS/SAM HUANG/PROJECTS/CPPTOOLS-REPRO-SANDBOX/
Discovering files: 4810 file(s) processed
1 file(s) removed from database
Done discovering files.
Parsing remaining files...
Parsing: 0 files(s) processed
Done parsing remaining files.
cpptools/getCodeActions: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 2)
textDocument/didOpen: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp
cpptools/activeDocumentChange: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp
cpptools/textEditorSelectionChange
cpptools/getDocumentSymbols: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 3)
cpptools/textEditorSelectionChange
cpptools/getSemanticTokens: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 4)
cpptools/getDocumentSymbols
tag parsing file: C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\PREVIEW\VC\TOOLS\MSVC\14.29.30031\INCLUDE\CODEANALYSIS\SOURCEANNOTATIONS.H
idle loop: reparsing the active document
Checking for syntax errors: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp
sending compilation args for C:\USERS\SAM HUANG\PROJECTS\CPPTOOLS-REPRO-SANDBOX\MAIN.CPP
include: C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\PREVIEW\VC\TOOLS\MSVC\14.29.30031\INCLUDE
include: C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.19041.0\UM
include: C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.19041.0\UCRT
include: C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.19041.0\SHARED
include: C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.19041.0\WINRT
include: C:\PROGRAM FILES (X86)\WINDOWS KITS\10\INCLUDE\10.0.19041.0\CPPWINRT
define: _DEBUG
define: UNICODE
define: _UNICODE
stdver: ms_c++latest
intelliSenseMode: windows-msvc-x64
Queueing IntelliSense update for files in translation unit of: C:\USERS\SAM HUANG\PROJECTS\CPPTOOLS-REPRO-SANDBOX\MAIN.CPP
cpptools/finishUpdateSquiggles
Error squiggle count: 2
Update IntelliSense time (sec): 0.633
cpptools/getCodeActions: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 5)
cpptools/getFoldingRanges: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 6)
cpptools/abortRequest
cpptools/getFoldingRanges: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 7)
cpptools/getCodeActions: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 8)
cpptools/textEditorSelectionChange
cpptools/getCodeActions: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 9)
cpptools/activeDocumentChange: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp
cpptools/textEditorSelectionChange
idle loop: reparsing the active document
Checking for syntax errors: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp
Queueing IntelliSense update for files in translation unit of: C:\USERS\SAM HUANG\PROJECTS\CPPTOOLS-REPRO-SANDBOX\MAIN.CPP
cpptools/finishUpdateSquiggles
Error squiggle count: 1
Update IntelliSense time (sec): 0.267
cpptools/getSemanticTokens: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 10)
Database safe to open
cpptools/getFoldingRanges: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 11)
cpptools/getCodeActions: file:///c%3A/Users/Sam%20Huang/Projects/cpptools-repro-sandbox/main.cpp (id: 12)
Screenshots
Additional context
Thanks for reporting this. I've filed a bug on our shared VS parser. I'll add the URL once the bug becomes public.
Filed at https://developercommunity.visualstudio.com/t/C20-IntelliSense-error-function-canno/1411924
Fixed with https://github.com/microsoft/vscode-cpptools/releases/tag/v1.12.1