diff options
author | Nico Weber <nicolasweber@gmx.de> | 2012-11-09 06:06:14 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2012-11-09 06:06:14 +0000 |
commit | 1fefe417f0ffdff81e92e70fdf52afa5308d50dc (patch) | |
tree | 44193157a631470fe8304d55cbd29254bbe0fc72 | |
parent | 5ad5a9511ca1954162c84923996a7820ab712965 (diff) | |
download | bcm5719-llvm-1fefe417f0ffdff81e92e70fdf52afa5308d50dc.tar.gz bcm5719-llvm-1fefe417f0ffdff81e92e70fdf52afa5308d50dc.zip |
Don't crash on calling static member overloaded operator, PR14120
Patch from Brian Brooks!
llvm-svn: 167604
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 5 | ||||
-rw-r--r-- | clang/test/SemaCXX/overloaded-operator-decl.cpp | 10 |
2 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index bf2b89741ab..10e7ec42201 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/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/clang/test/SemaCXX/overloaded-operator-decl.cpp b/clang/test/SemaCXX/overloaded-operator-decl.cpp index 4519a2d1f9a..972e2deac29 100644 --- a/clang/test/SemaCXX/overloaded-operator-decl.cpp +++ b/clang/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); + } +} |