Files
clang-uml/docs/test_cases/t00044.md
2023-04-07 00:55:14 +02:00

9.9 KiB

t00044 - Test case for inner type aliases with parent class template args

Config

compilation_database_dir: ..
output_directory: puml
diagrams:
  t00044_class:
    type: class
    generate_packages: true
    glob:
      - ../../tests/t00044/t00044.cc
    using_namespace:
      - clanguml::t00044
    include:
      namespaces:
        - clanguml::t00044

Source code

File t00044.cc

// Inspired by skypjack/entt signal handlers
// This test case checks that at least clang-uml does not crash on this code
namespace clanguml::t00044 {

template <typename T> class sink;

template <typename T, typename A> class signal_handler;

template <typename Ret, typename... Args, typename A>
class sink<signal_handler<Ret(Args...), A>> {
    using signal_t = signal_handler<Ret(Args...), A>;

public:
    sink(signal_t &sh)
        : signal{&sh}
    {
    }

private:
    signal_t *signal;
};

template <typename Ret, typename... Args, typename A>
class signal_handler<Ret(Args...), A> { };

template <typename Ret, typename... Args, typename A>
sink(signal_handler<Ret(Args...), A> &)
    -> sink<signal_handler<Ret(Args...), A>>;

signal_handler<void(int), bool> int_handler;

struct R {
    sink<signal_handler<void(int), bool>> sink1{int_handler};
};

} // namespace clanguml::t00044

Generated UML diagrams

t00044_class

Generated JSON models

