Make all the 'redefinition' diagnostics more consistent, and make the 
"previously defined here" diagnostics all notes.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59920 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index c3b1302..8ffafad 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -326,7 +326,7 @@
   if (!Old) {
     Diag(New->getLocation(), diag::err_redefinition_different_kind)
       << New->getDeclName();
-    Diag(OldD->getLocation(), diag::err_previous_definition);
+    Diag(OldD->getLocation(), diag::note_previous_definition);
     return New;
   }
   
@@ -338,7 +338,7 @@
     Diag(New->getLocation(), diag::err_redefinition_different_typedef)
       << New->getUnderlyingType().getAsString()
       << Old->getUnderlyingType().getAsString();
-    Diag(Old->getLocation(), diag::err_previous_definition);
+    Diag(Old->getLocation(), diag::note_previous_definition);
     return Old;
   }
   
@@ -365,7 +365,7 @@
   }
 
   Diag(New->getLocation(), diag::err_redefinition) << New->getDeclName();
-  Diag(Old->getLocation(), diag::err_previous_definition);
+  Diag(Old->getLocation(), diag::note_previous_definition);
   return New;
 }
 
@@ -419,7 +419,7 @@
   if (!Old) {
     Diag(New->getLocation(), diag::err_redefinition_different_kind)
       << New->getDeclName();
-    Diag(OldD->getLocation(), diag::err_previous_definition);
+    Diag(OldD->getLocation(), diag::note_previous_definition);
     return New;
   }
 
@@ -427,11 +427,11 @@
   // implicit declaration, or a declaration.
   diag::kind PrevDiag;
   if (Old->isThisDeclarationADefinition())
-    PrevDiag = diag::err_previous_definition;
+    PrevDiag = diag::note_previous_definition;
   else if (Old->isImplicit())
-    PrevDiag = diag::err_previous_implicit_declaration;
+    PrevDiag = diag::note_previous_implicit_declaration;
   else 
-    PrevDiag = diag::err_previous_declaration;
+    PrevDiag = diag::note_previous_declaration;
   
   QualType OldQType = Context.getCanonicalType(Old->getType());
   QualType NewQType = Context.getCanonicalType(New->getType());
@@ -538,7 +538,7 @@
           VD->getStorageClass() != VarDecl::Extern &&
           VD->getStorageClass() != VarDecl::PrivateExtern) {
         Diag(VD->getLocation(), diag::err_redefinition) << VD->getDeclName();
-        Diag(OldDecl->getLocation(), diag::err_previous_definition);
+        Diag(OldDecl->getLocation(), diag::note_previous_definition);
       }
     }
   }
@@ -558,7 +558,7 @@
   if (!Old) {
     Diag(New->getLocation(), diag::err_redefinition_different_kind)
       << New->getDeclName();
-    Diag(OldD->getLocation(), diag::err_previous_definition);
+    Diag(OldD->getLocation(), diag::note_previous_definition);
     return New;
   }
 
@@ -569,7 +569,7 @@
   QualType NewCType = Context.getCanonicalType(New->getType());
   if (OldCType != NewCType && !Context.typesAreCompatible(OldCType, NewCType)) {
     Diag(New->getLocation(), diag::err_redefinition) << New->getDeclName();
-    Diag(Old->getLocation(), diag::err_previous_definition);
+    Diag(Old->getLocation(), diag::note_previous_definition);
     return New;
   }
   // C99 6.2.2p4: Check if we have a static decl followed by a non-static.
@@ -577,20 +577,20 @@
       (Old->getStorageClass() == VarDecl::None ||
        Old->getStorageClass() == VarDecl::Extern)) {
     Diag(New->getLocation(), diag::err_static_non_static) << New->getName();
-    Diag(Old->getLocation(), diag::err_previous_definition);
+    Diag(Old->getLocation(), diag::note_previous_definition);
     return New;
   }
   // C99 6.2.2p4: Check if we have a non-static decl followed by a static.
   if (New->getStorageClass() != VarDecl::Static &&
       Old->getStorageClass() == VarDecl::Static) {
     Diag(New->getLocation(), diag::err_non_static_static) << New->getName();
-    Diag(Old->getLocation(), diag::err_previous_definition);
+    Diag(Old->getLocation(), diag::note_previous_definition);
     return New;
   }
   // Variables with external linkage are analyzed in FinalizeDeclaratorGroup.
   if (New->getStorageClass() != VarDecl::Extern && !New->isFileVarDecl()) {
     Diag(New->getLocation(), diag::err_redefinition) << New->getDeclName();
-    Diag(Old->getLocation(), diag::err_previous_definition);
+    Diag(Old->getLocation(), diag::note_previous_definition);
   }
   return New;
 }
