Environment
cpptools — References and Call Hierarchy are wrong for the constructor ui::Widget::Widget(int)
| Field |
Value |
| Symbol (spec id) |
ctor-Widget-int |
| Declaration |
explicit Widget(int id); |
| Query position |
src/widget.h:13:14 (cursor on Widget) |
| Affected LSP requests |
textDocument/references, callHierarchy/incomingCalls |
| Repro archive |
P1-P1-ctor-Widget-int.zip (this folder) |
Summary
Two independent defects hit the same constructor when it is queried in VS Code with the C/C++ extension (cpptools):
- Find All References returns every mention of the
Widget type instead of the actual construction sites (over-count).
- Show Call Hierarchy → Show Incoming Calls returns nothing, so the constructor looks like it is never called (false "no callers").
The correct (expected) results are shown below.
Environment
- Editor: Visual Studio Code 1.33.5
- Extension: C/C++ (
ms-vscode.cpptools), default IntelliSense engine
- Language standard: C++20 — the fixture is freestanding (no STL/toolchain needed to parse)
Steps to reproduce
- Extract
P1-P1-ctor-Widget-int.zip and open the cpp-project folder in VS Code with the C/C++ extension enabled.
- Optionally configure with CMake Tools (preset
cdb) so cpptools picks up compile_commands.json; the freestanding fixture also parses under default C++20 IntelliSense.
- Open
src/widget.h, place the cursor on Widget in explicit Widget(int id); (line 13, col 14).
Adding a full repro in P1-ctor-Widget-int.zip attached file.
P1-ctor-Widget-int.zip
Defect 1 — textDocument/references
- Invoke Find All References (
Shift+Alt+F12).
| Source |
Result count |
| Expected |
4 |
| VS Code / cpptools |
28 |
Expected (4): the declaration (widget.h:13), the out-of-line definition (widget.cpp:9, Widget::Widget(int id)), and the two Widget(int) construction sites in main.cpp — the static ui::Widget storage(42); initializer in allocWidget() and ui::Widget b(7); in main().
Actual (28): every occurrence of the ui::Widget type — the typedef, the g_current pointer, the takeWidget/makeDefault/allocWidget/asConst parameter and return types, the Serializer<ui::Widget> specialization, and the type-mention lines in widget.cpp — none of which construct an object. A references query on the constructor collapses to "every mention of the enclosing type."
Defect 2 — callHierarchy/incomingCalls
- With the cursor at the same position, invoke Show Call Hierarchy and expand Incoming Calls.
| Source |
Result count |
| Expected |
2 |
| VS Code / cpptools |
0 |
Expected (2): incoming calls from allocWidget() (the storage(42) construction at main.cpp:29) and from main() (the b(7) construction at main.cpp:55).
Actual (0): the Call Hierarchy view shows no callers, i.e. the constructor appears to be dead.
Why it matters
- The empty incoming-calls result is a false "no callers" on live code: an automated agent (or a developer) can conclude
Widget(int) is never used and delete/prune construction paths that are actually exercised.
- The reference over-count means "where is this object constructed?" cannot be answered, the list is dominated by unrelated type mentions.
Environment
cpptools — References and Call Hierarchy are wrong for the constructor
ui::Widget::Widget(int)ctor-Widget-intexplicit Widget(int id);src/widget.h:13:14(cursor onWidget)textDocument/references,callHierarchy/incomingCallsP1-P1-ctor-Widget-int.zip(this folder)Summary
Two independent defects hit the same constructor when it is queried in VS Code with the C/C++ extension (cpptools):
Widgettype instead of the actual construction sites (over-count).The correct (expected) results are shown below.
Environment
ms-vscode.cpptools), default IntelliSense engineSteps to reproduce
P1-P1-ctor-Widget-int.zipand open thecpp-projectfolder in VS Code with the C/C++ extension enabled.cdb) so cpptools picks upcompile_commands.json; the freestanding fixture also parses under default C++20 IntelliSense.src/widget.h, place the cursor onWidgetinexplicit Widget(int id);(line 13, col 14).Adding a full repro in P1-ctor-Widget-int.zip attached file.
P1-ctor-Widget-int.zip
Defect 1 —
textDocument/referencesShift+Alt+F12).Expected (4): the declaration (
widget.h:13), the out-of-line definition (widget.cpp:9,Widget::Widget(int id)), and the twoWidget(int)construction sites inmain.cpp— thestatic ui::Widget storage(42);initializer inallocWidget()andui::Widget b(7);inmain().Actual (28): every occurrence of the
ui::Widgettype — thetypedef, theg_currentpointer, thetakeWidget/makeDefault/allocWidget/asConstparameter and return types, theSerializer<ui::Widget>specialization, and the type-mention lines inwidget.cpp— none of which construct an object. Areferencesquery on the constructor collapses to "every mention of the enclosing type."Defect 2 —
callHierarchy/incomingCallsExpected (2): incoming calls from
allocWidget()(thestorage(42)construction atmain.cpp:29) and frommain()(theb(7)construction atmain.cpp:55).Actual (0): the Call Hierarchy view shows no callers, i.e. the constructor appears to be dead.
Why it matters
Widget(int)is never used and delete/prune construction paths that are actually exercised.