@@ -27,59 +27,64 @@ namespace clang {
27
27
class CXXBaseOrMemberInitializer ;
28
28
class CXXBaseSpecifier ;
29
29
class Decl ;
30
+ class DeclGroupRef ;
30
31
class Expr ;
31
32
class NestedNameSpecifier ;
32
33
class Stmt ;
34
+ class TemplateName ;
33
35
class TemplateParameterList ;
34
36
35
37
// / OpaquePtr - This is a very simple POD type that wraps a pointer that the
36
38
// / Parser doesn't know about but that Sema or another client does. The UID
37
39
// / template argument is used to make sure that "Decl" pointers are not
38
40
// / compatible with "Type" pointers for example.
39
- template < int UID >
41
+ template < class PtrTy >
40
42
class OpaquePtr {
41
43
void *Ptr ;
44
+ explicit OpaquePtr (void *Ptr ) : Ptr(Ptr ) {}
45
+
42
46
public:
43
47
OpaquePtr () : Ptr (0 ) {}
44
48
45
- template <typename T>
46
- T* getAs () const {
47
- return llvm::PointerLikeTypeTraits<T*>::getFromVoidPointer (Ptr );
49
+ static OpaquePtr make (PtrTy P) {
50
+ OpaquePtr OP; OP.set (P); return OP;
48
51
}
49
52
50
- template <typename T>
51
- T getAsVal () const {
52
- return llvm::PointerLikeTypeTraits<T>::getFromVoidPointer (Ptr );
53
+ template <typename T> T* getAs () const {
54
+ return get ();
53
55
}
54
56
55
- void *get () const { return Ptr ; }
57
+ template <typename T> T getAsVal () const {
58
+ return get ();
59
+ }
56
60
57
- template <typename T>
58
- static OpaquePtr make (T P) {
59
- OpaquePtr R; R.set (P); return R;
61
+ PtrTy get () const {
62
+ return llvm::PointerLikeTypeTraits<PtrTy>::getFromVoidPointer (Ptr );
60
63
}
61
64
62
- template <typename T>
63
- void set (T P) {
64
- Ptr = llvm::PointerLikeTypeTraits<T>::getAsVoidPointer (P);
65
+ void set (PtrTy P) {
66
+ Ptr = llvm::PointerLikeTypeTraits<PtrTy>::getAsVoidPointer (P);
65
67
}
66
68
67
69
operator bool () const { return Ptr != 0 ; }
70
+
71
+ void *getAsOpaquePtr () const { return Ptr ; }
72
+ static OpaquePtr getFromOpaquePtr (void *P) { return OpaquePtr (P); }
68
73
};
69
74
}
70
75
71
76
namespace llvm {
72
- template <int UID >
73
- class PointerLikeTypeTraits <clang::OpaquePtr<UID > > {
77
+ template <class T >
78
+ class PointerLikeTypeTraits <clang::OpaquePtr<T > > {
74
79
public:
75
- static inline void *getAsVoidPointer (clang::OpaquePtr<UID > P) {
80
+ static inline void *getAsVoidPointer (clang::OpaquePtr<T > P) {
76
81
// FIXME: Doesn't work? return P.getAs< void >();
77
- return P.get ();
82
+ return P.getAsOpaquePtr ();
78
83
}
79
- static inline clang::OpaquePtr<UID > getFromVoidPointer (void *P) {
80
- return clang::OpaquePtr<UID >::make (P);
84
+ static inline clang::OpaquePtr<T > getFromVoidPointer (void *P) {
85
+ return clang::OpaquePtr<T >::getFromOpaquePtr (P);
81
86
}
82
- enum { NumLowBitsAvailable = 3 };
87
+ enum { NumLowBitsAvailable = 0 };
83
88
};
84
89
}
85
90
@@ -207,8 +212,8 @@ namespace clang {
207
212
208
213
// Types - Though these don't actually enforce strong typing, they document
209
214
// what types are required to be identical for the actions.
210
- typedef OpaquePtr<1 > DeclGroupPtrTy;
211
- typedef OpaquePtr<2 > TemplateTy;
215
+ typedef OpaquePtr<DeclGroupRef > DeclGroupPtrTy;
216
+ typedef OpaquePtr<TemplateName > TemplateTy;
212
217
typedef Attr AttrTy;
213
218
typedef CXXBaseSpecifier BaseTy;
214
219
typedef CXXBaseOrMemberInitializer MemInitTy;
@@ -535,6 +540,7 @@ namespace clang {
535
540
typedef ActionBase::ActionResult<CXXBaseOrMemberInitializer*> MemInitResult;
536
541
537
542
typedef ActionBase::ActionResult<Decl*> DeclResult;
543
+ typedef OpaquePtr<TemplateName> ParsedTemplateTy;
538
544
}
539
545
540
546
#endif
0 commit comments