aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2012-11-09 06:06:14 +0000
committerNico Weber <nicolasweber@gmx.de>2012-11-09 06:06:14 +0000
commite0ff690900ecb28e7d840d7f765f25437eb67c66 (patch)
treea05817fee6e2357cc045ce77c085ab6610c15e80
parent377e5c108bd299930ca8e8cb6ebce1d22dfe35f9 (diff)
Don't crash on calling static member overloaded operator, PR14120
Patch from Brian Brooks! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167604 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaOverload.cpp5
-rw-r--r--test/SemaCXX/overloaded-operator-decl.cpp10
2 files changed, 15 insertions, 0 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index bf2b89741a..10e7ec4220 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -10997,6 +10997,11 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj,
// that calls this method, using Object for the implicit object
// parameter and passing along the remaining arguments.
CXXMethodDecl *Method = cast<CXXMethodDecl>(Best->Function);
+
+ // An error diagnostic has already been printed when parsing the declaration.
+ if (Method->isStatic())
+ return ExprError();
+
const FunctionProtoType *Proto =
Method->getType()->getAs<FunctionProtoType>();
diff --git a/test/SemaCXX/overloaded-operator-decl.cpp b/test/SemaCXX/overloaded-operator-decl.cpp
index 4519a2d1f9..972e2deac2 100644
--- a/test/SemaCXX/overloaded-operator-decl.cpp
+++ b/test/SemaCXX/overloaded-operator-decl.cpp
@@ -48,3 +48,13 @@ struct PR10839 {
operator int; // expected-error{{'operator int' cannot be the name of a variable or data member}}
int operator+; // expected-error{{'operator+' cannot be the name of a variable or data member}}
};
+
+namespace PR14120 {
+ struct A {
+ static void operator()(int& i) { ++i; } // expected-error{{overloaded 'operator()' cannot be a static member function}}
+ };
+ void f() {
+ int i = 0;
+ A()(i);
+ }
+}