#define A_MACRO i++ // semmle-extractor-options: -std=c++14 // non-template function void normal_function() { int i = 0; i++; } // nested template function template void inner_template_function() { T t; t++; } template void outer_template_function() { int i = 0; A_MACRO; inner_template_function(); } // non-template class class normal_class { int i; public: void a_method() { } template void a_template_method() { } }; // template class template class template_class { T t; public: void b_method() { } template void b_template_method(U u) { } }; // main int main() { normal_function(); outer_template_function(); outer_template_function(); { normal_class o1; template_class o2; o1.a_method(); o1.a_template_method(); o2.b_method(); o2.b_template_method('a'); } } // another template class template class AnotherTemplateClass { public: typedef T _t; struct MyClassStruct { _t value; }; MyClassStruct l; enum MyClassEnum { MyClassEnumConst }; void myMethod1(MyClassEnum mce1 = MyClassEnumConst) {} void myMethod2(MyClassEnum mce2 = MyClassEnumConst); }; template void AnotherTemplateClass :: myMethod2(MyClassEnum mce2) { } AnotherTemplateClass atc_int; void anotherMain() { atc_int.myMethod1(); atc_int.myMethod2(); } template T var_template; int normal_var; void function_using_vars() { var_template = 1; normal_var = 2; } // full specialization: _not_ an uninstantiated template. template<> class AnotherTemplateClass { int f() { return 0; } }; // partial specialization: _is_ and uninstantiated template. template class AnotherTemplateClass { int f() { return 1; } }; template class AnotherTemplateClass; template struct Outer { template struct Inner { U x; T y; }; }; template class Outer::Inner; template class incomplete_never_instantiated; template class never_instantiated { T x; }; template T decl_never_instantiated(T x); template T def_never_instantiated(T x) { return x; }