[cfe-commits] r62147 - in /cfe/trunk: lib/Sema/SemaOverload.cpp test/SemaCXX/overloaded-operator.cpp test/SemaCXX/qualified-id-lookup.cpp

Douglas Gregor dgregor at apple.com
Mon Jan 12 21:10:01 PST 2009


Author: dgregor
Date: Mon Jan 12 23:10:00 2009
New Revision: 62147

URL: http://llvm.org/viewvc/llvm-project?rev=62147&view=rev
Log:
Fix argument-passing bugs in a call to object

Modified:
    cfe/trunk/lib/Sema/SemaOverload.cpp
    cfe/trunk/test/SemaCXX/overloaded-operator.cpp
    cfe/trunk/test/SemaCXX/qualified-id-lookup.cpp

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=62147&r1=62146&r2=62147&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Mon Jan 12 23:10:00 2009
@@ -3542,25 +3542,31 @@
                                     ResultTy, RParenLoc));
   delete [] MethodArgs;
 
+  // We may have default arguments. If so, we need to allocate more
+  // slots in the call for them.
+  if (NumArgs < NumArgsInProto)
+    TheCall->setNumArgs(NumArgsInProto + 1);
+  else if (NumArgs > NumArgsInProto)
+    NumArgsToCheck = NumArgsInProto;
+
   // Initialize the implicit object parameter.
-  if (!PerformObjectArgumentInitialization(Object, Method))
+  if (PerformObjectArgumentInitialization(Object, Method))
     return true;
   TheCall->setArg(0, Object);
 
   // Check the argument types.
   for (unsigned i = 0; i != NumArgsToCheck; i++) {
-    QualType ProtoArgType = Proto->getArgType(i);
-
     Expr *Arg;
-    if (i < NumArgs) 
+    if (i < NumArgs) {
       Arg = Args[i];
-    else 
+      
+      // Pass the argument.
+      QualType ProtoArgType = Proto->getArgType(i);
+      if (PerformCopyInitialization(Arg, ProtoArgType, "passing"))
+        return true;
+    } else {
       Arg = new CXXDefaultArgExpr(Method->getParamDecl(i));
-    QualType ArgType = Arg->getType();
-        
-    // Pass the argument.
-    if (PerformCopyInitialization(Arg, ProtoArgType, "passing"))
-      return true;
+    }
 
     TheCall->setArg(i + 1, Arg);
   }

Modified: cfe/trunk/test/SemaCXX/overloaded-operator.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/overloaded-operator.cpp?rev=62147&r1=62146&r2=62147&view=diff

==============================================================================
--- cfe/trunk/test/SemaCXX/overloaded-operator.cpp (original)
+++ cfe/trunk/test/SemaCXX/overloaded-operator.cpp Mon Jan 12 23:10:00 2009
@@ -124,17 +124,29 @@
   X& xr = (x, x);
 }
 
-
 struct Callable {
   int& operator()(int, double = 2.71828); // expected-note{{candidate function}}
   float& operator()(int, double, long, ...); // expected-note{{candidate function}}
+
+  double& operator()(float); // expected-note{{candidate function}}
+};
+
+struct Callable2 {
+  int& operator()(int i = 0);
+  double& operator()(...) const;
 };
 
-void test_callable(Callable c) {
+void test_callable(Callable c, Callable2 c2, const Callable2& c2c) {
   int &ir = c(1);
   float &fr = c(1, 3.14159, 17, 42);
 
   c(); // expected-error{{no matching function for call to object of type 'struct Callable'; candidates are:}}
+
+  double &dr = c(1.0f);
+
+  int &ir2 = c2();
+  int &ir3 = c2(1);
+  double &fr2 = c2c();
 }
 
 typedef float FLOAT;

Modified: cfe/trunk/test/SemaCXX/qualified-id-lookup.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/qualified-id-lookup.cpp?rev=62147&r1=62146&r2=62147&view=diff

==============================================================================
--- cfe/trunk/test/SemaCXX/qualified-id-lookup.cpp (original)
+++ cfe/trunk/test/SemaCXX/qualified-id-lookup.cpp Mon Jan 12 23:10:00 2009
@@ -33,6 +33,10 @@
 namespace N {
   struct f1 {
     static int member;
+
+    typedef int type;
+
+    void foo(type);
   };
 
   void test_f1() {
@@ -40,8 +44,13 @@
   }
 }
 
+void N::f1::foo(int) { }
+
 namespace N {
-  float& f1(int);
+  float& f1(int x) {
+    N::f1::type& i1 = x;
+    // FIXME: currently fails    f1::type& i2 = x;
+  }
 
   struct f2 {
     static int member;





More information about the cfe-commits mailing list