[clang-tools-extra] efd8c9e - [clangd] Add more incomplete_type diagnostics that could be fixed by include-fixer.
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 8 23:51:53 PDT 2020
Author: Haojian Wu
Date: 2020-10-09T08:51:18+02:00
New Revision: efd8c9ed726df5376ca8ac3ddc75ab91a40dd873
URL: https://github.com/llvm/llvm-project/commit/efd8c9ed726df5376ca8ac3ddc75ab91a40dd873
DIFF: https://github.com/llvm/llvm-project/commit/efd8c9ed726df5376ca8ac3ddc75ab91a40dd873.diff
LOG: [clangd] Add more incomplete_type diagnostics that could be fixed by include-fixer.
Differential Revision: https://reviews.llvm.org/D89036
Added:
Modified:
clang-tools-extra/clangd/IncludeFixer.cpp
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/IncludeFixer.cpp b/clang-tools-extra/clangd/IncludeFixer.cpp
index 0fd8db0d1167..e2bbb6c9c0dc 100644
--- a/clang-tools-extra/clangd/IncludeFixer.cpp
+++ b/clang-tools-extra/clangd/IncludeFixer.cpp
@@ -72,6 +72,12 @@ std::vector<Fix> IncludeFixer::fix(DiagnosticsEngine::Level DiagLevel,
case diag::err_incomplete_base_class:
case diag::err_incomplete_member_access:
case diag::err_incomplete_type:
+ case diag::err_typecheck_decl_incomplete_type:
+ case diag::err_typecheck_incomplete_tag:
+ case diag::err_invalid_incomplete_type_use:
+ case diag::err_sizeof_alignof_incomplete_or_sizeless_type:
+ case diag::err_for_range_incomplete_type:
+ case diag::err_func_def_incomplete_result:
// Incomplete type diagnostics should have a QualType argument for the
// incomplete type.
for (unsigned Idx = 0; Idx < Info.getNumArgs(); ++Idx) {
diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
index e80a135c0a99..00303a28b92a 100644
--- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -705,11 +705,18 @@ TEST(IncludeFixerTest, IncompleteType) {
$nested[[X::]]Nested n;
}
class Y : $base[[public ns::X]] {};
-int main() {
- ns::X *x;
+void test(ns::X *x, ns::X& ref_x) {
x$access[[->]]f();
auto& $type[[[]]a] = *x;
+
+ ns::X $incomplete[[var]];
+ $tag[[ref_x]]->f();
+ $use[[ns::X()]];
+ $sizeof[[sizeof]](ns::X);
+ for (auto it : $for[[ref_x]]);
}
+
+ns::X $return[[func]]() {}
)cpp");
auto TU = TestTU::withCode(Test.code());
TU.ExtraArgs.push_back("-std=c++17");
@@ -739,7 +746,37 @@ int main() {
"incomplete type 'ns::X' where a complete type is required"),
DiagName("incomplete_type"),
WithFix(Fix(Test.range("insert"), "#include \"x.h\"\n",
- "Add include \"x.h\" for symbol ns::X")))));
+ "Add include \"x.h\" for symbol ns::X"))),
+ AllOf(Diag(Test.range("incomplete"),
+ "variable has incomplete type 'ns::X'"),
+ DiagName("typecheck_decl_incomplete_type"),
+ WithFix(Fix(Test.range("insert"), "#include \"x.h\"\n",
+ "Add include \"x.h\" for symbol ns::X"))),
+ AllOf(
+ Diag(Test.range("tag"), "incomplete definition of type 'ns::X'"),
+ DiagName("typecheck_incomplete_tag"),
+ WithFix(Fix(Test.range("insert"), "#include \"x.h\"\n",
+ "Add include \"x.h\" for symbol ns::X"))),
+ AllOf(
+ Diag(Test.range("use"), "invalid use of incomplete type 'ns::X'"),
+ DiagName("invalid_incomplete_type_use"),
+ WithFix(Fix(Test.range("insert"), "#include \"x.h\"\n",
+ "Add include \"x.h\" for symbol ns::X"))),
+ AllOf(Diag(Test.range("sizeof"), "invalid application of 'sizeof' to "
+ "an incomplete type 'ns::X'"),
+ DiagName("sizeof_alignof_incomplete_or_sizeless_type"),
+ WithFix(Fix(Test.range("insert"), "#include \"x.h\"\n",
+ "Add include \"x.h\" for symbol ns::X"))),
+ AllOf(Diag(Test.range("for"),
+ "cannot use incomplete type 'ns::X' as a range"),
+ DiagName("for_range_incomplete_type"),
+ WithFix(Fix(Test.range("insert"), "#include \"x.h\"\n",
+ "Add include \"x.h\" for symbol ns::X"))),
+ AllOf(Diag(Test.range("return"),
+ "incomplete result type 'ns::X' in function definition"),
+ DiagName("func_def_incomplete_result"),
+ WithFix(Fix(Test.range("insert"), "#include \"x.h\"\n",
+ "Add include \"x.h\" for symbol ns::X")))));
}
TEST(IncludeFixerTest, NoSuggestIncludeWhenNoDefinitionInHeader) {
More information about the cfe-commits
mailing list