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.
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];
}
-/// 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;
}
-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.
}
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.
//
// 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