Commit d238b602 authored by Nick Desaulniers's avatar Nick Desaulniers
Browse files

[Clang][DiagnosticSemaKinds] combine diagnostic texts

The diagnostic texts for warning on attributes that don't appear on the
initial declaration is generally useful.  We'd like to re-use it in
D106030, but first let's combine two that already are very similar so we
may re-use it a third time in that commit.

Also, fix a few places that were using notePreviousDefinition to point
to declarations, to instead use diag::note_previous_declaration.

Reviewed By: aaron.ballman

Differential Revision: https://reviews.llvm.org/D107613
parent bb81e708
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -5571,8 +5571,8 @@ def warn_undefined_inline : Warning<"inline function %q0 is not defined">,
def err_undefined_inline_var : Error<"inline variable %q0 is not defined">;
def note_used_here : Note<"used here">;
def err_internal_linkage_redeclaration : Error<
  "'internal_linkage' attribute does not appear on the first declaration of %0">;
def err_attribute_missing_on_first_decl : Error<
  "%0 attribute does not appear on the first declaration">;
def warn_internal_linkage_local_storage : Warning<
  "'internal_linkage' attribute on a non-static local variable is ignored">,
  InGroup<IgnoredAttributes>;
@@ -9676,10 +9676,6 @@ def warn_falloff_noreturn_function : Warning<
  InGroup<InvalidNoreturn>;
def err_noreturn_block_has_return_expr : Error<
  "block declared 'noreturn' should not return">;
def err_noreturn_missing_on_first_decl : Error<
  "function declared '[[noreturn]]' after its first declaration">;
def note_noreturn_missing_first_decl : Note<
  "declaration missing '[[noreturn]]' attribute is here">;
def err_carries_dependency_missing_on_first_decl : Error<
  "%select{function|parameter}0 declared '[[carries_dependency]]' "
  "after its first declaration">;
+21 −21
Original line number Diff line number Diff line
@@ -3353,11 +3353,11 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD,
    }
  }
  if (New->hasAttr<InternalLinkageAttr>() &&
      !Old->hasAttr<InternalLinkageAttr>()) {
    Diag(New->getLocation(), diag::err_internal_linkage_redeclaration)
        << New->getDeclName();
    notePreviousDefinition(Old, New->getLocation());
  if (const auto *ILA = New->getAttr<InternalLinkageAttr>())
    if (!Old->hasAttr<InternalLinkageAttr>()) {
      Diag(New->getLocation(), diag::err_attribute_missing_on_first_decl)
          << ILA;
      Diag(Old->getLocation(), diag::note_previous_declaration);
      New->dropAttr<InternalLinkageAttr>();
    }
@@ -3678,11 +3678,11 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD,
    //   The first declaration of a function shall specify the noreturn
    //   attribute if any declaration of that function specifies the noreturn
    //   attribute.
    const CXX11NoReturnAttr *NRA = New->getAttr<CXX11NoReturnAttr>();
    if (NRA && !Old->hasAttr<CXX11NoReturnAttr>()) {
      Diag(NRA->getLocation(), diag::err_noreturn_missing_on_first_decl);
      Diag(Old->getFirstDecl()->getLocation(),
           diag::note_noreturn_missing_first_decl);
    if (const auto *NRA = New->getAttr<CXX11NoReturnAttr>())
      if (!Old->hasAttr<CXX11NoReturnAttr>()) {
        Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
            << NRA;
        Diag(Old->getLocation(), diag::note_previous_declaration);
      }
    // C++11 [dcl.attr.depend]p2:
@@ -4161,16 +4161,16 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {
      Old->getStorageClass() == SC_None &&
      !Old->hasAttr<WeakImportAttr>()) {
    Diag(New->getLocation(), diag::warn_weak_import) << New->getDeclName();
    notePreviousDefinition(Old, New->getLocation());
    Diag(Old->getLocation(), diag::note_previous_declaration);
    // Remove weak_import attribute on new declaration.
    New->dropAttr<WeakImportAttr>();
  }
  if (New->hasAttr<InternalLinkageAttr>() &&
      !Old->hasAttr<InternalLinkageAttr>()) {
    Diag(New->getLocation(), diag::err_internal_linkage_redeclaration)
        << New->getDeclName();
    notePreviousDefinition(Old, New->getLocation());
  if (const auto *ILA = New->getAttr<InternalLinkageAttr>())
    if (!Old->hasAttr<InternalLinkageAttr>()) {
      Diag(New->getLocation(), diag::err_attribute_missing_on_first_decl)
          << ILA;
      Diag(Old->getLocation(), diag::note_previous_declaration);
      New->dropAttr<InternalLinkageAttr>();
    }
+2 −2
Original line number Diff line number Diff line
@@ -24,8 +24,8 @@ int d2 [[noreturn]]; // expected-error {{'noreturn' attribute only applies to fu

[[noreturn]] int e() { b2(); } // ok

int f(); // expected-note {{declaration missing '[[noreturn]]' attribute is here}}
[[noreturn]] int f(); // expected-error {{function declared '[[noreturn]]' after its first declaration}}
int f(); // expected-note {{previous declaration is here}}
[[noreturn]] int f(); // expected-error {{'noreturn' attribute does not appear on the first declaration}}
int f();

[[noreturn]] int g();
+1 −1
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ static int f() __attribute__((weak)); // expected-error {{weak declaration canno
static int x __attribute__((weak)); // expected-error {{weak declaration cannot have internal linkage}}

// rdar://9538608
int C; // expected-note {{previous definition is here}}
int C; // expected-note {{previous declaration is here}}
extern int C __attribute__((weak_import)); // expected-warning {{an already-declared variable is made a weak_import declaration}}

static int pr14946_x;
+2 −2
Original line number Diff line number Diff line
@@ -6,9 +6,9 @@ int var2 __attribute__((internal_linkage,common)); // expected-error{{'common' a
int var3 __attribute__((common,internal_linkage)); // expected-error{{'internal_linkage' and 'common' attributes are not compatible}} \
                                                   // expected-note{{conflicting attribute is here}}

int var4 __attribute__((common)); // expected-note{{previous definition is here}} expected-note{{conflicting attribute is here}}
int var4 __attribute__((common)); // expected-note{{previous declaration is here}} expected-note{{conflicting attribute is here}}
int var4 __attribute__((internal_linkage)); // expected-error{{'internal_linkage' and 'common' attributes are not compatible}} \
                                            // expected-error{{'internal_linkage' attribute does not appear on the first declaration of 'var4'}}
                                            // expected-error{{'internal_linkage' attribute does not appear on the first declaration}}

int var5 __attribute__((internal_linkage)); // expected-note{{conflicting attribute is here}}
int var5 __attribute__((common)); // expected-error{{'common' and 'internal_linkage' attributes are not compatible}}
Loading