From cd997e02b25fbda462817c35d34157bb006a119c Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 2 May 2012 20:36:57 +0000 Subject: Walk the decls looking for the last one that has an attribute. We do have to walk them, otherwise we cannot produce an error for both struct HIDDEN test4; // canonical struct test4; struct DEFAULT test4; and struct test5; // canonical struct HIDDEN test5; struct DEFAULT test5; llvm-svn: 156016 --- clang/lib/Sema/SemaDeclAttr.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'clang/lib/Sema/SemaDeclAttr.cpp') diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 13bf0aa4875..6b3f4f97340 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -1757,13 +1757,16 @@ static void handleVisibilityAttr(Sema &S, Decl *D, const AttributeList &Attr) { return; } - Decl *PrevDecl; - if (isa(D)) - PrevDecl = D->getMostRecentDecl()->getPreviousDecl(); - else - PrevDecl = D->getCanonicalDecl(); + // Find the last Decl that has an attribute. + VisibilityAttr *PrevAttr; + assert(D->redecls_begin() == D); + for (Decl::redecl_iterator I = D->redecls_begin(), E = D->redecls_end(); + I != E; ++I) { + PrevAttr = I->getAttr() ; + if (PrevAttr) + break; + } - VisibilityAttr *PrevAttr = PrevDecl ? PrevDecl->getAttr() : 0; if (PrevAttr) { VisibilityAttr::VisibilityType PrevVisibility = PrevAttr->getVisibility(); if (PrevVisibility != type) { -- cgit v1.2.3