[all-commits] [llvm/llvm-project] 942114: [clangd] Don't offer Extract to Function for a Var...

Christian Kandeler via All-commits all-commits at lists.llvm.org
Wed Sep 23 01:41:34 PDT 2026


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 942114858fd1124de32a0d1fd3885db8c9f37abb
      https://github.com/llvm/llvm-project/commit/942114858fd1124de32a0d1fd3885db8c9f37abb
  Author: Christian Kandeler <christian.kandeler at qt.io>
  Date:   2026-09-23 (Wed, 23 Sep 2026)

  Changed paths:
    M clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp
    M clang-tools-extra/clangd/unittests/tweaks/ExtractFunctionTests.cpp

  Log Message:
  -----------
  [clangd] Don't offer Extract to Function for a VarDecl's initializer (#225434)

Selecting just the initializer of a variable declaration, e.g.
`auto A = [[func()]];`, was incorrectly offered for extraction,
producing a void-returning function called where a value is required:

```cpp
void extracted() { func(); }
void f() { auto A = extracted(); }
```

This doesn't compile (auto can't deduce from void; a fixed type would
likewise fail to convert from void).

`getEnclosingStmt()` ascends from the selected node to what should be
its enclosing statement, rejecting the case where that turns out to be
an `Expr` (meaning the selection is a subexpression of a larger
expression, not a genuine statement). A `VarDecl`'s initializer isn't
caught by that check, though: ascending from it lands on the `VarDecl`
itself, which is a `Decl`, not a `Stmt` or `Expr`. Broaden the check to
reject unless the ascended-to parent is a `Stmt` (note `Expr` is itself
a `Stmt` subtype in Clang's AST, so this still needs the separate
`Expr` check to catch the original case).

Assisted-by: Claude



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list