blob: 8f83c0bc69dba714a9b758adc8c513c6db352ab7 [file] [log] [blame]
Adrian Prantl4aa2b3a2015-09-08 19:20:27 +00001/* -*- C++ -*- */
Adrian Prantlc5e36472018-01-03 19:10:21 +00002
3#include "dummy.h"
4
Adrian Prantl4aa2b3a2015-09-08 19:20:27 +00005namespace DebugCXX {
6 // Records.
7 struct Struct {
8 int i;
9 static int static_member;
10 };
11
12 // Enums.
13 enum Enum {
14 Enumerator
15 };
16 enum {
17 e1 = '1'
18 };
19 enum {
20 e2 = '2'
21 };
22
Adrian Prantlb2a8b352016-01-06 19:22:23 +000023 // Templates (instantiations).
Adrian Prantl4aa2b3a2015-09-08 19:20:27 +000024 template<typename T> struct traits {};
25 template<typename T,
26 typename Traits = traits<T>
27 > class Template {
28 T member;
29 };
Adrian Prantl05fefa42016-04-25 20:52:40 +000030 // Explicit template instantiation.
Adrian Prantl4aa2b3a2015-09-08 19:20:27 +000031 extern template class Template<int>;
32
33 extern template struct traits<float>;
Adrian Prantl05fefa42016-04-25 20:52:40 +000034 typedef class Template<float> FloatInstantiation;
Adrian Prantl4aa2b3a2015-09-08 19:20:27 +000035
36 inline void fn() {
37 Template<long> invisible;
38 }
39
40 // Non-template inside a template.
41 template <class> struct Outer {
42 Outer();
43 struct Inner {
44 Inner(Outer) {}
45 };
46 };
47 template <class T> Outer<T>::Outer() {
48 Inner a(*this);
49 };
50
51 // Partial template specialization.
52 template <typename...> class A;
53 template <typename T> class A<T> {};
54 typedef A<void> B;
Adrian Prantl05fefa42016-04-25 20:52:40 +000055 // Anchored by a function parameter.
Adrian Prantl4aa2b3a2015-09-08 19:20:27 +000056 void foo(B) {}
57}
Adrian Prantlb3b821f2016-01-06 19:22:19 +000058
59// Virtual class with a forward declaration.
Adrian Prantla43acdc2017-07-24 23:48:51 +000060struct Virtual;
61struct Virtual {
62 virtual ~Virtual() {}
Adrian Prantlb3b821f2016-01-06 19:22:19 +000063};
Adrian Prantl35e765b2016-01-09 01:11:35 +000064
65struct PureForwardDecl;
Adrian Prantle5238d22016-01-19 18:02:47 +000066
67typedef union { int i; } TypedefUnion;
68typedef enum { e0 = 0 } TypedefEnum;
69typedef struct { int i; } TypedefStruct;
Adrian Prantlcd975012016-01-19 23:42:44 +000070
71union { int i; } GlobalUnion;
72struct { int i; } GlobalStruct;
73enum { e5 = 5 } GlobalEnum;
Adrian Prantl8f55b662016-01-20 01:29:34 +000074
75namespace {
76 namespace {
77 struct InAnonymousNamespace { int i; };
78 }
79}
Adrian Prantl5a9a4272016-03-07 20:58:52 +000080
81class Base;
82class A {
83 virtual Base *getParent() const;
84};
85class Base {};
86class Derived : Base {
87 class B : A {
88 Derived *getParent() const override;
89 };
90};
Adrian Prantl05fefa42016-04-25 20:52:40 +000091
92template <class T>
93class Template1 {
94 T t;
95};
96typedef Template1<void *> TypedefTemplate;
97extern template class Template1<int>;
98
99template <class T> class FwdDeclTemplate;
100typedef FwdDeclTemplate<int> TypedefFwdDeclTemplate;
Adrian Prantl90931c42016-04-26 21:58:23 +0000101
102// Member classes of class template specializations.
Adrian Prantl0dabc2a2016-04-26 23:37:38 +0000103template <typename T> struct Specialized {};
104
105template <> struct Specialized<int> {
106 struct Member;
Adrian Prantl90931c42016-04-26 21:58:23 +0000107};
108
Adrian Prantl0dabc2a2016-04-26 23:37:38 +0000109template <class T> struct FwdDeclTemplateMember { struct Member; };
110typedef FwdDeclTemplateMember<int>::Member TypedefFwdDeclTemplateMember;
Adrian Prantl26cb1d22016-08-17 18:27:24 +0000111
112// Base class specialized on the class itself.
113template <typename Derived> class BaseTemplate {};
114template <typename T>
115class WithSpecializedBase : public BaseTemplate<WithSpecializedBase<T>> {};
116typedef WithSpecializedBase<float> SpecializedBase;