From cbf1cb5e4d275d9f2d0ddd61da3a22ce4e71f5e9 Mon Sep 17 00:00:00 2001 From: rmrf Date: Sun, 22 Dec 2019 23:54:40 -0500 Subject: [PATCH] Templates should handle integral values too. --- src/FindTemplateParameters.cpp | 49 ++++++++++++++++++++++++++++------ tests/CMakeLists.txt | 2 +- tests/sreg-test.cpp | 1 + 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/FindTemplateParameters.cpp b/src/FindTemplateParameters.cpp index 9f0019d2f..f5723844a 100644 --- a/src/FindTemplateParameters.cpp +++ b/src/FindTemplateParameters.cpp @@ -8,7 +8,10 @@ using namespace scpar; FindTemplateParameters::FindTemplateParameters(CXXRecordDecl *declaration, llvm::raw_ostream &os) - : declaration_{declaration}, os_{os}, template_parameters_{nullptr}, template_args_{nullptr} { + : declaration_{declaration}, + os_{os}, + template_parameters_{nullptr}, + template_args_{nullptr} { if (declaration->hasDefinition() == true) { TraverseDecl(declaration); } @@ -25,13 +28,26 @@ bool FindTemplateParameters::VisitCXXRecordDecl(CXXRecordDecl *declaration) { if (const auto tdecl = dyn_cast(declaration)) { - //os_ << "@@ template specialization args: " << module_name << "\n"; + //tdecl->dump(); template_args_ = &tdecl->getTemplateArgs(); + os_ << "@@ template specialization args: " << module_name + << ", #args: " << template_args_->size() << "\n"; for (size_t i{0}; i < template_args_->size(); ++i) { - auto q{template_args_->get(i).getAsType()}; - auto name{q.getAsString()}; - os_ << "@@ size: " << template_args_->size() << ", arg0: " << name - << "\n"; + // Check the kind of the argument. + switch (template_args_->get(i).getKind()) { + case TemplateArgument::ArgKind::Integral: { + auto q{template_args_->get(i).getAsIntegral()}; + // auto name{q.getAsString()}; + os_ << "@@ Integral: " << q << "\n"; + }; break; + case TemplateArgument::ArgKind::Type: { + auto q{template_args_->get(i).getAsType()}; + auto name{q.getAsString()}; + os_ << "@@ arg: " << name << "\n"; + }; break; + default: { + } + }; } } @@ -69,8 +85,25 @@ vector FindTemplateParameters::getTemplateArgs() const { } for (const auto &arg : template_args_->asArray()) { - arg_list.push_back(arg.getAsType().getAsString()); - os_ << "Arg: " << arg.getAsType().getAsString() << "\n"; + std::string name{}; + switch (arg.getKind()) { + case TemplateArgument::ArgKind::Integral: { + // Return an LLVM APSInt type. + auto number{arg.getAsIntegral()}; + SmallString<10> small_str; + number.toString(small_str); + arg_list.push_back(string(small_str.c_str())); + os_ << "Arg: " << small_str << "\n"; + }; break; + case TemplateArgument::ArgKind::Type: { + auto q{arg.getAsType()}; + name = q.getAsString(); + arg_list.push_back(name); + os_ << "Arg: " << name << "\n"; + }; break; + default: { + } + }; } return arg_list; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 12cd287e3..3f911713d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -17,7 +17,7 @@ set( UNIT_TEST_LIST # t1 # t2 # t3 - # sreg-test + sreg-test # t4-matchers t5-template-matching # subtree-matcher-test diff --git a/tests/sreg-test.cpp b/tests/sreg-test.cpp index eedb4d5ef..d95c9b38c 100644 --- a/tests/sreg-test.cpp +++ b/tests/sreg-test.cpp @@ -34,6 +34,7 @@ TEST_CASE("sreg example", SystemCConsumer sc{from_ast}; sc.HandleTranslationUnit(from_ast->getASTContext()); auto model{sc.getSystemCModel()}; + // These are instances. auto module_decl{model->getModuleDecl()}; cout << "\n";