EricWF updated this revision to Diff 106168.
EricWF edited the summary of this revision.

https://reviews.llvm.org/D35297

Files:
  lib/Sema/SemaLookup.cpp
  test/SemaCXX/overloaded-operator.cpp


Index: test/SemaCXX/overloaded-operator.cpp
===================================================================
--- test/SemaCXX/overloaded-operator.cpp
+++ test/SemaCXX/overloaded-operator.cpp
@@ -531,3 +531,20 @@
     b3 / 0; // expected-note {{in instantiation of}} expected-error {{invalid 
operands to}}
   }
 }
+
+
+namespace PR27027 {
+  template <class T> void operator+(T, T) = delete; // expected-note 2 
{{candidate}}
+  template <class T> void operator+(T) = delete; // expected-note 2 
{{candidate}}
+
+  struct A {};
+  void f() {
+    A a;
+    +a; // expected-error {{overload resolution selected deleted operator '+'}}
+    a + a; // expected-error {{overload resolution selected deleted operator 
'+'}}
+    void operator+(A);
+    void operator+(A, A);
+    +a; // OK
+    a + a;
+  }
+}
Index: lib/Sema/SemaLookup.cpp
===================================================================
--- lib/Sema/SemaLookup.cpp
+++ lib/Sema/SemaLookup.cpp
@@ -226,7 +226,7 @@
     // Operator lookup is its own crazy thing;  it is not the same
     // as (e.g.) looking up an operator name for redeclaration.
     assert(!Redeclaration && "cannot do redeclaration operator lookup");
-    IDNS = Decl::IDNS_NonMemberOperator;
+    IDNS = Decl::IDNS_NonMemberOperator | Decl::IDNS_LocalExtern;
     break;
 
   case Sema::LookupTagName:


Index: test/SemaCXX/overloaded-operator.cpp
===================================================================
--- test/SemaCXX/overloaded-operator.cpp
+++ test/SemaCXX/overloaded-operator.cpp
@@ -531,3 +531,20 @@
     b3 / 0; // expected-note {{in instantiation of}} expected-error {{invalid operands to}}
   }
 }
+
+
+namespace PR27027 {
+  template <class T> void operator+(T, T) = delete; // expected-note 2 {{candidate}}
+  template <class T> void operator+(T) = delete; // expected-note 2 {{candidate}}
+
+  struct A {};
+  void f() {
+    A a;
+    +a; // expected-error {{overload resolution selected deleted operator '+'}}
+    a + a; // expected-error {{overload resolution selected deleted operator '+'}}
+    void operator+(A);
+    void operator+(A, A);
+    +a; // OK
+    a + a;
+  }
+}
Index: lib/Sema/SemaLookup.cpp
===================================================================
--- lib/Sema/SemaLookup.cpp
+++ lib/Sema/SemaLookup.cpp
@@ -226,7 +226,7 @@
     // Operator lookup is its own crazy thing;  it is not the same
     // as (e.g.) looking up an operator name for redeclaration.
     assert(!Redeclaration && "cannot do redeclaration operator lookup");
-    IDNS = Decl::IDNS_NonMemberOperator;
+    IDNS = Decl::IDNS_NonMemberOperator | Decl::IDNS_LocalExtern;
     break;
 
   case Sema::LookupTagName:
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to