diff options
author | Chris Lattner <sabre@nondot.org> | 2008-04-10 02:22:51 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-04-10 02:22:51 +0000 |
commit | 58258246ec920a7c83f8c2fd8b46646f8336f68b (patch) | |
tree | 6e95a9d718f3a3c3477da857719d496224eca851 /clang/lib/AST | |
parent | a29d2536aa5c35d8920518fa3c3401aedc310909 (diff) | |
download | bcm5719-llvm-58258246ec920a7c83f8c2fd8b46646f8336f68b.tar.gz bcm5719-llvm-58258246ec920a7c83f8c2fd8b46646f8336f68b.zip |
Several improvements from Doug Gregor related to default
argument handling. I'll fix up the c89 (void) thing next.
llvm-svn: 49459
Diffstat (limited to 'clang/lib/AST')
-rw-r--r-- | clang/lib/AST/Decl.cpp | 13 | ||||
-rw-r--r-- | clang/lib/AST/Expr.cpp | 3 | ||||
-rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 4 |
3 files changed, 17 insertions, 3 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index afe4fcd37f1..2ef31e42e54 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -385,6 +385,19 @@ void FunctionDecl::setParams(ParmVarDecl **NewParamInfo, unsigned NumParams) { } } +/// getMinRequiredArguments - Returns the minimum number of arguments +/// needed to call this function. This may be fewer than the number of +/// function parameters, if some of the parameters have default +/// arguments. +unsigned FunctionDecl::getMinRequiredArguments() const { + unsigned NumRequiredArgs = getNumParams(); + while (NumRequiredArgs > 0 + && getParamDecl(NumRequiredArgs-1)->getDefaultArg()) + --NumRequiredArgs; + + return NumRequiredArgs; +} + //===----------------------------------------------------------------------===// // RecordDecl Implementation //===----------------------------------------------------------------------===// diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 0287aa08319..35bea75045f 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -1021,7 +1021,8 @@ bool Expr::isNullPointerConstant(ASTContext &Ctx) const { // Accept ((void*)0) as a null pointer constant, as many other // implementations do. return PE->getSubExpr()->isNullPointerConstant(Ctx); - } else if (const CXXDefaultArgExpr *DefaultArg = dyn_cast<CXXDefaultArgExpr>(this)) { + } else if (const CXXDefaultArgExpr *DefaultArg + = dyn_cast<CXXDefaultArgExpr>(this)) { // See through default argument expressions return DefaultArg->getExpr()->isNullPointerConstant(Ctx); } diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 03faf8b8b51..323fdd67a17 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -48,8 +48,8 @@ Stmt::child_iterator CXXThrowExpr::child_end() { // CXXDefaultArgExpr Stmt::child_iterator CXXDefaultArgExpr::child_begin() { - return reinterpret_cast<Stmt**>(Param->getDefaultArg()); + return child_iterator(); } Stmt::child_iterator CXXDefaultArgExpr::child_end() { - return reinterpret_cast<Stmt**>(Param->getDefaultArg())+1; + return child_iterator(); } |