]> granicus.if.org Git - clang/commitdiff
Remove OriginalTypeParmDecl; the original type is the one specified
authorJohn McCall <rjmccall@apple.com>
Fri, 23 Oct 2009 21:48:59 +0000 (21:48 +0000)
committerJohn McCall <rjmccall@apple.com>
Fri, 23 Oct 2009 21:48:59 +0000 (21:48 +0000)
in the DeclaratorInfo, if one is present.

Preserve source information through template instantiation.  This is made
more complicated by the possibility that ParmVarDecls don't have DIs, which
is possibly worth fixing in the future.

Also preserve source information for function parameters in ObjC method
declarations.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84971 91177308-0d34-0410-b5e6-96231b3b80d8

14 files changed:
include/clang/AST/Decl.h
include/clang/AST/DeclNodes.def
include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h
include/clang/Frontend/PCHBitCodes.h
lib/AST/Decl.cpp
lib/AST/DeclBase.cpp
lib/AST/DeclPrinter.cpp
lib/Frontend/ASTConsumers.cpp
lib/Frontend/PCHReaderDecl.cpp
lib/Frontend/PCHWriter.cpp
lib/Frontend/PCHWriterDecl.cpp
lib/Sema/SemaDecl.cpp
lib/Sema/SemaDeclObjC.cpp
lib/Sema/SemaTemplateInstantiateDecl.cpp

index 72ce0d852cfc55af46cdd06f5de80df080925d25..cd4535d70ca2d865ebb6cbbf10ec6ad2174e5870 100644 (file)
@@ -768,7 +768,11 @@ public:
     Init = (UnparsedDefaultArgument *)0;
   }
 
-  QualType getOriginalType() const;
+  QualType getOriginalType() const {
+    if (getDeclaratorInfo())
+      return getDeclaratorInfo()->getType();
+    return getType();
+  }
 
   /// setOwningFunction - Sets the function declaration that owns this
   /// ParmVarDecl. Since ParmVarDecls are often created before the
@@ -778,41 +782,11 @@ public:
 
   // Implement isa/cast/dyncast/etc.
   static bool classof(const Decl *D) {
-    return (D->getKind() == ParmVar ||
-            D->getKind() == OriginalParmVar);
+    return (D->getKind() == ParmVar);
   }
   static bool classof(const ParmVarDecl *D) { return true; }
 };
 
-/// OriginalParmVarDecl - Represent a parameter to a function, when
-/// the type of the parameter has been promoted. This node represents the
-/// parameter to the function with its original type.
-///
-class OriginalParmVarDecl : public ParmVarDecl {
-  friend class ParmVarDecl;
-protected:
-  QualType OriginalType;
-private:
-  OriginalParmVarDecl(DeclContext *DC, SourceLocation L,
-                              IdentifierInfo *Id, QualType T,
-                              DeclaratorInfo *DInfo,
-                              QualType OT, StorageClass S,
-                              Expr *DefArg)
-  : ParmVarDecl(OriginalParmVar, DC, L, Id, T, DInfo, S, DefArg),
-    OriginalType(OT) {}
-public:
-  static OriginalParmVarDecl *Create(ASTContext &C, DeclContext *DC,
-                                     SourceLocation L,IdentifierInfo *Id,
-                                     QualType T, DeclaratorInfo *DInfo,
-                                     QualType OT, StorageClass S, Expr *DefArg);
-
-  void setOriginalType(QualType T) { OriginalType = T; }
-
-  // Implement isa/cast/dyncast/etc.
-  static bool classof(const Decl *D) { return D->getKind() == OriginalParmVar; }
-  static bool classof(const OriginalParmVarDecl *D) { return true; }
-};
-
 /// FunctionDecl - An instance of this class is created to represent a
 /// function declaration or definition.
 ///
index 79a0d368288c03495a379473dfdfe83220fae80d..3ef3cc3f09753f3c93e15b94792ae5747e13182f 100644 (file)
@@ -103,7 +103,6 @@ ABSTRACT_DECL(Named,  Decl)
       DECL(Var, DeclaratorDecl)
         DECL(ImplicitParam, VarDecl)
         DECL(ParmVar, VarDecl)
