From: David Majnemer Date: Wed, 21 Jan 2015 01:30:40 +0000 (+0000) Subject: Revert "Sema: err_after_alias is unreachable, remove it" X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9ec272cccdab5fb0d614161a20a45baeb67679aa;p=clang Revert "Sema: err_after_alias is unreachable, remove it" This reverts commit r226626. err_after_alias is, in fact, reachable. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226633 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 5509b03ab2..3e41564a39 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -3902,6 +3902,8 @@ def warn_missing_variable_declarations : Warning< def err_static_data_member_reinitialization : Error<"static data member %0 already has an initializer">; def err_redefinition : Error<"redefinition of %0">; +def err_alias_after_tentative : + Error<"alias definition of %0 after tentative definition">; def err_alias_is_definition : Error<"definition %0 cannot also be an alias">; def err_definition_of_implicitly_declared_member : Error< diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 8af7e5a1d0..cd6ff6ce58 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2223,7 +2223,11 @@ static void checkNewAttributesAfterDef(Sema &S, Decl *New, const Decl *Old) { S.CheckForFunctionRedefinition(FD, cast(Def)); else { VarDecl *VD = cast(New); - S.Diag(VD->getLocation(), diag::err_redefinition) << VD->getDeclName(); + unsigned Diag = cast(Def)->isThisDeclarationADefinition() == + VarDecl::TentativeDefinition + ? diag::err_alias_after_tentative + : diag::err_redefinition; + S.Diag(VD->getLocation(), Diag) << VD->getDeclName(); S.Diag(Def->getLocation(), diag::note_previous_definition); VD->setInvalidDecl(); } diff --git a/test/Sema/alias-redefinition.c b/test/Sema/alias-redefinition.c index ae8c28fe76..91f4b2714c 100644 --- a/test/Sema/alias-redefinition.c +++ b/test/Sema/alias-redefinition.c @@ -29,6 +29,5 @@ static int var2 __attribute((alias("v2"))) = 2; // expected-error {{definition ' extern int var3 __attribute__((alias("C"))); // expected-note{{previous definition is here}} int var3 = 3; // expected-error{{redefinition of 'var3'}} -int v4; -int var4; -int var4 __attribute((alias("v4"))); // expected-error {{definition 'var4' cannot also be an alias}} +int var4; // expected-note{{previous definition is here}} +extern int var4 __attribute__((alias("v4"))); // expected-error{{alias definition of 'var4' after tentative definition}}