diff options
-rw-r--r-- | include/clang/AST/Decl.h | 7 | ||||
-rw-r--r-- | lib/AST/Decl.cpp | 18 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 29 |
3 files changed, 23 insertions, 31 deletions
diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 901da704ce..0e396c27b2 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -643,9 +643,6 @@ public: unsigned getBuiltinID(ASTContext &Context) const; - /// getNumParmVarDeclsFromType - Ignoring the actual argument list, this - /// returns the number of ParmVarDecls that the FunctionType of this function - /// expects. unsigned getNumParmVarDeclsFromType() const; // Iterator access to formal parameters. @@ -659,7 +656,11 @@ public: param_const_iterator param_begin() const { return ParamInfo; } param_const_iterator param_end() const { return ParamInfo+param_size(); } + /// getNumParams - Return the number of parameters this function must have + /// based on its functiontype. This is the length of the PararmInfo array + /// after it has been created. unsigned getNumParams() const; + const ParmVarDecl *getParamDecl(unsigned i) const { assert(i < getNumParams() && "Illegal param #"); return ParamInfo[i]; diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index a715531c74..57a44e54d8 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -431,10 +431,10 @@ unsigned FunctionDecl::getBuiltinID(ASTContext &Context) const { } -/// getNumParmVarDeclsFromType - Ignoring the actual argument list, this -/// returns the number of ParmVarDecls that the FunctionType of this function -/// expects. -unsigned FunctionDecl::getNumParmVarDeclsFromType() const { +/// getNumParams - Return the number of parameters this function must have +/// based on its functiontype. This is the length of the PararmInfo array +/// after it has been created. +unsigned FunctionDecl::getNumParams() const { const FunctionType *FT = getType()->getAsFunctionType(); if (isa<FunctionNoProtoType>(FT)) return 0; @@ -442,18 +442,10 @@ unsigned FunctionDecl::getNumParmVarDeclsFromType() const { } -unsigned FunctionDecl::getNumParams() const { - // Can happen if a FunctionDecl is declared using typeof(some_other_func) bar; - if (!ParamInfo) - return 0; - - return getNumParmVarDeclsFromType(); -} - void FunctionDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo, unsigned NumParams) { assert(ParamInfo == 0 && "Already has param info!"); - assert(NumParams == getNumParmVarDeclsFromType() && + assert(NumParams == getNumParams() && "Parameter count mismatch!"); // Zero params -> null pointer. diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index d34b20780e..8dd4356046 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2153,8 +2153,8 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC, } NewFD->setParams(Context, &Params[0], Params.size()); - } else if (isa<TypedefType>(R)) { - // When we're declaring a function with a typedef, as in the + } else if (const FunctionProtoType *FT = R->getAsFunctionProtoType()) { + // When we're declaring a function with a typedef, typeof, etc as in the // following example, we'll need to synthesize (unnamed) // parameters for use in the declaration. // @@ -2162,20 +2162,19 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC, // typedef void fn(int); // fn f; // @endcode - if (const FunctionProtoType *FT = R->getAsFunctionProtoType()) { - // Synthesize a parameter for each argument type. - llvm::SmallVector<ParmVarDecl*, 16> Params; - for (FunctionProtoType::arg_type_iterator ArgType = FT->arg_type_begin(); - ArgType != FT->arg_type_end(); ++ArgType) { - ParmVarDecl *Param = ParmVarDecl::Create(Context, DC, - SourceLocation(), 0, - *ArgType, VarDecl::None, 0); - Param->setImplicit(); - Params.push_back(Param); - } - - NewFD->setParams(Context, &Params[0], Params.size()); + + // Synthesize a parameter for each argument type. + llvm::SmallVector<ParmVarDecl*, 16> Params; + for (FunctionProtoType::arg_type_iterator AI = FT->arg_type_begin(), + AE = FT->arg_type_end(); AI != AE; ++AI) { + ParmVarDecl *Param = ParmVarDecl::Create(Context, DC, + SourceLocation(), 0, + *AI, VarDecl::None, 0); + Param->setImplicit(); + Params.push_back(Param); } + + NewFD->setParams(Context, &Params[0], Params.size()); } // If name lookup finds a previous declaration that is not in the |