From: Nico Weber Date: Fri, 9 Nov 2012 06:06:14 +0000 (+0000) Subject: Don't crash on calling static member overloaded operator, PR14120 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e0ff690900ecb28e7d840d7f765f25437eb67c66;p=clang 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 --- 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(Best->Function); + + // An error diagnostic has already been printed when parsing the declaration. + if (Method->isStatic()) + return ExprError(); + const FunctionProtoType *Proto = Method->getType()->getAs(); 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); + } +}