Michael137 created this revision.
Michael137 added reviewers: aprantl, labath.
Herald added a project: All.
Michael137 requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.
This patch creates a new aggregate type that holds
information about a template argument. Currently this
is only its name but in future patches we plan to add
additional information.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D140262
Files:
lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
lldb/unittests/Symbol/TestTypeSystemClang.cpp
Index: lldb/unittests/Symbol/TestTypeSystemClang.cpp
===================================================================
--- lldb/unittests/Symbol/TestTypeSystemClang.cpp
+++ lldb/unittests/Symbol/TestTypeSystemClang.cpp
@@ -615,47 +615,52 @@
// Test that <typename T> with T = int creates a new template.
ClassTemplateDecl *single_type_arg =
- ExpectNewTemplate("<typename T>", {{"T"}, {intArg1}});
+ ExpectNewTemplate("<typename T>", {{{"T"}}, {intArg1}});
// Test that changing the parameter name doesn't create a new class template.
- ExpectReusedTemplate("<typename A> (A = int)", {{"A"}, {intArg1}},
+ ExpectReusedTemplate("<typename A> (A = int)", {{{"A"}}, {intArg1}},
single_type_arg);
// Test that changing the used type doesn't create a new class template.
- ExpectReusedTemplate("<typename A> (A = float)", {{"A"}, {floatArg}},
+ ExpectReusedTemplate("<typename A> (A = float)", {{{"A"}}, {floatArg}},
single_type_arg);
// Test that <typename A, signed char I> creates a new template with A = int
// and I = 47;
ClassTemplateDecl *type_and_char_value =
ExpectNewTemplate("<typename A, signed char I> (I = 47)",
- {{"A", "I"}, {floatArg, charArg1}});
+ {{{"A"}, {"I"}}, {floatArg, charArg1}});
// Change the value of the I parameter to 123. The previously created
// class template should still be reused.
ExpectReusedTemplate("<typename A, signed char I> (I = 123)",
- {{"A", "I"}, {floatArg, charArg2}}, type_and_char_value);
+ {{{"A"}, {"I"}}, {floatArg, charArg2}},
+ type_and_char_value);
// Change the type of the I parameter to int so we have <typename A, int I>.
// The class template from above can't be reused.
ExpectNewTemplate("<typename A, int I> (I = 123)",
- {{"A", "I"}, {floatArg, intArg2}});
+ {{{"A"}, {"I"}}, {floatArg, intArg2}});
// Test a second type parameter will also cause a new template to be created.
// We now have <typename A, int I, typename B>.
ClassTemplateDecl *type_and_char_value_and_type =
ExpectNewTemplate("<typename A, int I, typename B>",
- {{"A", "I", "B"}, {floatArg, intArg2, intArg1}});
+ {{{"A"}, {"I"}, {"B"}}, {floatArg, intArg2, intArg1}});
// Remove all the names from the parameters which shouldn't influence the
// way the templates get merged.
ExpectReusedTemplate("<typename, int, typename>",
- {{"", "", ""}, {floatArg, intArg2, intArg1}},
+ {{{""}, {""}, {""}}, {floatArg, intArg2, intArg1}},
type_and_char_value_and_type);
}
TEST_F(TestCreateClassTemplateDecl, FindExistingTemplatesWithParameterPack) {
// The same as FindExistingTemplates but for templates with parameter packs.
+
+ using ArgumentMetadata =
+ TypeSystemClang::TemplateParameterInfos::ArgumentMetadata;
+
TypeSystemClang::TemplateParameterInfos infos;
clang::TemplateArgument intArg1(m_ast->getASTContext().IntTy);
clang::TemplateArgument intArg2(m_ast->getASTContext(),
@@ -671,7 +676,7 @@
infos.SetParameterPack(
std::make_unique<TypeSystemClang::TemplateParameterInfos>(
- llvm::SmallVector<const char *>{"", ""},
+ llvm::SmallVector<ArgumentMetadata>{{""}, {""}},
llvm::SmallVector<TemplateArgument>{intArg1, intArg1}));
ClassTemplateDecl *type_pack =
@@ -687,42 +692,42 @@
// Change the type content of pack type values.
infos.SetParameterPack(
std::make_unique<TypeSystemClang::TemplateParameterInfos>(
- llvm::SmallVector<const char *>{"", ""},
+ llvm::SmallVector<ArgumentMetadata>{{""}, {""}},
llvm::SmallVector<TemplateArgument>{intArg1, longArg1}));
ExpectReusedTemplate("<typename ...> (int, long)", infos, type_pack);
// Change the number of pack values.
infos.SetParameterPack(
std::make_unique<TypeSystemClang::TemplateParameterInfos>(
- llvm::SmallVector<const char *>{""},
+ llvm::SmallVector<ArgumentMetadata>{{""}},
llvm::SmallVector<TemplateArgument>{intArg1}));
ExpectReusedTemplate("<typename ...> (int)", infos, type_pack);
// The names of the pack values shouldn't matter.
infos.SetParameterPack(
std::make_unique<TypeSystemClang::TemplateParameterInfos>(
- llvm::SmallVector<const char *>{"A"},
+ llvm::SmallVector<ArgumentMetadata>{{"A"}},
llvm::SmallVector<TemplateArgument>{intArg1}));
ExpectReusedTemplate("<typename ...> (int)", infos, type_pack);
// Changing the kind of template argument will create a new template.
infos.SetParameterPack(
std::make_unique<TypeSystemClang::TemplateParameterInfos>(
- llvm::SmallVector<const char *>{"A"},
+ llvm::SmallVector<ArgumentMetadata>{{"A"}},
llvm::SmallVector<TemplateArgument>{intArg2}));
ClassTemplateDecl *int_pack = ExpectNewTemplate("<int ...> (int = 1)", infos);
// Changing the value of integral parameters will not create a new template.
infos.SetParameterPack(
std::make_unique<TypeSystemClang::TemplateParameterInfos>(
- llvm::SmallVector<const char *>{"A"},
+ llvm::SmallVector<ArgumentMetadata>{{"A"}},
llvm::SmallVector<TemplateArgument>{intArg3}));
ExpectReusedTemplate("<int ...> (int = 123)", infos, int_pack);
// Changing the integral type will create a new template.
infos.SetParameterPack(
std::make_unique<TypeSystemClang::TemplateParameterInfos>(
- llvm::SmallVector<const char *>{"A"},
+ llvm::SmallVector<ArgumentMetadata>{{"A"}},
llvm::SmallVector<TemplateArgument>{longArg2}));
ExpectNewTemplate("<long ...> (long = 1)", infos);
Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
===================================================================
--- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
+++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
@@ -330,11 +330,15 @@
class TemplateParameterInfos {
public:
+ struct ArgumentMetadata {
+ char const *const name = nullptr;
+ };
+
TemplateParameterInfos() = default;
- TemplateParameterInfos(llvm::ArrayRef<const char *> names_in,
+ TemplateParameterInfos(llvm::ArrayRef<ArgumentMetadata> metadata,
llvm::ArrayRef<clang::TemplateArgument> args_in)
- : names(names_in), args(args_in) {
- assert(names.size() == args_in.size());
+ : args_metadata(metadata), args(args_in) {
+ assert(metadata.size() == args_in.size());
}
TemplateParameterInfos(TemplateParameterInfos const &) = delete;
@@ -350,7 +354,7 @@
// these template parameters as invalid.
if (pack_name && !packed_args)
return false;
- return args.size() == names.size() &&
+ return args.size() == args_metadata.size() &&
(!packed_args || !packed_args->packed_args);
}
@@ -358,7 +362,9 @@
size_t Size() const { return args.size(); }
llvm::ArrayRef<clang::TemplateArgument> GetArgs() const { return args; }
- llvm::ArrayRef<const char *> GetNames() const { return names; }
+ llvm::ArrayRef<ArgumentMetadata> GetMetadata() const {
+ return args_metadata;
+ }
clang::TemplateArgument const &Front() const {
assert(!args.empty());
@@ -367,7 +373,7 @@
void InsertArg(char const *name, clang::TemplateArgument arg) {
args.emplace_back(std::move(arg));
- names.push_back(name);
+ args_metadata.push_back({name});
}
// Parameter pack related
@@ -403,9 +409,9 @@
}
private:
- /// Element 'names[i]' holds the template argument name
+ /// Element 'args_metadata[i]' holds the template argument metadata
/// of 'args[i]'
- llvm::SmallVector<const char *, 2> names;
+ llvm::SmallVector<ArgumentMetadata, 2> args_metadata;
llvm::SmallVector<clang::TemplateArgument, 2> args;
const char * pack_name = nullptr;
Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
===================================================================
--- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -1382,9 +1382,9 @@
ast.getTranslationUnitDecl(); // Is this the right decl context?,
auto const &args = template_param_infos.GetArgs();
- auto const &names = template_param_infos.GetNames();
+ auto const &metadata = template_param_infos.GetMetadata();
for (size_t i = 0; i < num_template_params; ++i) {
- const char *name = names[i];
+ const char *name = metadata[i].name;
IdentifierInfo *identifier_info = nullptr;
if (name && name[0])
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits