Index: lib/Sema/SemaLookup.cpp =================================================================== --- lib/Sema/SemaLookup.cpp +++ lib/Sema/SemaLookup.cpp @@ -1031,7 +1031,8 @@ FindLocalExternScope(LookupResult &R) : R(R), OldFindLocalExtern(R.getIdentifierNamespace() & Decl::IDNS_LocalExtern) { - R.setFindLocalExtern(R.getIdentifierNamespace() & Decl::IDNS_Ordinary); + R.setFindLocalExtern(R.getIdentifierNamespace() & + (Decl::IDNS_Ordinary | Decl::IDNS_NonMemberOperator)); } void restore() { R.setFindLocalExtern(OldFindLocalExtern); Index: test/SemaCXX/overloaded-operator.cpp =================================================================== --- test/SemaCXX/overloaded-operator.cpp +++ test/SemaCXX/overloaded-operator.cpp @@ -531,3 +531,22 @@ b3 / 0; // expected-note {{in instantiation of}} expected-error {{invalid operands to}} } } + + +namespace PR27027 { + template void operator+(T, T) = delete; // expected-note 4 {{candidate}} + template void operator+(T) = delete; // expected-note 4 {{candidate}} + + struct A {} a_global; + void f() { + A a; + +a; // expected-error {{overload resolution selected deleted operator '+'}} + a + a; // expected-error {{overload resolution selected deleted operator '+'}} + bool operator+(A); + extern bool operator+(A, A); + +a; // OK + a + a; + } + bool test_global_1 = +a_global; // expected-error {{overload resolution selected deleted operator '+'}} + bool test_global_2 = a_global + a_global; // expected-error {{overload resolution selected deleted operator '+'}} +}