-          DECL(OriginalParmVar, ParmVarDecl)
         DECL(NonTypeTemplateParm, VarDecl)
   DECL(Template, NamedDecl)
     DECL(FunctionTemplate, TemplateDecl)
index 3826d3a3acd6e4c0a189ff99ca3597ad46ef16e1..afc63616e9fc3b0d4445d66181baeeba1fa53a39 100644 (file)
@@ -57,7 +57,6 @@ public:
         DISPATCH_CASE(Function,FunctionDecl)
         DISPATCH_CASE(Var,VarDecl)
         DISPATCH_CASE(ParmVar,ParmVarDecl)       // FIXME: (same)
-        DISPATCH_CASE(OriginalParmVar,OriginalParmVarDecl) // FIXME: (same)
         DISPATCH_CASE(ImplicitParam,ImplicitParamDecl)
         DISPATCH_CASE(EnumConstant,EnumConstantDecl)
         DISPATCH_CASE(Typedef,TypedefDecl)
@@ -70,7 +69,6 @@ public:
 
   DEFAULT_DISPATCH(VarDecl)
   DEFAULT_DISPATCH(FunctionDecl)
-  DEFAULT_DISPATCH_VARDECL(OriginalParmVarDecl)
   DEFAULT_DISPATCH_VARDECL(ParmVarDecl)
   DEFAULT_DISPATCH(ImplicitParamDecl)
   DEFAULT_DISPATCH(EnumConstantDecl)
index 1e953d67122663472e21daf1bf30b11866e9555a..9e79114e131a72595359c86f6a15b7fa2e09be49 100644 (file)
@@ -496,8 +496,6 @@ namespace clang {
       DECL_IMPLICIT_PARAM,
       /// \brief A ParmVarDecl record.
       DECL_PARM_VAR,
-      /// \brief An OriginalParmVarDecl record.
-      DECL_ORIGINAL_PARM_VAR,
       /// \brief A FileScopeAsmDecl record.
       DECL_FILE_SCOPE_ASM,
       /// \brief A BlockDecl record.
index d270a958f0aefabd4c8f3386d7141acb1d1fe368..19d00de7457c40c3465575cc717e32d5d9178fb2 100644 (file)
@@ -91,13 +91,6 @@ ParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC,
   return new (C) ParmVarDecl(ParmVar, DC, L, Id, T, DInfo, S, DefArg);
 }
 
