Clang Project

clang_source_code/test/Modules/Inputs/DebugCXX.h
1/* -*- C++ -*- */
2
3#include "dummy.h"
4
5namespace 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
23  // Templates (instantiations).
24  template<typename T> struct traits {};
25  template<typename T,
26           typename Traits = traits<T>
27          > class Template {
28    T member;
29  };
30  // Explicit template instantiation.
31  extern template class Template<int>;
32
33  extern template struct traits<float>;
34  typedef class Template<float> FloatInstantiation;
35
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;
55  // Anchored by a function parameter.
56  void foo(B) {}
57}
58
59// Virtual class with a forward declaration.
60struct Virtual;
61struct Virtual {
62  virtual ~Virtual() {}
63};
64
65struct PureForwardDecl;
66
67typedef union { int i; } TypedefUnion;
68typedef enum { e0 = 0 } TypedefEnum;
69typedef struct { int i; } TypedefStruct;
70
71union { int i; } GlobalUnion;
72struct { int i; } GlobalStruct;
73enum { e5 = 5 } GlobalEnum;
74
75namespace {
76  namespace {
77    struct InAnonymousNamespace { int i; };
78  }
79}
80
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};
91
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;
101
102// Member classes of class template specializations.
103template <typename T> struct Specialized {};
104
105template <> struct Specialized<int> {
106  struct Member;
107};
108
109template <class T> struct FwdDeclTemplateMember { struct Member; };
110typedef FwdDeclTemplateMember<int>::Member TypedefFwdDeclTemplateMember;
111
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;
117