@@ -2076,7 +2076,7 @@
   const FunctionDecl *Definition;
   if (FD->getBody(Definition)) {
     Diag(FD->getLocation(), diag::err_redefinition) << FD->getDeclName();
-    Diag(Definition->getLocation(), diag::err_previous_definition);
+    Diag(Definition->getLocation(), diag::note_previous_definition);
   }
 
   PushDeclContext(FD);
@@ -2257,7 +2257,7 @@
         // struct or something similar.
         if (PrevTagDecl->getTagKind() != Kind) {
           Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
-          Diag(PrevDecl->getLocation(), diag::err_previous_use);
+          Diag(PrevDecl->getLocation(), diag::note_previous_use);
           // Recover by making this an anonymous redefinition.
           Name = 0;
           PrevDecl = 0;
@@ -2269,7 +2269,7 @@
           // Diagnose attempts to redefine a tag.
           if (PrevTagDecl->isDefinition()) {
             Diag(NameLoc, diag::err_redefinition) << Name;
-            Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+            Diag(PrevDecl->getLocation(), diag::note_previous_definition);
             // If this is a redefinition, recover by making this struct be
             // anonymous, which will make any later references get the previous
             // definition.
@@ -2291,7 +2291,7 @@
         // The tag name clashes with a namespace name, issue an error and
         // recover by making this tag be anonymous.
         Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
-        Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+        Diag(PrevDecl->getLocation(), diag::note_previous_definition);
         Name = 0;
       }
     }
@@ -2394,7 +2394,7 @@
         // struct or something similar.
         if (PrevTagDecl->getTagKind() != Kind) {
           Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
-          Diag(PrevDecl->getLocation(), diag::err_previous_use);
+          Diag(PrevDecl->getLocation(), diag::note_previous_use);
           // Recover by making this an anonymous redefinition.
           Name = 0;
           PrevDecl = 0;
@@ -2414,7 +2414,7 @@
             if (RecordDecl* DefRecord =
                 cast<RecordDecl>(PrevTagDecl)->getDefinition(Context)) {
               Diag(NameLoc, diag::err_redefinition) << Name;
-              Diag(DefRecord->getLocation(), diag::err_previous_definition);
+              Diag(DefRecord->getLocation(), diag::note_previous_definition);
               // If this is a redefinition, recover by making this struct be
               // anonymous, which will make any later references get the previous
               // definition.
@@ -2441,7 +2441,7 @@
         // The tag name clashes with a namespace name, issue an error and
         // recover by making this tag be anonymous.
         Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
-        Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+        Diag(PrevDecl->getLocation(), diag::note_previous_definition);
         Name = 0;
       }
     }
@@ -2717,7 +2717,7 @@
       // outer S.
       Diag(DefRecord->getLocation(), diag::err_nested_redefinition)
         << DefRecord->getKindName();
-      Diag(RecLoc, diag::err_previous_definition);
+      Diag(RecLoc, diag::note_previous_definition);
       Record->setInvalidDecl();
       return;
     }
@@ -2822,7 +2822,7 @@
             break;
           }
         }
-        Diag(PrevLoc, diag::err_previous_definition);
+        Diag(PrevLoc, diag::note_previous_definition);
         FD->setInvalidDecl();
         EnclosingDecl->setInvalidDecl();
         continue;
@@ -2880,7 +2880,7 @@
         Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
       else
         Diag(IdLoc, diag::err_redefinition) << Id;
-      Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+      Diag(PrevDecl->getLocation(), diag::note_previous_definition);
       delete Val;
       return 0;
     }
@@ -2943,7 +2943,7 @@
     //     E0 = sizeof(enum e0 { E1 })
     //   };
     Diag(Enum->getLocation(), diag::err_nested_redefinition) << Enum->getName();
-    Diag(EnumLoc, diag::err_previous_definition);
+    Diag(EnumLoc, diag::note_previous_definition);
     Enum->setInvalidDecl();
     return;
   }
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index a92ad95..d9f3bc6 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -197,7 +197,7 @@
       Diag(NewParam->getLocation(), 
            diag::err_param_default_argument_redefinition)
         << NewParam->getDefaultArg()->getSourceRange();
