From 0d524b38a4bd627c813d893e50aad249a48120bc Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Fri, 14 Apr 2023 21:05:48 +0200 Subject: [PATCH] Fixed handling of template template default arguments --- .../visitor/translation_unit_visitor.cc | 6 +++--- src/common/clang_utils.cc | 18 ++++++++++++++++++ src/common/clang_utils.h | 2 ++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index 836ea600..f63a1347 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -1006,11 +1006,11 @@ bool translation_unit_visitor::process_template_parameters( clang::dyn_cast_or_null( parameter); std::optional default_arg; - if (template_template_parameter->hasDefaultArgument()) + if (template_template_parameter->hasDefaultArgument()) { default_arg = common::to_string( template_template_parameter->getDefaultArgument() - .getArgument() - .getAsExpr()); + .getArgument()); + } auto ct = template_parameter::make_template_template_type( template_template_parameter->getNameAsString(), default_arg, template_template_parameter->isParameterPack()); diff --git a/src/common/clang_utils.cc b/src/common/clang_utils.cc index 6d203502..4ff16e8e 100644 --- a/src/common/clang_utils.cc +++ b/src/common/clang_utils.cc @@ -169,6 +169,24 @@ std::string to_string(const clang::RecordType &type, return to_string(type.desugar(), ctx, try_canonical); } +std::string to_string(const clang::TemplateArgument &arg) +{ + switch (arg.getKind()) { + case clang::TemplateArgument::Expression: + return to_string(arg.getAsExpr()); + case clang::TemplateArgument::Type: + return to_string(arg.getAsType()); + case clang::TemplateArgument::Null: + return ""; + case clang::TemplateArgument::NullPtr: + return "nullptr"; + case clang::TemplateArgument::Integral: + return std::to_string(arg.getAsIntegral().getExtValue()); + default: + return ""; + } +} + std::string to_string(const clang::Expr *expr) { const clang::LangOptions lang_options; diff --git a/src/common/clang_utils.h b/src/common/clang_utils.h index 18b6c548..38ac996f 100644 --- a/src/common/clang_utils.h +++ b/src/common/clang_utils.h @@ -81,6 +81,8 @@ std::string to_string(const clang::QualType &type, const clang::ASTContext &ctx, std::string to_string(const clang::RecordType &type, const clang::ASTContext &ctx, bool try_canonical = true); +std::string to_string(const clang::TemplateArgument &arg); + std::string to_string(const clang::Expr *expr); std::string to_string(const clang::Stmt *stmt);