microsoft / microsoft/vscode-cpptools

References and Call Hierarchy are wrong for constructors

Open
#14,629 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug Feature: Call Hierarchy Feature: Find All References Language Service
Dominant language
TypeScript
Stars
6.2k
Forks
1.7k
Avg merge
14h 46m
Merged PRs (30d)
61

Description

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):

  1. Find All References returns every mention of the Widget type instead of the actual construction sites (over-count).
  2. 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

  1. Extract P1-P1-ctor-Widget-int.zip and open the cpp-project folder in VS Code with the C/C++ extension enabled.
  2. Optionally configure with CMake Tools (preset cdb) so cpptools picks up compile_commands.json; the freestanding fixture also parses under default C++20 IntelliSense.
  3. 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
  1. 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
  1. 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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Extract P1-ctor-Widget-int.zip and reproduce the queries from src/widget.h against the construction sites in main.cpp and the definition in widget.cpp. Compare textDocument/references and callHierarchy/incomingCalls with the documented expected counts. Done means the constructor returns only its declaration, definition, and two construction sites, and both incoming callers appear.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, typescript
Domain
devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.