Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7a56cf9
Add plugin-specific login and EULA messages (#14519)
benmcmorran Jun 17, 2026
b271ed1
Bump markdown-it from 14.1.1 to 14.2.0 in /Extension (#14522)
dependabot[bot] Jun 18, 2026
541f2b1
Bump form-data from 4.0.5 to 4.0.6 in /Themes (#14527)
dependabot[bot] Jun 18, 2026
fcac9ac
Bump undici from 7.24.0 to 7.28.0 in /Themes (#14528)
dependabot[bot] Jun 18, 2026
205cdf6
Bump js-yaml from 4.1.1 to 4.2.0 in /Themes (#14529)
dependabot[bot] Jun 18, 2026
9b81536
Bump form-data from 4.0.5 to 4.0.6 in /ExtensionPack (#14530)
dependabot[bot] Jun 18, 2026
239deaf
get OptionsSchema.json back in sync with package.json (#14523)
bobbrow Jun 18, 2026
5993256
Update dependencies. (#14532)
sean-mcmanus Jun 18, 2026
53917c0
Update github actions dependencies. (#14531)
sean-mcmanus Jun 18, 2026
70b35dd
Lock debuginfod strings. (#14520)
sean-mcmanus Jun 18, 2026
0a72712
Allow suppression of run without debugging warnings (#14516)
bobbrow Jun 18, 2026
18e9335
Update changelog and TPN for 1.33.0. (#14533)
sean-mcmanus Jun 19, 2026
0b64d60
Substitute `${env:X}` with an empty string for unset environment vari…
notable-equivalent Jun 19, 2026
a1eef20
Update changelog again. (#14536)
sean-mcmanus Jun 19, 2026
6ea023c
Update survey URL (#14538)
Colengms Jun 23, 2026
1ad8241
Update .github/actions dependencies. (#14542)
sean-mcmanus Jun 23, 2026
faa8f42
Update changelog for 1.33.1. (#14543)
sean-mcmanus Jun 24, 2026
7af04f6
Fix errors in the previous changelog. (#14545)
sean-mcmanus Jun 25, 2026
959a4d1
Update changelog for 1.33.2. (#14547)
sean-mcmanus Jun 26, 2026
df58934
Fix TypeScript compilation errors in common.ts (#14551)
sean-mcmanus Jun 26, 2026
97b6775
Merge branch 'main' into seanmcm/vs_1_33_3
sean-mcmanus Jun 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
563 changes: 41 additions & 522 deletions .github/actions/package-lock.json

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion .github/actions/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
"@actions/github": "^8.0.1",
"@octokit/rest": "^21.1.1",
"@slack/web-api": "^6.9.1",
"applicationinsights": "^2.5.1",
"axios": "^1.16.0",
"uuid": "^14.0.0"
},
Expand Down
2 changes: 1 addition & 1 deletion Extension/.scripts/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ chdir($root);

// dump unhandled async errors to the console and exit.
process.on('unhandledRejection', (reason: any, _promise) => {
error(`${reason?.stack?.split(/\r?\n/).filter(l => !l.includes('node:internal') && !l.includes('node_modules')).join('\n')}`);
error(`${reason?.stack?.split(/\r?\n/).filter((l: string) => !l.includes('node:internal') && !l.includes('node_modules')).join('\n')}`);
process.exit(1);
});

Expand Down
32 changes: 32 additions & 0 deletions Extension/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,37 @@
# C/C++ for Visual Studio Code Changelog

## Version 1.33.2: June 26, 2026
### Bug Fixes
* Fix a regression with 'Find All References' with functions that exist in both C and C++ files. [#14546](https://github.com/microsoft/vscode-cpptools/issues/14546)
* Fix some regression crashes.

## Version 1.33.1: June 23, 2026
### Bug Fixes
* Fix 'Find All References' dropping valid references when a template parameter type has a typedef alias in only one translation unit. [#14344](https://github.com/microsoft/vscode-cpptools/issues/14344)
* Fix a crash regression on file open.
* Fix IntelliSense incorrectly resolving `#include` files through a symbolic link after the target directory was deleted from disk.
* Fix "tag parsing finished" status randomly getting reported too soon after a 'Reset IntelliSense Database' command.

## Version 1.33.0: June 22, 2026
### New Feature
* Unification of tag parsing with the VS implementation. In particular, it's now done using multiple parallel `cpptools-srv2` processes. [PR #14426](https://github.com/microsoft/vscode-cpptools/pull/14426)

### Enhancements
* Add the `debuginfod` launch option to the `cppdbg` debugger schema. [#14458](https://github.com/microsoft/vscode-cpptools/issues/14458), [#14460](https://github.com/microsoft/vscode-cpptools/issues/14460), [PR #14471](https://github.com/microsoft/vscode-cpptools/pull/14471), [PR #14506](https://github.com/microsoft/vscode-cpptools/pull/14506), [MIEngine#1562](https://github.com/microsoft/MIEngine/issues/1562)
* Add the `ignoreRunWithoutDebuggingWarnings` property to allow 'Run without debugging' warnings to be suppressed. [#14515](https://github.com/microsoft/vscode-cpptools/issues/14515)
* Various localization updates.

### Bug Fixes
* Fix an incorrect `invalid type conversion` IntelliSense error. [#11294](https://github.com/microsoft/vscode-cpptools/issues/11294)
* Fix include completion (with recursive includes) still suggesting headers from a deleted folder. [#12636](https://github.com/microsoft/vscode-cpptools/issues/12636)
* Add `important` to `C_Cpp.doxygen.sectionTags`. [PR #14473](https://github.com/microsoft/vscode-cpptools/pull/14473)
* Update the minimum supported VS Code version to 1.77. [PR #14502](https://github.com/microsoft/vscode-cpptools/pull/14502)
* Fix issues with the debugger `launch.json` schema. [PR #14523](https://github.com/microsoft/vscode-cpptools/pull/14523)
* Fix `${env:VAR}` and `${env.VAR}` not expanding to an empty string when the environment variable is unset, to match VS Code's behavior. [PR #14535](https://github.com/microsoft/vscode-cpptools/pull/14535)
* Thanks for the contribution. [@notable-equivalent](https://github.com/notable-equivalent)
* Fix the `C_Cpp.refactoring.includeHeader` setting not honoring `always`.
* Various other fixes found internally.

## Version 1.32.2: April 28, 2026
### New Feature
* Add support for "Run without debugging". [#1201](https://github.com/microsoft/vscode-cpptools/issues/1201)
Expand Down
2 changes: 1 addition & 1 deletion Extension/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ File questions, issues, or feature requests for the extension.
If someone has already filed an issue that encompasses your feedback, please leave a 👍 or 👎 reaction on the issue to upvote or downvote it to help us prioritize the issue.
<br>

**[Quick survey](https://www.research.net/r/VBVV6C6)**
**[Quick survey](https://aka.ms/vcvscodesurvey)**
<br>
Let us know what you think of the extension by taking the quick survey.

Expand Down
233 changes: 77 additions & 156 deletions Extension/ThirdPartyNotices.txt

Large diffs are not rendered by default.

15 changes: 13 additions & 2 deletions Extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "cpptools",
"displayName": "C/C++",
"description": "C/C++ IntelliSense, debugging, and code browsing.",
"version": "1.32.2-main",
"version": "1.33.2-main",
"publisher": "ms-vscode",
"icon": "LanguageCCPP_color_128x.png",
"readme": "README.md",
Expand Down Expand Up @@ -4859,6 +4859,11 @@
]
},
"default": []
},
"ignoreRunWithoutDebuggingWarnings": {
"type": "boolean",
"description": "%c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description%",
"default": false
}
}
},
Expand Down Expand Up @@ -5895,6 +5900,11 @@
}
}
}
},
"ignoreRunWithoutDebuggingWarnings": {
"type": "boolean",
"description": "%c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description%",
"default": false
}
}
},
Expand Down Expand Up @@ -6931,6 +6941,7 @@
"serialize-javascript": "^7.0.5",
"@azure/msal-browser": "^4.29.1",
"flatted": "^3.4.1",
"uuid": "^11.1.1"
"uuid": "^11.1.1",
"undici": "^7.28.0"
}
}
13 changes: 12 additions & 1 deletion Extension/package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,12 @@
"c_cpp.debuggers.symbolOptions.description": "Options to control how symbols (.pdb files) are found and loaded.",
"c_cpp.debuggers.unknownBreakpointHandling.description": "Controls how breakpoints set externally (usually via raw GDB commands) are handled when hit.\nAllowed values are \"throw\", which acts as if an exception was thrown by the application, and \"stop\", which only pauses the debug session. The default value is \"throw\".",
"c_cpp.debuggers.debuginfod.description": "Controls GDB's debuginfod behavior for downloading debug symbols from debuginfod servers.",
"c_cpp.debuggers.debuginfod.enabled.description": "If false (default), GDB will not contact debuginfod servers. Set to true to enable debuginfod support.",
"c_cpp.debuggers.debuginfod.enabled.description": {
"message": "If false (default), GDB will not contact debuginfod servers. Set to true to enable debuginfod support.",
"comment": [
"{Locked=\"false\"} {Locked=\"GDB\"} {Locked=\"true\"} {Locked=\"debuginfod\"}"
]
},
"c_cpp.debuggers.debuginfod.timeout.description": "The timeout in seconds for debuginfod server requests. Default is 30. Set to 0 to use GDB/libdebuginfod defaults (no override).",
"c_cpp.debuggers.VSSymbolOptions.description": "Provides configuration for locating and loading symbols to the debug adapter.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Array of symbol server URLs (example: http\u200b://MyExampleSymbolServer) or directories (example: /build/symbols) to search for .pdb files. These directories will be searched in addition to the default locations -- next to the module and the path where the pdb was originally dropped to.",
Expand All @@ -1026,6 +1031,12 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "Array of modules that the debugger should NOT load symbols for. Wildcards (example: MyCompany.*.dll) are supported.\n\nThis property is ignored unless 'mode' is set to 'loadAllButExcluded'.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "Array of modules that the debugger should load symbols for. Wildcards (example: MyCompany.*.dll) are supported.\n\nThis property is ignored unless 'mode' is set to 'loadOnlyIncluded'.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "If true, for any module NOT in the 'includedModules' array, the debugger will still check next to the module itself and the launching executable, but it will not check paths on the symbol search list. This option defaults to 'true'.\n\nThis property is ignored unless 'mode' is set to 'loadOnlyIncluded'.",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": {
"message": "If true, no warning will be logged when run without debugging fails to launch the program in the terminal.",
"comment": [
"{Locked=\"true\"}"
]
},
"c_cpp.semanticTokenTypes.referenceType.description": "Style for C++/CLI reference types.",
"c_cpp.semanticTokenTypes.cliProperty.description": "Style for C++/CLI properties.",
"c_cpp.semanticTokenTypes.genericType.description": "Style for C++/CLI generic types.",
Expand Down
21 changes: 16 additions & 5 deletions Extension/src/Debugger/debugAdapterDescriptorFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,21 +86,32 @@ function noDebugSupported(configuration: vscode.DebugConfiguration): boolean {
}

function logReasonForNoDebugNotSupported(configuration: vscode.DebugConfiguration): void {
if (configuration.ignoreRunWithoutDebuggingWarnings === true) {
return;
}

const disallowedProperties: string[] = [];
const outputChannel = getOutputChannel();
outputChannel.show(true);

if (configuration.request !== 'launch') {
outputChannel.appendLine(localize("debugger.noDebug.requestType.not.supported", "Run Without Debugging is only supported for launch configurations."));
return;
}
if (configuration.pipeTransport) {
outputChannel.appendLine(localize("debugger.noDebug.pipeTransport.not.supported", "Run Without Debugging is not supported for configurations with 'pipeTransport' set."));
disallowedProperties.push('pipeTransport');
}
if (configuration.debugServerPath) {
outputChannel.appendLine(localize("debugger.noDebug.debugServerPath.not.supported", "Run Without Debugging is not supported for configurations with 'debugServerPath' set."));
disallowedProperties.push('debugServerPath');
}
if (configuration.miDebuggerServerAddress) {
outputChannel.appendLine(localize("debugger.noDebug.miDebuggerServerAddress.not.supported", "Run Without Debugging is not supported for configurations with 'miDebuggerServerAddress' set."));
disallowedProperties.push('miDebuggerServerAddress');
}
if (configuration.coreDumpPath) {
outputChannel.appendLine(localize("debugger.noDebug.coreDumpPath.not.supported", "Run Without Debugging is not supported for configurations with 'coreDumpPath' set."));
disallowedProperties.push('coreDumpPath');
}
outputChannel.show(true);
outputChannel.appendLine(localize("debugger.unsupported.properties", "Launch configurations with the following properties cannot be run directly in the terminal: {0}", disallowedProperties.join(', ')));
outputChannel.appendLine(localize("debugger.fallback.message", "Program output will appear in the Debug Console instead."));
outputChannel.appendLine(localize("debugger.fallback.message2", "To suppress this warning, set the 'ignoreRunWithoutDebuggingWarnings' property to true in your launch configuration."));
}

2 changes: 1 addition & 1 deletion Extension/src/LanguageServer/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -944,7 +944,7 @@ function onToggleRefGroupView(): void {

function onTakeSurvey(): void {
telemetry.logLanguageServerEvent("onTakeSurvey");
const uri: vscode.Uri = vscode.Uri.parse(`https://www.research.net/r/VBVV6C6?o=${os.platform()}&m=${vscode.env.machineId}`);
const uri: vscode.Uri = vscode.Uri.parse(`https://aka.ms/vcvscodesurvey`);
void vscode.commands.executeCommand('vscode.open', uri);
}

Expand Down
20 changes: 12 additions & 8 deletions Extension/src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ import * as vscode from 'vscode';
import { DocumentFilter, Range } from 'vscode-languageclient';
import * as nls from 'vscode-nls';
import { TargetPopulation } from 'vscode-tas-client';
import * as which from "which";
import { ManualPromise } from './Utility/Async/manualPromise';
import { isWindows } from './constants';
import { getOutputChannelLogger, showOutputChannel } from './logger';
import { PlatformInformation } from './platform';
import * as Telemetry from './telemetry';
import which = require('which');

nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })();
const localize: nls.LocalizeFunc = nls.loadMessageBundle();
Expand Down Expand Up @@ -399,14 +399,12 @@ export function resolveVariables(input: string | undefined, additionalEnvironmen
const cycleCache = new Set<string>();
while (!cycleCache.has(ret)) {
cycleCache.add(ret);
ret = ret.replace(regexp(), (match: string, ignored1: string, varType: string, ignored2: string, name: string) => {
// Historically, if the variable didn't have anything before the "." or ":"
// it was assumed to be an environment variable
if (!varType) {
varType = "env";
}
ret = ret.replace(regexp(), (match: string, ignored1: string | undefined, varType: string | undefined, ignored2: string | undefined, name: string) => {
let newValue: string | undefined;
switch (varType) {
// Historically, if the variable didn't have anything before the "." or ":"
// it was assumed to be an environment variable
case undefined:
case "env": {
if (additionalEnvironment) {
const v: string | string[] | undefined = additionalEnvironment[name];
Expand All @@ -425,6 +423,12 @@ export function resolveVariables(input: string | undefined, additionalEnvironmen
if (newValue === undefined) {
newValue = process.env[name];
}

// If the environment variable is not set, we return an empty string. Only do
// this for ${env:X} variables, not ${X} variables.
if (newValue === undefined && varType !== undefined) {
newValue = "";
}
break;
}
case "config": {
Expand Down Expand Up @@ -1524,7 +1528,7 @@ export interface ISshLocalForwardInfo {

export function whichAsync(name: string, path?: string): Promise<string | undefined> {
return new Promise<string | undefined>(resolve => {
which(name, path ? { path } : {}, (err, resolved) => {
which(name, path ? { path } : {}, (err: Error | null, resolved: string | undefined) => {
if (err) {
resolve(undefined);
} else {
Expand Down
10 changes: 9 additions & 1 deletion Extension/src/nativeStrings.json
Original file line number Diff line number Diff line change
Expand Up @@ -557,10 +557,18 @@
"text": "GitHub login failed. Try running with --login from the command line to log in.",
"hint": "{Locked=\"GitHub\"} {Locked=\"--login\"}"
},
"auth_login_failed_plugin": {
"text": "GitHub login failed. Run npx @microsoft/cpp-language-server --login",
"hint": "{Locked=\"GitHub\"} {Locked=\"npx @microsoft/cpp-language-server --login\"}"
},
"auth_eula_required": {
"text": "EULA must be accepted to proceed. Run with --accept-eula.",
"hint": "{Locked=\"EULA\"} {Locked=\"--accept-eula\"}"
},
"auth_eula_required_plugin": {
"text": "EULA must be accepted to proceed. Run npx @microsoft/cpp-language-server --accept-eula",
"hint": "{Locked=\"EULA\"} {Locked=\"npx @microsoft/cpp-language-server --accept-eula\"}"
},
"auth_already_authenticated": {
"text": "Already authenticated with GitHub. Use --force-login to re-authenticate.",
"hint": "{Locked=\"GitHub\"} {Locked=\"--force-login\"}"
Expand Down Expand Up @@ -691,4 +699,4 @@
"help_allow_missing_lsp_config": "Allow the server to start even if the specified --lsp-config file does not exist.",
"initialize_failed_during_engine_setup": "Initialization failed during engine setup.",
"important_label": "Important:"
}
}
17 changes: 17 additions & 0 deletions Extension/test/scenarios/SingleRootProject/tests/common.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,23 @@ suite("resolveVariables", () => {
.shouldLookupSymbol("Root");
});

test("${env:X} expands to empty when unset", () => {
const processKey: string = `cpptoolstests_unset_${Date.now()}`;
delete process.env[processKey];
resolveVariablesWithInput("${env:" + processKey + "}")
.withEnvironment({})
.shouldResolveTo("");
});

test("${X} left unexpanded when unset", () => {
const processKey: string = `cpptoolstests_unset_${Date.now()}`;
delete process.env[processKey];
const token: string = "${" + processKey + "}";
resolveVariablesWithInput(token)
.withEnvironment({})
.shouldResolveTo(token);
});

test("escapeForSquiggles:", () => {
const testEscapeForSquigglesScenario: any = (input: string, expectedOutput: string) => {
const result: string = escapeForSquiggles(input);
Expand Down
28 changes: 19 additions & 9 deletions Extension/tools/OptionsSchema.json
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,6 @@
},
"SourceFileMapEntry": {
"type": "object",
"description": "%c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description%",
"default": {
"<source-path>": {
"editorPath": "",
Expand Down Expand Up @@ -847,6 +846,11 @@
},
"deploySteps": {
"$ref": "#/definitions/DeploySteps"
},
"ignoreRunWithoutDebuggingWarnings": {
"type": "boolean",
"description": "%c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description%",
"default": false
}
}
},
Expand All @@ -857,11 +861,6 @@
"program"
],
"properties": {
"program": {
"type": "string",
"description": "%c_cpp.debuggers.program.description%",
"default": "${workspaceRoot}/a.out"
},
"targetArchitecture": {
"type": "string",
"description": "%c_cpp.debuggers.targetArchitecture.description%",
Expand Down Expand Up @@ -907,6 +906,10 @@
"description": "%c_cpp.debuggers.useExtendedRemote.description%",
"default": false
},
"program": {
"type": "string",
"markdownDescription": "%c_cpp.debuggers.program.attach.markdownDescription%"
},
"processId": {
"markdownDescription": "%c_cpp.debuggers.processId.anyOf.markdownDescription%",
"anyOf": [
Expand Down Expand Up @@ -1118,21 +1121,28 @@
"searchPaths": [],
"searchMicrosoftSymbolServer": false
}
},
"ignoreRunWithoutDebuggingWarnings": {
"type": "boolean",
"description": "%c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description%",
"default": false
}
}
},
"CppvsdbgAttachOptions": {
"type": "object",
"default": {},
"required": [
"processId"
],
"required": [],
"properties": {
"symbolSearchPath": {
"type": "string",
"description": "%c_cpp.debuggers.symbolSearchPath.description%",
"default": ""
},
"program": {
"type": "string",
"markdownDescription": "%c_cpp.debuggers.program.attach.markdownDescription%"
},
"processId": {
"markdownDescription": "%c_cpp.debuggers.processId.anyOf.markdownDescription%",
"anyOf": [
Expand Down
Loading
Loading