-QualType ParmVarDecl::getOriginalType() const {
-  if (const OriginalParmVarDecl *PVD =
-      dyn_cast<OriginalParmVarDecl>(this))
-    return PVD->OriginalType;
-  return getType();
-}
-
 SourceRange ParmVarDecl::getDefaultArgRange() const {
   if (const Expr *E = getInit())
     return E->getSourceRange();
@@ -140,14 +133,6 @@ bool VarDecl::isExternC() const {
   return false;
 }
 
-OriginalParmVarDecl *OriginalParmVarDecl::Create(
-                                 ASTContext &C, DeclContext *DC,
-                                 SourceLocation L, IdentifierInfo *Id,
-                                 QualType T, DeclaratorInfo *DInfo,
-                                 QualType OT, StorageClass S, Expr *DefArg) {
-  return new (C) OriginalParmVarDecl(DC, L, Id, T, DInfo, OT, S, DefArg);
-}
-
 FunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC,
                                    SourceLocation L,
                                    DeclarationName N, QualType T,
index 224bf877ad249c6dd81baa8b8c06e2d7944d5fa9..6cfdcdd3e50e1f31937ba5a00017b3dddf5be5ba 100644 (file)
@@ -199,7 +199,6 @@ unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) {
     case Var:
     case ImplicitParam:
     case ParmVar:
-    case OriginalParmVar:
     case NonTypeTemplateParm:
     case Using:
     case UnresolvedUsing:
index 9d0d836cf62b9f0aebc28e57f402e8a552e095b9..7ef30c3bb34fd8eaec09ae9571dc2d0485d2072f 100644 (file)
@@ -52,7 +52,6 @@ namespace {
     void VisitFieldDecl(FieldDecl *D);
     void VisitVarDecl(VarDecl *D);
     void VisitParmVarDecl(ParmVarDecl *D);
-    void VisitOriginalParmVarDecl(OriginalParmVarDecl *D);
     void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
     void VisitOverloadedFunctionDecl(OverloadedFunctionDecl *D);
     void VisitNamespaceDecl(NamespaceDecl *D);
@@ -489,7 +488,7 @@ void DeclPrinter::VisitVarDecl(VarDecl *D) {
 
   std::string Name = D->getNameAsString();
   QualType T = D->getType();
-  if (OriginalParmVarDecl *Parm = dyn_cast<OriginalParmVarDecl>(D))
+  if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D))
     T = Parm->getOriginalType();
   T.getAsStringInternal(Name, Policy);
   Out << Name;
@@ -508,10 +507,6 @@ void DeclPrinter::VisitParmVarDecl(ParmVarDecl *D) {
   VisitVarDecl(D);
 }
 
-void DeclPrinter::VisitOriginalParmVarDecl(OriginalParmVarDecl *D) {
-  VisitVarDecl(D);
-}
-
 void DeclPrinter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {
   Out << "__asm (";
   D->getAsmString()->printPretty(Out, Context, 0, Policy, Indentation);
index 8d76680f6f928a267ecf08fa260fd4ceec29815c..446678ab6d590d0c652b7ab0dfd00012ec11097b 100644 (file)
@@ -400,11 +400,6 @@ void DeclContextPrinter::PrintDeclContext(const DeclContext* DC,
       Out << "<parameter> " << PVD->getNameAsString() << "\n";
       break;
     }
-    case Decl::OriginalParmVar: {
-      OriginalParmVarDecl* OPVD = cast<OriginalParmVarDecl>(*I);
-      Out << "<original parameter> " << OPVD->getNameAsString() << "\n";
-      break;
-    }
     case Decl::ObjCProperty: {
       ObjCPropertyDecl* OPD = cast<ObjCPropertyDecl>(*I);
       Out << "<objc property> " << OPD->getNameAsString() << "\n";
index d1cb461640b761033393787bc83f5855b0eba19d..5925dc6d7146687dcfa362b6dbe53a64b7c27a36 100644 (file)
@@ -52,7 +52,6 @@ namespace {
     void VisitVarDecl(VarDecl *VD);
     void VisitImplicitParamDecl(ImplicitParamDecl *PD);
     void VisitParmVarDecl(ParmVarDecl *PD);
-    void VisitOriginalParmVarDecl(OriginalParmVarDecl *PD);
     void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD);
     void VisitBlockDecl(BlockDecl *BD);
     std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC);
@@ -370,11 +369,6 @@ void PCHDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
   PD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
 }
 
-void PCHDeclReader::VisitOriginalParmVarDecl(OriginalParmVarDecl *PD) {
-  VisitParmVarDecl(PD);
-  PD->setOriginalType(Reader.GetType(Record[Idx++]));
-}
-
 void PCHDeclReader::VisitFileScopeAsmDecl(FileScopeAsmDecl *AD) {
   VisitDecl(AD);
   AD->setAsmString(cast<StringLiteral>(Reader.ReadDeclExpr()));
@@ -696,10 +690,6 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
     D = ParmVarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
                             VarDecl::None, 0);
     break;
-  case pch::DECL_ORIGINAL_PARM_VAR:
-    D = OriginalParmVarDecl::Create(*Context, 0, SourceLocation(), 0,
-                                    QualType(),0, QualType(), VarDecl::None, 0);
-    break;
   case pch::DECL_FILE_SCOPE_ASM:
     D = FileScopeAsmDecl::Create(*Context, 0, SourceLocation(), 0);
     break;
index fb48df332121803686a8e7544b6f445250be2a1d..4c733db1a0131a9f0edfe508241ac8358e60e2df 100644 (file)
@@ -589,7 +589,6 @@ void PCHWriter::WriteBlockInfoBlock() {
   RECORD(DECL_VAR);
   RECORD(DECL_IMPLICIT_PARAM);
   RECORD(DECL_PARM_VAR);
-  RECORD(DECL_ORIGINAL_PARM_VAR);
   RECORD(DECL_FILE_SCOPE_ASM);
   RECORD(DECL_BLOCK);
   RECORD(DECL_CONTEXT_LEXICAL);
index fbd9929e49d783cb2c8cf5861213cfa669e98441..be940a299c12f41037502702bf1a51718a0897af 100644 (file)
@@ -55,7 +55,6 @@ namespace {
     void VisitVarDecl(VarDecl *D);
     void VisitImplicitParamDecl(ImplicitParamDecl *D);
     void VisitParmVarDecl(ParmVarDecl *D);
-    void VisitOriginalParmVarDecl(OriginalParmVarDecl *D);
     void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
     void VisitBlockDecl(BlockDecl *D);
     void VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset,
@@ -390,13 +389,6 @@ void PCHDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {
   assert(D->getInit() == 0 && "PARM_VAR_DECL never has init");
 }
 
-void PCHDeclWriter::VisitOriginalParmVarDecl(OriginalParmVarDecl *D) {
-  VisitParmVarDecl(D);
-  Writer.AddTypeRef(D->getOriginalType(), Record);
-  Code = pch::DECL_ORIGINAL_PARM_VAR;
-  AbbrevToUse = 0;
-}
-
 void PCHDeclWriter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {
   VisitDecl(D);
   Writer.AddStmt(D->getAsmString());
index b83181becb93c567f3b3f27d057192b08104d3d2..98b71c7360c6512f42c59a754ef474622eb7aa77 100644 (file)
@@ -3668,16 +3668,9 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
 
   QualType T = adjustParameterType(parmDeclType);
 
-  ParmVarDecl *New;
-  if (T == parmDeclType) // parameter type did not need adjustment
-    New = ParmVarDecl::Create(Context, CurContext,
-                              D.getIdentifierLoc(), II,
-                              parmDeclType, DInfo, StorageClass,
-                              0);
-  else // keep track of both the adjusted and unadjusted types
-    New = OriginalParmVarDecl::Create(Context, CurContext,
-                                      D.getIdentifierLoc(), II, T, DInfo,
-                                      parmDeclType, StorageClass, 0);
+  ParmVarDecl *New
+    = ParmVarDecl::Create(Context, CurContext, D.getIdentifierLoc(), II,
+                          T, DInfo, StorageClass, 0);
 
   if (D.isInvalidType())
     New->setInvalidDecl();
index 22a517934c7ef897ecaa7e0cb638286cc3b4f4e6..d1b68a7977542f6841ca4491ca61fbc8795b380d 100644 (file)
@@ -1707,29 +1707,22 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
   llvm::SmallVector<ParmVarDecl*, 16> Params;
 
   for (unsigned i = 0, e = Sel.getNumArgs(); i != e; ++i) {
-    QualType ArgType, UnpromotedArgType;
+    QualType ArgType;
+    DeclaratorInfo *DI;
 
     if (ArgInfo[i].Type == 0) {
-      UnpromotedArgType = ArgType = Context.getObjCIdType();
+      ArgType = Context.getObjCIdType();
+      DI = 0;
     } else {
-      UnpromotedArgType = ArgType = GetTypeFromParser(ArgInfo[i].Type);
+      ArgType = GetTypeFromParser(ArgInfo[i].Type, &DI);
       // Perform the default array/function conversions (C99 6.7.5.3p[7,8]).
       ArgType = adjustParameterType(ArgType);
     }
 
-    ParmVarDecl* Param;
-    if (ArgType == UnpromotedArgType)
-      Param = ParmVarDecl::Create(Context, ObjCMethod, ArgInfo[i].NameLoc,
-                                  ArgInfo[i].Name, ArgType,
-                                  /*DInfo=*/0, //FIXME: Pass info here.
-                                  VarDecl::None, 0);
-    else
-      Param = OriginalParmVarDecl::Create(Context, ObjCMethod,
-                                          ArgInfo[i].NameLoc,
-                                          ArgInfo[i].Name, ArgType,
-                                          /*DInfo=*/0, //FIXME: Pass info here.
-                                          UnpromotedArgType,
-                                          VarDecl::None, 0);
+    ParmVarDecl* Param
+      = ParmVarDecl::Create(Context, ObjCMethod, ArgInfo[i].NameLoc,
+                            ArgInfo[i].Name, ArgType, DI,
+                            VarDecl::None, 0);
 
     if (ArgType->isObjCInterfaceType()) {
       Diag(ArgInfo[i].NameLoc,
index be4adbc93d15c2ec6e74059b44cb3fc949387e5f..00f148df6e6b2e0ff384de0ddff7c7182a1acc0c 100644 (file)
@@ -56,7 +56,6 @@ namespace {
     Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D);
     Decl *VisitCXXConversionDecl(CXXConversionDecl *D);
     ParmVarDecl *VisitParmVarDecl(ParmVarDecl *D);
-    Decl *VisitOriginalParmVarDecl(OriginalParmVarDecl *D);
     Decl *VisitClassTemplateDecl(ClassTemplateDecl *D);
     Decl *VisitClassTemplatePartialSpecializationDecl(
                                     ClassTemplatePartialSpecializationDecl *D);
@@ -776,24 +775,27 @@ Decl *TemplateDeclInstantiator::VisitCXXConversionDecl(CXXConversionDecl *D) {
 }
 
 ParmVarDecl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) {
-  QualType OrigT = SemaRef.SubstType(D->getOriginalType(), TemplateArgs,
-                                           D->getLocation(), D->getDeclName());
-  if (OrigT.isNull())
+  QualType T;
+  DeclaratorInfo *DI = D->getDeclaratorInfo();
+  if (DI) {
+    DI = SemaRef.SubstType(DI, TemplateArgs, D->getLocation(),
+                           D->getDeclName());
+    if (DI) T = DI->getType();
+  } else {
+    T = SemaRef.SubstType(D->getType(), TemplateArgs, D->getLocation(),
+                          D->getDeclName());
+    DI = 0;
+  }
+
+  if (T.isNull())
     return 0;
 
-  QualType T = SemaRef.adjustParameterType(OrigT);
+  T = SemaRef.adjustParameterType(T);
 
   // Allocate the parameter
-  ParmVarDecl *Param = 0;
-  if (T == OrigT)
-    Param = ParmVarDecl::Create(SemaRef.Context, Owner, D->getLocation(),
-                                D->getIdentifier(), T, D->getDeclaratorInfo(),
-                                D->getStorageClass(), 0);
-  else
-    Param = OriginalParmVarDecl::Create(SemaRef.Context, Owner,
-                                        D->getLocation(), D->getIdentifier(),
-                                        T, D->getDeclaratorInfo(), OrigT,
-                                        D->getStorageClass(), 0);
+  ParmVarDecl *Param
+    = ParmVarDecl::Create(SemaRef.Context, Owner, D->getLocation(),
+                          D->getIdentifier(), T, DI, D->getStorageClass(), 0);
 
   // Mark the default argument as being uninstantiated.
   if (D->hasUninstantiatedDefaultArg())
@@ -808,15 +810,6 @@ ParmVarDecl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) {
   return Param;
 }
 
-Decl *
-TemplateDeclInstantiator::VisitOriginalParmVarDecl(OriginalParmVarDecl *D) {
-  // Since parameter types can decay either before or after
-  // instantiation, we simply treat OriginalParmVarDecls as
-  // ParmVarDecls the same way, and create one or the other depending
-  // on what happens after template instantiation.
-  return VisitParmVarDecl(D);
-}
-
 Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
                                                     TemplateTypeParmDecl *D) {
   // TODO: don't always clone when decls are refcounted.