]> granicus.if.org Git - clang/commitdiff
Factor setting default arguments out into SetParamDefaultArgument.
authorAnders Carlsson <andersca@mac.com>
Tue, 25 Aug 2009 02:29:20 +0000 (02:29 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 25 Aug 2009 02:29:20 +0000 (02:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79970 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/Sema.h
lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaExpr.cpp

index b7b70bfc44ee6b389cb45e4dbcb74bc9fa11745e..31c2aafd6ca1a3e47d92e8d157b629f58b97a9c4 100644 (file)
@@ -542,6 +542,9 @@ public:
                                                  SourceLocation EqualLoc,
                                                  SourceLocation ArgLoc);
   virtual void ActOnParamDefaultArgumentError(DeclPtrTy param);
+  bool SetParamDefaultArgument(ParmVarDecl *Param, ExprArg DefaultArg,
+                               SourceLocation EqualLoc);
+
   
   // Contains the locations of the beginning of unparsed default
   // argument locations.
index a25a83a9954cf3da8554466407ef3412959428ee..5452963fad00cb4ae6841ed93fa551b8b3ef1bf1 100644 (file)
@@ -101,6 +101,34 @@ namespace {
   }
 }
 
+bool
+Sema::SetParamDefaultArgument(ParmVarDecl *Param, ExprArg DefaultArg,
+                              SourceLocation EqualLoc)
+{
+  QualType ParamType = Param->getType();
+
+  Expr *Arg = (Expr *)DefaultArg.get();
+  
+  // C++ [dcl.fct.default]p5
+  //   A default argument expression is implicitly converted (clause
+  //   4) to the parameter type. The default argument expression has
+  //   the same semantic constraints as the initializer expression in
+  //   a declaration of a variable of the parameter type, using the
+  //   copy-initialization semantics (8.5).
+  if (CheckInitializerTypes(Arg, ParamType, EqualLoc, 
+                            Param->getDeclName(), /*DirectInit=*/false))
+    return false;
+
+  Arg = MaybeCreateCXXExprWithTemporaries(Arg, /*DestroyTemps=*/false);
+  
+  // Okay: add the default argument to the parameter
+  Param->setDefaultArg(Arg);
+  
+  DefaultArg.release();
+  
+  return true;
+}
+
 /// ActOnParamDefaultArgument - Check whether the default argument
 /// provided for a function parameter is well-formed. If so, attach it
 /// to the parameter declaration.
@@ -131,30 +159,7 @@ Sema::ActOnParamDefaultArgument(DeclPtrTy param, SourceLocation EqualLoc,
     return;
   }
   
-  // C++ [dcl.fct.default]p5
-  //   A default argument expression is implicitly converted (clause
-  //   4) to the parameter type. The default argument expression has
-  //   the same semantic constraints as the initializer expression in
-  //   a declaration of a variable of the parameter type, using the
-  //   copy-initialization semantics (8.5).
-  Expr *DefaultArgPtr = DefaultArg.get();
-  bool DefaultInitFailed = CheckInitializerTypes(DefaultArgPtr, ParamType,
-                                                 EqualLoc,
-                                                 Param->getDeclName(),
-                                                 /*DirectInit=*/false);
-  if (DefaultArgPtr != DefaultArg.get()) {
-    DefaultArg.take();
-    DefaultArg.reset(DefaultArgPtr);
-  }
-  if (DefaultInitFailed) {
-    return;
-  }
-
-  DefaultArgPtr = MaybeCreateCXXExprWithTemporaries(DefaultArg.take(),
-                                                    /*DestroyTemps=*/false);
-  
-  // Okay: add the default argument to the parameter
-  Param->setDefaultArg(DefaultArgPtr);
+  SetParamDefaultArgument(Param, move(DefaultArg), EqualLoc);
 }
 
 /// ActOnParamUnparsedDefaultArgument - We've seen a default
index d9add06ee145188d44ff276342062baf2384e45d..04a15054430a6bfa2a60ae2e799fc8b648bcd239 100644 (file)
@@ -2492,14 +2492,15 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn,
       if (PerformCopyInitialization(Arg, ProtoArgType, "passing"))
         return true;
     } else {
-      if (FDecl->getParamDecl(i)->hasUnparsedDefaultArg()) {
+      ParmVarDecl *Param = FDecl->getParamDecl(i);
+      if (Param->hasUnparsedDefaultArg()) {
         Diag (Call->getSourceRange().getBegin(),
               diag::err_use_of_default_argument_to_function_declared_later) <<
         FDecl << cast<CXXRecordDecl>(FDecl->getDeclContext())->getDeclName();
-        Diag(UnparsedDefaultArgLocs[FDecl->getParamDecl(i)], 
+        Diag(UnparsedDefaultArgLocs[Param], 
               diag::note_default_argument_declared_here);
       } else {
-        Expr *DefaultExpr = FDecl->getParamDecl(i)->getDefaultArg();
+        Expr *DefaultExpr = Param->getDefaultArg();
         
         // If the default expression creates temporaries, we need to
         // push them to the current stack of expression temporaries so they'll
@@ -2514,7 +2515,7 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn,
       }
   
       // We already type-checked the argument, so we know it works.
-      Arg = CXXDefaultArgExpr::Create(Context, FDecl->getParamDecl(i));
+      Arg = CXXDefaultArgExpr::Create(Context, Param);
     }
     
     QualType ArgType = Arg->getType();