{
  "diagram_type": "class",
  "elements": [
    {
      "bases": [],
      "display_name": "clanguml::t00044::sink<clanguml::t00044::signal_handler<Ret(Args...),A>>",
      "id": "559574389062594251",
      "is_abstract": false,
      "is_nested": false,
      "is_struct": false,
      "is_template": true,
      "is_union": false,
      "members": [],
      "methods": [],
      "name": "sink",
      "namespace": "clanguml::t00044",
      "source_location": {
        "file": "../../tests/t00044/t00044.cc",
        "line": 10
      },
      "template_parameters": [
        {
          "is_variadic": false,
          "kind": "argument",
          "template_parameters": [
            {
              "is_variadic": false,
              "kind": "argument",
              "template_parameters": [
                {
                  "is_variadic": false,
                  "kind": "template_type",
                  "name": "Ret",
                  "template_parameters": []
                },
                {
                  "is_variadic": true,
                  "kind": "template_type",
                  "name": "Args...",
                  "template_parameters": []
                }
              ],
              "type": ""
            },
            {
              "is_variadic": false,
              "kind": "template_type",
              "name": "A",
              "template_parameters": []
            }
          ],
          "type": "clanguml::t00044::signal_handler"
        }
      ],
      "type": "class"
    },
    {
      "bases": [],
      "display_name": "clanguml::t00044::signal_handler<Ret(Args...),A>",
      "id": "1591729735727316875",
      "is_abstract": false,
      "is_nested": false,
      "is_struct": false,
      "is_template": true,
      "is_union": false,
      "members": [],
      "methods": [],
      "name": "signal_handler",
      "namespace": "clanguml::t00044",
      "source_location": {
        "file": "../../tests/t00044/t00044.cc",
        "line": 24
      },
      "template_parameters": [
        {
          "is_variadic": false,
          "kind": "template_type",
          "template_parameters": [
            {
              "is_variadic": false,
              "kind": "template_type",
              "name": "Ret",
              "template_parameters": []
            },
            {
              "is_variadic": true,
              "kind": "template_type",
              "name": "Args...",
              "template_parameters": []
            }
          ]
        },
        {
          "is_variadic": false,
          "kind": "template_type",
          "name": "A",
          "template_parameters": []
        }
      ],
      "type": "class"
    },
    {
      "bases": [],
      "display_name": "clanguml::t00044::signal_handler<void(int),bool>",
      "id": "103559998624864011",
      "is_abstract": false,
      "is_nested": false,
      "is_struct": false,
      "is_template": true,
      "is_union": false,
      "members": [],
      "methods": [],
      "name": "signal_handler",
      "namespace": "clanguml::t00044",
      "template_parameters": [
        {
          "is_variadic": false,
          "kind": "argument",
          "template_parameters": [
            {
              "is_variadic": false,
              "kind": "argument",
              "template_parameters": [],
              "type": "void"
            },
            {
              "is_variadic": false,
              "kind": "argument",
              "template_parameters": [],
              "type": "int"
            }
          ],
          "type": ""
        },
        {
          "is_variadic": false,
          "kind": "argument",
          "template_parameters": [],
          "type": "bool"
        }
      ],
      "type": "class"
    },
    {
      "bases": [],
      "display_name": "clanguml::t00044::sink<clanguml::t00044::signal_handler<void(int),bool>>",
      "id": "1718007222067272862",
      "is_abstract": false,
      "is_nested": false,
      "is_struct": false,
      "is_template": true,
      "is_union": false,
      "members": [],
      "methods": [],
      "name": "sink",
      "namespace": "clanguml::t00044",
      "template_parameters": [
        {
          "is_variadic": false,
          "kind": "argument",
          "template_parameters": [
            {
              "is_variadic": false,
              "kind": "argument",
              "template_parameters": [
                {
                  "is_variadic": false,
                  "kind": "argument",
                  "template_parameters": [],
                  "type": "void"
                },
                {
                  "is_variadic": false,
                  "kind": "argument",
                  "template_parameters": [],
                  "type": "int"
                }
              ],
              "type": ""
            },
            {
              "is_variadic": false,
              "kind": "argument",
              "template_parameters": [],
              "type": "bool"
            }
          ],
          "type": "clanguml::t00044::signal_handler"
        }
      ],
      "type": "class"
    },
    {
      "bases": [],
      "display_name": "clanguml::t00044::R",
      "id": "1644484569399365272",
      "is_abstract": false,
      "is_nested": false,
      "is_struct": true,
      "is_template": false,
      "is_union": false,
      "members": [
        {
          "access": "public",
          "is_static": false,
          "name": "sink1",
          "source_location": {
            "file": "../../tests/t00044/t00044.cc",
            "line": 33
          },
          "type": "sink<signal_handler<void (int),bool>>"
        }
      ],
      "methods": [],
      "name": "R",
      "namespace": "clanguml::t00044",
      "source_location": {
        "file": "../../tests/t00044/t00044.cc",
        "line": 32
      },
      "template_parameters": [],
      "type": "class"
    },
    {
      "bases": [],
      "display_name": "clanguml::t00044::signal_handler<T,A>",
      "id": "276594465967577895",
      "is_abstract": false,
      "is_nested": false,
      "is_struct": false,
      "is_template": true,
      "is_union": false,
      "members": [],
      "methods": [],
      "name": "signal_handler",
      "namespace": "clanguml::t00044",
      "source_location": {
        "file": "../../tests/t00044/t00044.cc",
        "line": 7
      },
      "template_parameters": [
        {
          "is_variadic": false,
          "kind": "template_type",
          "name": "T",
          "template_parameters": []
        },
        {
          "is_variadic": false,
          "kind": "template_type",
          "name": "A",
          "template_parameters": []
        }
      ],
      "type": "class"
    },
    {
      "bases": [],
      "display_name": "clanguml::t00044::sink<T>",
      "id": "1759724482769288325",
      "is_abstract": false,
      "is_nested": false,
      "is_struct": false,
      "is_template": true,
      "is_union": false,
      "members": [],
      "methods": [],
      "name": "sink",
      "namespace": "clanguml::t00044",
      "source_location": {
        "file": "../../tests/t00044/t00044.cc",
        "line": 5
      },
      "template_parameters": [
        {
          "is_variadic": false,
          "kind": "template_type",
          "name": "T",
          "template_parameters": []
        }
      ],
      "type": "class"
    }
  ],
  "metadata": {
    "clang_uml_version": "0.3.3-24-ge2a6b81",
    "llvm_version": "Ubuntu clang version 15.0.6",
    "schema_version": 1
  },
  "name": "t00044_class",
  "relationships": [
    {
      "access": "public",
      "destination": "1759724482769288325",
      "source": "559574389062594251",
      "type": "instantiation"
    },
    {
      "access": "public",
      "destination": "276594465967577895",
      "source": "1591729735727316875",
      "type": "instantiation"
    },
    {
      "access": "public",
      "destination": "1591729735727316875",
      "source": "103559998624864011",
      "type": "instantiation"
    },
    {
      "access": "public",
      "destination": "103559998624864011",
      "source": "1718007222067272862",
      "type": "dependency"
    },
    {
      "access": "public",
      "destination": "559574389062594251",
      "source": "1718007222067272862",
      "type": "instantiation"
    },
    {
      "access": "public",
      "destination": "1718007222067272862",
      "label": "sink1",
      "source": "1644484569399365272",
      "type": "aggregation"
    }
  ],
  "using_namespace": "clanguml::t00044"
}