summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-01-13 05:10:00 +0000
committerDouglas Gregor <dgregor@apple.com>2009-01-13 05:10:00 +0000
commit02a0acd0bc3e26c551fc0ee33659cfa2378eeb7c (patch)
treecd63d101d6ff372db0b17dd48f5c50fb3bf9fb69
parentfab583b7c6010b85353fce571ce2700c8e914c4a (diff)
downloadbcm5719-llvm-02a0acd0bc3e26c551fc0ee33659cfa2378eeb7c.tar.gz
bcm5719-llvm-02a0acd0bc3e26c551fc0ee33659cfa2378eeb7c.zip
Fix argument-passing bugs in a call to object
llvm-svn: 62147
-rw-r--r--clang/lib/Sema/SemaOverload.cpp26
-rw-r--r--clang/test/SemaCXX/overloaded-operator.cpp16
-rw-r--r--clang/test/SemaCXX/qualified-id-lookup.cpp11
3 files changed, 40 insertions, 13 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index be1a27e5c68..c66db173ebd 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -3542,25 +3542,31 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Object,
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);
}
diff --git a/clang/test/SemaCXX/overloaded-operator.cpp b/clang/test/SemaCXX/overloaded-operator.cpp
index d8be6bca491..e558faa8803 100644
--- a/clang/test/SemaCXX/overloaded-operator.cpp
+++ b/clang/test/SemaCXX/overloaded-operator.cpp
@@ -124,17 +124,29 @@ void test_comma(X x, Y y) {
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;
diff --git a/clang/test/SemaCXX/qualified-id-lookup.cpp b/clang/test/SemaCXX/qualified-id-lookup.cpp
index c0d1ca370d1..cbc197ddc79 100644
--- a/clang/test/SemaCXX/qualified-id-lookup.cpp
+++ b/clang/test/SemaCXX/qualified-id-lookup.cpp
@@ -33,6 +33,10 @@ namespace N {
namespace N {
struct f1 {
static int member;
+
+ typedef int type;
+
+ void foo(type);
};
void test_f1() {
@@ -40,8 +44,13 @@ namespace N {
}
}
+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;
OpenPOWER on IntegriCloud