diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -303,8 +303,8 @@ return true; } - if (D->getType()->getContainedAutoType()) { - if (!D->getType()->isDependentType()) { + if (auto *AT = D->getType()->getContainedAutoType()) { + if (AT->isDeduced() && !D->getType()->isDependentType()) { // Our current approach is to place the hint on the variable // and accordingly print the full type // (e.g. for `const auto& x = 42`, print `const int&`). diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -1256,6 +1256,13 @@ )cpp"); } +TEST(TypeHints, InvalidType) { + assertTypeHints(R"cpp( + auto x = (unknown_type)42; /*error-ok*/ + auto *y = (unknown_ptr)nullptr; + )cpp"); +} + TEST(TypeHints, ReturnTypeDeduction) { assertTypeHints( R"cpp(