lh123 created this revision.
lh123 added reviewers: sammccall, kadircet.
lh123 added projects: clang, clang-tools-extra.
Herald added subscribers: usaxena95, arphaman.
lh123 requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.
Desugar array type.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D115107
Files:
clang-tools-extra/clangd/unittests/HoverTests.cpp
clang/lib/AST/ASTDiagnostic.cpp
clang/test/Misc/diag-aka-types.cpp
Index: clang/test/Misc/diag-aka-types.cpp
===================================================================
--- clang/test/Misc/diag-aka-types.cpp
+++ clang/test/Misc/diag-aka-types.cpp
@@ -62,3 +62,9 @@
void (&f3)(decltype(1 + 2)) = 0; // expected-error{{non-const lvalue reference to type 'void (decltype(1 + 2))' (aka 'void (int)') cannot bind to a temporary of type 'int'}}
decltype(1+2) (&f4)(double, decltype(1 + 2)) = 0; // expected-error{{non-const lvalue reference to type 'decltype(1 + 2) (double, decltype(1 + 2))' (aka 'int (double, int)') cannot bind to a temporary of type 'int'}}
auto (&f5)() -> decltype(1+2) = 0; // expected-error{{non-const lvalue reference to type 'auto () -> decltype(1 + 2)' (aka 'auto () -> int') cannot bind to a temporary of type 'int'}}
+
+using C = decltype(1+2);;
+C a6[10];
+extern C a8[];
+int a9 = a6; // expected-error{{cannot initialize a variable of type 'int' with an lvalue of type 'C[10]' (aka 'int[10]')}}
+int a10 = a8; // expected-error{{cannot initialize a variable of type 'int' with an lvalue of type 'C[]' (aka 'int[]')}}
Index: clang/lib/AST/ASTDiagnostic.cpp
===================================================================
--- clang/lib/AST/ASTDiagnostic.cpp
+++ clang/lib/AST/ASTDiagnostic.cpp
@@ -131,6 +131,38 @@
}
}
+ if (const auto *CAT = dyn_cast<ConstantArrayType>(Ty)) {
+ QualType ElementTy =
+ desugarForDiagnostic(Context, CAT->getElementType(), ShouldAKA);
+ QT = Context.getConstantArrayType(
+ ElementTy, CAT->getSize(), CAT->getSizeExpr(), CAT->getSizeModifier(),
+ CAT->getIndexTypeCVRQualifiers());
+ break;
+ }
+ if (const auto *VAT = dyn_cast<VariableArrayType>(Ty)) {
+ QualType ElementTy =
+ desugarForDiagnostic(Context, VAT->getElementType(), ShouldAKA);
+ QT = Context.getVariableArrayType(
+ ElementTy, VAT->getSizeExpr(), VAT->getSizeModifier(),
+ VAT->getIndexTypeCVRQualifiers(), VAT->getBracketsRange());
+ break;
+ }
+ if (const auto *DSAT = dyn_cast<DependentSizedArrayType>(Ty)) {
+ QualType ElementTy =
+ desugarForDiagnostic(Context, DSAT->getElementType(), ShouldAKA);
+ QT = Context.getDependentSizedArrayType(
+ ElementTy, DSAT->getSizeExpr(), DSAT->getSizeModifier(),
+ DSAT->getIndexTypeCVRQualifiers(), DSAT->getBracketsRange());
+ break;
+ }
+ if (const auto *IAT = dyn_cast<IncompleteArrayType>(Ty)) {
+ QualType ElementTy =
+ desugarForDiagnostic(Context, IAT->getElementType(), ShouldAKA);
+ QT = Context.getIncompleteArrayType(ElementTy, IAT->getSizeModifier(),
+ IAT->getIndexTypeCVRQualifiers());
+ break;
+ }
+
// Don't desugar magic Objective-C types.
if (QualType(Ty,0) == Context.getObjCIdType() ||
QualType(Ty,0) == Context.getObjCClassType() ||
Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -969,6 +969,52 @@
HI.Definition = "template <typename T> using AA = A<T>";
HI.Type = {"A<T>", "type-parameter-0-0"}; // FIXME: should be 'T'
HI.TemplateParameters = {{{"typename"}, std::string("T"), llvm::None}};
+ }},
+ {// Constant array
+ R"cpp(
+ using m_int = int;
+
+ m_int ^[[arr]][10];
+ )cpp",
+ [](HoverInfo &HI) {
+ HI.Name = "arr";
+ HI.NamespaceScope = "";
+ HI.LocalScope = "";
+ HI.Kind = index::SymbolKind::Variable;
+ HI.Definition = "m_int arr[10]";
+ HI.Type = {"m_int[10]", "int[10]"};
+ }},
+ {// Incomplete array
+ R"cpp(
+ using m_int = int;
+
+ extern m_int ^[[arr]][];
+ )cpp",
+ [](HoverInfo &HI) {
+ HI.Name = "arr";
+ HI.NamespaceScope = "";
+ HI.LocalScope = "";
+ HI.Kind = index::SymbolKind::Variable;
+ HI.Definition = "extern m_int arr[]";
+ HI.Type = {"m_int[]", "int[]"};
+ }},
+ {// Dependent size array
+ R"cpp(
+ using m_int = int;
+
+ template<int Size>
+ struct Test {
+ m_int ^[[arr]][Size];
+ };
+ )cpp",
+ [](HoverInfo &HI) {
+ HI.Name = "arr";
+ HI.NamespaceScope = "";
+ HI.LocalScope = "Test<Size>::";
+ HI.AccessSpecifier = "public";
+ HI.Kind = index::SymbolKind::Field;
+ HI.Definition = "m_int arr[Size]";
+ HI.Type = {"m_int[Size]", "int[Size]"};
}}};
for (const auto &Case : Cases) {
SCOPED_TRACE(Case.Code);
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits