Introduce a new OpaquePtr<N> struct type, which is a simple POD wrapper for a
pointer.  Its purpose in life is to be a glorified void*, but which does not
implicitly convert to void* or other OpaquePtr's with a different UID.

Introduce Action::DeclPtrTy which is a typedef for OpaquePtr<0>.  Change the 
entire parser/sema interface to use DeclPtrTy instead of DeclTy*.  This
makes the C++ compiler enforce that these aren't convertible to other opaque
types.

We should also convert ExprTy, StmtTy, TypeTy, AttrTy, BaseTy, etc,
but I don't plan to do that in the short term.

The one outstanding known problem with this patch is that we lose the 
bitmangling optimization where ActionResult<DeclPtrTy> doesn't know how to
bitmangle the success bit into the low bit of DeclPtrTy.  I will rectify
this with a subsequent patch.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67952 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp
index adddb29..e7210b3 100644
--- a/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -20,8 +20,7 @@
 
 namespace {
   class VISIBILITY_HIDDEN TemplateDeclInstantiator 
-    : public DeclVisitor<TemplateDeclInstantiator, Decl *> 
-  {
+    : public DeclVisitor<TemplateDeclInstantiator, Decl *> {
     Sema &SemaRef;
     DeclContext *Owner;
     const TemplateArgument *TemplateArgs;
@@ -136,7 +135,7 @@
     if (Init.isInvalid())
       Var->setInvalidDecl();
     else
-      SemaRef.AddInitializerToDecl(Var, move(Init),
+      SemaRef.AddInitializerToDecl(Sema::DeclPtrTy::make(Var), move(Init),
                                    D->hasCXXDirectInitializer());
   }
 
@@ -204,9 +203,9 @@
 
   OwningExprResult Message = SemaRef.Clone(D->getMessage());
   Decl *StaticAssert 
-    = (Decl *)SemaRef.ActOnStaticAssertDeclaration(D->getLocation(), 
-                                                move(InstantiatedAssertExpr),
-                                                   move(Message));
+    = SemaRef.ActOnStaticAssertDeclaration(D->getLocation(), 
+                                           move(InstantiatedAssertExpr),
+                                           move(Message)).getAs<Decl>();
   return StaticAssert;
 }
 
@@ -218,7 +217,7 @@
   Owner->addDecl(Enum);
   Enum->startDefinition();
 
-  llvm::SmallVector<Sema::DeclTy *, 16> Enumerators;
+  llvm::SmallVector<Sema::DeclPtrTy, 16> Enumerators;
 
   EnumConstantDecl *LastEnumConst = 0;
   for (EnumDecl::enumerator_iterator EC = D->enumerator_begin(),
@@ -250,12 +249,12 @@
 
     if (EnumConst) {
       Enum->addDecl(EnumConst);
-      Enumerators.push_back(EnumConst);
+      Enumerators.push_back(Sema::DeclPtrTy::make(EnumConst));
       LastEnumConst = EnumConst;
     }
   }
       
-  SemaRef.ActOnEnumBody(Enum->getLocation(), Enum,
+  SemaRef.ActOnEnumBody(Enum->getLocation(), Sema::DeclPtrTy::make(Enum),
                         &Enumerators[0], Enumerators.size());
 
   return Enum;