diff options
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 5 | ||||
-rw-r--r-- | test/SemaCXX/overloaded-operator-decl.cpp | 10 |
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); + } +} |