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 lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits