]> granicus.if.org Git - clang/commitdiff
Improve error for assignment to incomplete class.
authorEli Friedman <eli.friedman@gmail.com>
Wed, 28 Aug 2013 20:35:35 +0000 (20:35 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 28 Aug 2013 20:35:35 +0000 (20:35 +0000)
PR7681.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189510 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaOverload.cpp
test/SemaCXX/overloaded-operator.cpp

index db8aa0ab79c8c29702baeb7e10dd212151b607a7..de437589ccc6b21155e30883718a2cb3236fac39 100644 (file)
@@ -2752,6 +2752,7 @@ def err_ovl_ambiguous_oper_unary : Error<
 def err_ovl_ambiguous_oper_binary : Error<
   "use of overloaded operator '%0' is ambiguous (with operand types %1 and %2)">;
 def err_ovl_no_viable_oper : Error<"no viable overloaded '%0'">;
+def note_assign_lhs_incomplete : Note<"type %0 is incomplete">;
 def err_ovl_deleted_oper : Error<
   "overload resolution selected %select{unavailable|deleted}0 operator '%1'%2">;
 def err_ovl_deleted_special_oper : Error<
index 06d1f0b0e2d4fd1693bb60a0f0fa348410967d2a..a8b0bd27b983a3c1c61264479dbfe5c6801804a2 100644 (file)
@@ -10714,6 +10714,11 @@ Sema::CreateOverloadedBinOp(SourceLocation OpLoc,
         Diag(OpLoc,  diag::err_ovl_no_viable_oper)
              << BinaryOperator::getOpcodeStr(Opc)
              << Args[0]->getSourceRange() << Args[1]->getSourceRange();
+        if (Args[0]->getType()->isIncompleteType()) {
+          Diag(OpLoc, diag::note_assign_lhs_incomplete)
+            << Args[0]->getType()
+            << Args[0]->getSourceRange() << Args[1]->getSourceRange();
+        }
       } else {
         // This is an erroneous use of an operator which can be overloaded by
         // a non-member function. Check for non-member operators which were
index 2228e51ff7f9b4dce7e93ab41fe025eddbd3fd9c..99105cb5b60bcf60c169f5af44ed206af4feeddc 100644 (file)
@@ -445,3 +445,10 @@ namespace test10 {
 struct InvalidOperatorEquals {
   InvalidOperatorEquals operator=() = delete; // expected-error {{overloaded 'operator=' must be a binary operator}}
 };
+
+namespace PR7681 {
+  template <typename PT1, typename PT2> class PointerUnion;
+  void foo(PointerUnion<int*, float*> &Result) {
+    Result = 1; // expected-error {{no viable overloaded '='}} // expected-note {{type 'PointerUnion<int *, float *>' is incomplete}}
+  }
+}