-      Diag(OldParam->getLocation(), diag::err_previous_definition);
+      Diag(OldParam->getLocation(), diag::note_previous_definition);
     } else if (OldParam->getDefaultArg()) {
       // Merge the old default argument into the new parameter
       NewParam->setDefaultArg(OldParam->getDefaultArg());
@@ -1112,7 +1112,7 @@
   if (!IsOverload(ConDecl, ClassDecl->getConstructors(), MatchedDecl)) {
     Diag(ConDecl->getLocation(), diag::err_constructor_redeclared)
       << SourceRange(ConDecl->getLocation());
-    Diag((*MatchedDecl)->getLocation(), diag::err_previous_declaration)
+    Diag((*MatchedDecl)->getLocation(), diag::note_previous_declaration)
       << SourceRange((*MatchedDecl)->getLocation());
     ConDecl->setInvalidDecl();
     return ConDecl;
@@ -1157,9 +1157,9 @@
   if (CXXDestructorDecl *PrevDestructor = ClassDecl->getDestructor()) {
     Diag(Destructor->getLocation(), diag::err_destructor_redeclared);
     Diag(PrevDestructor->getLocation(),
-         PrevDestructor->isThisDeclarationADefinition()?
-             diag::err_previous_definition
-           : diag::err_previous_declaration);
+         PrevDestructor->isThisDeclarationADefinition() ?
+             diag::note_previous_definition
+           : diag::note_previous_declaration);
     Destructor->setInvalidDecl();
     return Destructor;
   }
@@ -1188,8 +1188,8 @@
       Diag(Conversion->getLocation(), diag::err_conv_function_redeclared);
       Diag(OtherConv->getLocation(),
            OtherConv->isThisDeclarationADefinition()?
-              diag::err_previous_definition
-            : diag::err_previous_declaration);
+              diag::note_previous_definition
+            : diag::note_previous_declaration);
       Conversion->setInvalidDecl();
       return (DeclTy *)Conversion;      
     }
@@ -1272,7 +1272,7 @@
         // This is an invalid name redefinition.
         Diag(Namespc->getLocation(), diag::err_redefinition_different_kind)
           << Namespc->getDeclName();
-        Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+        Diag(PrevDecl->getLocation(), diag::note_previous_definition);
         Namespc->setInvalidDecl();
         // Continue on to push Namespc as current DeclContext and return it.
       }
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index c030a37..7a7b376 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -68,7 +68,7 @@
   Decl *PrevDecl = LookupDecl(ClassName, Decl::IDNS_Ordinary, TUScope);
   if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
     Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
-    Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+    Diag(PrevDecl->getLocation(), diag::note_previous_definition);
   }
   
   ObjCInterfaceDecl* IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
@@ -102,7 +102,7 @@
     PrevDecl = LookupDecl(SuperName, Decl::IDNS_Ordinary, TUScope);
     if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
       Diag(SuperLoc, diag::err_redefinition_different_kind) << SuperName;
-      Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+      Diag(PrevDecl->getLocation(), diag::note_previous_definition);
     }
     else {
       // Check that super class is previously defined
@@ -149,7 +149,7 @@
     }
     else {
       Diag(AliasLocation, diag::err_conflicting_aliasing_type) << AliasName;
-      Diag(ADecl->getLocation(), diag::err_previous_declaration);
+      Diag(ADecl->getLocation(), diag::note_previous_declaration);
     }
     return 0;
   }
@@ -458,7 +458,7 @@
   Decl *PrevDecl = LookupDecl(ClassName, Decl::IDNS_Ordinary, TUScope);
   if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
     Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
-    Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+    Diag(PrevDecl->getLocation(), diag::note_previous_definition);
   }
   else {
     // Is there an interface declaration of this class; if not, warn!
@@ -475,7 +475,7 @@
     if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
       Diag(SuperClassLoc, diag::err_redefinition_different_kind)
         << SuperClassname;
-      Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+      Diag(PrevDecl->getLocation(), diag::note_previous_definition);
     } else {
       SDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl); 
       if (!SDecl)
@@ -486,7 +486,7 @@
         // super class.
         Diag(SuperClassLoc, diag::err_conflicting_super_class)
           << SDecl->getDeclName();
-        Diag(SDecl->getLocation(), diag::err_previous_definition);
+        Diag(SDecl->getLocation(), diag::note_previous_definition);
       }
     }
   }
@@ -559,14 +559,14 @@
       Diag(ImplIvar->getLocation(), diag::err_conflicting_ivar_type)
         << ImplIvar->getIdentifier()
         << ImplIvar->getType() << ClsIvar->getType();
-      Diag(ClsIvar->getLocation(), diag::err_previous_definition);
+      Diag(ClsIvar->getLocation(), diag::note_previous_definition);
     }
     // TODO: Two mismatched (unequal width) Ivar bitfields should be diagnosed 
     // as error.
     else if (ImplIvar->getIdentifier() != ClsIvar->getIdentifier()) {
       Diag(ImplIvar->getLocation(), diag::err_conflicting_ivar_name)
         << ImplIvar->getIdentifier() << ClsIvar->getIdentifier();
-      Diag(ClsIvar->getLocation(), diag::err_previous_definition);
+      Diag(ClsIvar->getLocation(), diag::note_previous_definition);
       return;
     }
     --numIvars;
@@ -728,7 +728,7 @@
       TypedefDecl *TDD = dyn_cast<TypedefDecl>(PrevDecl);
       if (!TDD || !isa<ObjCInterfaceType>(TDD->getUnderlyingType())) {
         Diag(AtClassLoc, diag::err_redefinition_different_kind) << IdentList[i];
-        Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+        Diag(PrevDecl->getLocation(), diag::note_previous_definition);
       }
     }
     ObjCInterfaceDecl *IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl); 
@@ -907,9 +907,9 @@
                               : false;
       if (isInterfaceDeclKind && PrevMethod && !match 
           || checkIdenticalMethods && match) {
-          Diag(Method->getLocation(), diag::error_duplicate_method_decl)
+          Diag(Method->getLocation(), diag::err_duplicate_method_decl)
             << Method->getSelector().getName();
-          Diag(PrevMethod->getLocation(), diag::err_previous_declaration);
+          Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
       } else {
         insMethods.push_back(Method);
         InsMap[Method->getSelector()] = Method;
@@ -924,9 +924,9 @@
                               : false;
       if (isInterfaceDeclKind && PrevMethod && !match 
           || checkIdenticalMethods && match) {
-        Diag(Method->getLocation(), diag::error_duplicate_method_decl)
+        Diag(Method->getLocation(), diag::err_duplicate_method_decl)
           << Method->getSelector().getName();
-        Diag(PrevMethod->getLocation(), diag::err_previous_declaration);
+        Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
       } else {
         clsMethods.push_back(Method);
         ClsMap[Method->getSelector()] = Method;
@@ -1117,9 +1117,9 @@
   }
   if (PrevMethod) {
     // You can never have two method definitions with the same name.
-    Diag(ObjCMethod->getLocation(), diag::error_duplicate_method_decl)
+    Diag(ObjCMethod->getLocation(), diag::err_duplicate_method_decl)
       << ObjCMethod->getSelector().getName();
-    Diag(PrevMethod->getLocation(), diag::err_previous_declaration);
+    Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
   } 
   return ObjCMethod;
 }
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp
index 204d161..8cd223f 100644
--- a/lib/Sema/SemaStmt.cpp
+++ b/lib/Sema/SemaStmt.cpp
@@ -195,7 +195,7 @@
   // multiply defined, reject it now.
   if (LabelDecl->getSubStmt()) {
     Diag(IdentLoc, diag::err_redefinition_of_label) << LabelDecl->getID();
-    Diag(LabelDecl->getIdentLoc(), diag::err_previous_definition);
+    Diag(LabelDecl->getIdentLoc(), diag::note_previous_definition);
     return SubStmt;
   }
   
@@ -390,7 +390,7 @@
     if (DefaultStmt *DS = dyn_cast<DefaultStmt>(SC)) {
       if (TheDefaultStmt) {
         Diag(DS->getDefaultLoc(), diag::err_multiple_default_labels_defined);
-        Diag(TheDefaultStmt->getDefaultLoc(), diag::err_first_label);
+        Diag(TheDefaultStmt->getDefaultLoc(), diag::note_duplicate_case_prev);
             
         // FIXME: Remove the default statement from the switch block so that
         // we'll return a valid AST.  This requires recursing down the
@@ -436,7 +436,7 @@
         Diag(CaseVals[i+1].second->getLHS()->getLocStart(),
              diag::err_duplicate_case) << CaseVals[i].first.toString(10);
         Diag(CaseVals[i].second->getLHS()->getLocStart(), 
-             diag::err_duplicate_case_prev);
+             diag::note_duplicate_case_prev);
         // FIXME: We really want to remove the bogus case stmt from the substmt,
         // but we have no way to do this right now.
         CaseListIsErroneous = true;
@@ -520,7 +520,7 @@
         Diag(CR->getLHS()->getLocStart(), diag::err_duplicate_case)
           << OverlapVal.toString(10);
         Diag(OverlapStmt->getLHS()->getLocStart(), 
-             diag::err_duplicate_case_prev);
+             diag::note_duplicate_case_prev);
         // FIXME: We really want to remove the bogus case stmt from the substmt,
         // but we have no way to do this right now.
         CaseListIsErroneous = true;