From: Rafael Espindola Date: Sun, 13 May 2012 03:25:18 +0000 (+0000) Subject: Refactor all the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=599f1b7100745efacb7ded6c176cb7feade114a5;p=clang Refactor all the if (Inherited) Attr->setInherited(true); To a central location. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156728 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 3e03befba9..a231b8625b 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -1562,18 +1562,20 @@ public: bool isIncompatibleTypedef(TypeDecl *Old, TypedefNameDecl *New); /// Attribute merging methods. Return true if a new attribute was added. - bool mergeAvailabilityAttr(Decl *D, SourceRange Range, bool Inherited, - IdentifierInfo *Platform, VersionTuple Introduced, - VersionTuple Deprecated, VersionTuple Obsoleted, - bool IsUnavailable, StringRef Message); - bool mergeVisibilityAttr(Decl *D, SourceRange Range, - bool Inherited, VisibilityAttr::VisibilityType Vis); - bool mergeDLLImportAttr(Decl *D, SourceRange Range, bool Inherited); - bool mergeDLLExportAttr(Decl *D, SourceRange Range, bool Inherited); - bool mergeFormatAttr(Decl *D, SourceRange Range, bool Inherited, - StringRef Format, int FormatIdx, int FirstArg); - bool mergeSectionAttr(Decl *D, SourceRange Range, bool Inherited, - StringRef Name); + AvailabilityAttr *mergeAvailabilityAttr(Decl *D, SourceRange Range, + IdentifierInfo *Platform, + VersionTuple Introduced, + VersionTuple Deprecated, + VersionTuple Obsoleted, + bool IsUnavailable, + StringRef Message); + VisibilityAttr *mergeVisibilityAttr(Decl *D, SourceRange Range, + VisibilityAttr::VisibilityType Vis); + DLLImportAttr *mergeDLLImportAttr(Decl *D, SourceRange Range); + DLLExportAttr *mergeDLLExportAttr(Decl *D, SourceRange Range); + FormatAttr *mergeFormatAttr(Decl *D, SourceRange Range, StringRef Format, + int FormatIdx, int FirstArg); + SectionAttr *mergeSectionAttr(Decl *D, SourceRange Range, StringRef Name); bool mergeDeclAttribute(Decl *New, InheritableAttr *Attr); void mergeDeclAttributes(Decl *New, Decl *Old, bool MergeDeprecation = true); diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 9828c180b1..3e660b5986 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1659,30 +1659,27 @@ DeclHasAttr(const Decl *D, const Attr *A) { } bool Sema::mergeDeclAttribute(Decl *D, InheritableAttr *Attr) { + InheritableAttr *NewAttr = NULL; if (AvailabilityAttr *AA = dyn_cast(Attr)) - return mergeAvailabilityAttr(D, AA->getRange(), true, AA->getPlatform(), - AA->getIntroduced(), AA->getDeprecated(), - AA->getObsoleted(), AA->getUnavailable(), - AA->getMessage()); - - if (VisibilityAttr *VA = dyn_cast(Attr)) - return mergeVisibilityAttr(D, VA->getRange(), true, VA->getVisibility()); - - if (DLLImportAttr *ImportA = dyn_cast(Attr)) - return mergeDLLImportAttr(D, ImportA->getRange(), true); - - if (DLLExportAttr *ExportA = dyn_cast(Attr)) - return mergeDLLExportAttr(D, ExportA->getRange(), true); - - if (FormatAttr *FA = dyn_cast(Attr)) - return mergeFormatAttr(D, FA->getRange(), true, FA->getType(), - FA->getFormatIdx(), FA->getFirstArg()); - - if (SectionAttr *SA = dyn_cast(Attr)) - return mergeSectionAttr(D, SA->getRange(), true, SA->getName()); - - if (!DeclHasAttr(D, Attr)) { - InheritableAttr *NewAttr = cast(Attr->clone(Context)); + NewAttr = mergeAvailabilityAttr(D, AA->getRange(), AA->getPlatform(), + AA->getIntroduced(), AA->getDeprecated(), + AA->getObsoleted(), AA->getUnavailable(), + AA->getMessage()); + else if (VisibilityAttr *VA = dyn_cast(Attr)) + NewAttr = mergeVisibilityAttr(D, VA->getRange(), VA->getVisibility()); + else if (DLLImportAttr *ImportA = dyn_cast(Attr)) + NewAttr = mergeDLLImportAttr(D, ImportA->getRange()); + else if (DLLExportAttr *ExportA = dyn_cast(Attr)) + NewAttr = mergeDLLExportAttr(D, ExportA->getRange()); + else if (FormatAttr *FA = dyn_cast(Attr)) + NewAttr = mergeFormatAttr(D, FA->getRange(), FA->getType(), + FA->getFormatIdx(), FA->getFirstArg()); + else if (SectionAttr *SA = dyn_cast(Attr)) + NewAttr = mergeSectionAttr(D, SA->getRange(), SA->getName()); + else if (!DeclHasAttr(D, Attr)) + NewAttr = cast(Attr->clone(Context)); + + if (NewAttr) { NewAttr->setInherited(true); D->addAttr(NewAttr); return true; diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 947fe7af91..dacb729506 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -1769,14 +1769,13 @@ static bool checkAvailabilityAttr(Sema &S, SourceRange Range, return false; } -bool Sema::mergeAvailabilityAttr(Decl *D, SourceRange Range, - bool Inherited, - IdentifierInfo *Platform, - VersionTuple Introduced, - VersionTuple Deprecated, - VersionTuple Obsoleted, - bool IsUnavailable, - StringRef Message) { +AvailabilityAttr *Sema::mergeAvailabilityAttr(Decl *D, SourceRange Range, + IdentifierInfo *Platform, + VersionTuple Introduced, + VersionTuple Deprecated, + VersionTuple Obsoleted, + bool IsUnavailable, + StringRef Message) { VersionTuple MergedIntroduced = Introduced; VersionTuple MergedDeprecated = Deprecated; VersionTuple MergedObsoleted = Obsoleted; @@ -1849,21 +1848,15 @@ bool Sema::mergeAvailabilityAttr(Decl *D, SourceRange Range, MergedIntroduced == Introduced && MergedDeprecated == Deprecated && MergedObsoleted == Obsoleted) - return false; + return NULL; if (!checkAvailabilityAttr(*this, Range, Platform, MergedIntroduced, MergedDeprecated, MergedObsoleted)) { - AvailabilityAttr *Attr = - ::new (Context) AvailabilityAttr(Range, Context, Platform, - Introduced, Deprecated, - Obsoleted, IsUnavailable, Message); - - if (Inherited) - Attr->setInherited(true); - D->addAttr(Attr); - return true; + return ::new (Context) AvailabilityAttr(Range, Context, Platform, + Introduced, Deprecated, + Obsoleted, IsUnavailable, Message); } - return false; + return NULL; } static void handleAvailabilityAttr(Sema &S, Decl *D, @@ -1885,36 +1878,32 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, if (SE) Str = SE->getString(); - S.mergeAvailabilityAttr(D, Attr.getRange(), - false, Platform, - Introduced.Version, - Deprecated.Version, - Obsoleted.Version, - IsUnavailable, - Str); + AvailabilityAttr *NewAttr = S.mergeAvailabilityAttr(D, Attr.getRange(), + Platform, + Introduced.Version, + Deprecated.Version, + Obsoleted.Version, + IsUnavailable, Str); + if (NewAttr) + D->addAttr(NewAttr); } -bool Sema::mergeVisibilityAttr(Decl *D, SourceRange Range, - bool Inherited, - VisibilityAttr::VisibilityType Vis) { +VisibilityAttr *Sema::mergeVisibilityAttr(Decl *D, SourceRange Range, + VisibilityAttr::VisibilityType Vis) { if (isa(D)) { Diag(Range.getBegin(), diag::warn_attribute_ignored) << "visibility"; - return false; + return NULL; } VisibilityAttr *ExistingAttr = D->getAttr(); if (ExistingAttr) { VisibilityAttr::VisibilityType ExistingVis = ExistingAttr->getVisibility(); if (ExistingVis == Vis) - return false; + return NULL; Diag(ExistingAttr->getLocation(), diag::err_mismatched_visibility); Diag(Range.getBegin(), diag::note_previous_attribute); D->dropAttr(); } - VisibilityAttr *Attr = ::new (Context) VisibilityAttr(Range, Context, Vis); - if (Inherited) - Attr->setInherited(true); - D->addAttr(Attr); - return true; + return ::new (Context) VisibilityAttr(Range, Context, Vis); } static void handleVisibilityAttr(Sema &S, Decl *D, const AttributeList &Attr) { @@ -1955,7 +1944,9 @@ static void handleVisibilityAttr(Sema &S, Decl *D, const AttributeList &Attr) { return; } - S.mergeVisibilityAttr(D, Attr.getRange(), false, type); + VisibilityAttr *NewAttr = S.mergeVisibilityAttr(D, Attr.getRange(), type); + if (NewAttr) + D->addAttr(NewAttr); } static void handleObjCMethodFamilyAttr(Sema &S, Decl *decl, @@ -2286,20 +2277,16 @@ static void handleReqdWorkGroupSize(Sema &S, Decl *D, WGSize[2])); } -bool Sema::mergeSectionAttr(Decl *D, SourceRange Range, bool Inherited, - StringRef Name) { +SectionAttr *Sema::mergeSectionAttr(Decl *D, SourceRange Range, + StringRef Name) { if (SectionAttr *ExistingAttr = D->getAttr()) { if (ExistingAttr->getName() == Name) - return false; + return NULL; Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section); Diag(Range.getBegin(), diag::note_previous_attribute); - return false; + return NULL; } - SectionAttr *Attr = ::new (Context) SectionAttr(Range, Context, Name); - if (Inherited) - Attr->setInherited(true); - D->addAttr(Attr); - return true; + return ::new (Context) SectionAttr(Range, Context, Name); } static void handleSectionAttr(Sema &S, Decl *D, const AttributeList &Attr) { @@ -2329,7 +2316,10 @@ static void handleSectionAttr(Sema &S, Decl *D, const AttributeList &Attr) { S.Diag(SE->getLocStart(), diag::err_attribute_section_local_variable); return; } - S.mergeSectionAttr(D, Attr.getRange(), false, SE->getString()); + SectionAttr *NewAttr = S.mergeSectionAttr(D, Attr.getRange(), + SE->getString()); + if (NewAttr) + D->addAttr(NewAttr); } @@ -2589,8 +2579,8 @@ static void handleInitPriorityAttr(Sema &S, Decl *D, prioritynum)); } -bool Sema::mergeFormatAttr(Decl *D, SourceRange Range, bool Inherited, - StringRef Format, int FormatIdx, int FirstArg) { +FormatAttr *Sema::mergeFormatAttr(Decl *D, SourceRange Range, StringRef Format, + int FormatIdx, int FirstArg) { // Check whether we already have an equivalent format attribute. for (specific_attr_iterator i = D->specific_attr_begin(), @@ -2604,14 +2594,12 @@ bool Sema::mergeFormatAttr(Decl *D, SourceRange Range, bool Inherited, // location. if (f->getLocation().isInvalid()) f->setRange(Range); - return false; + return NULL; } } - FormatAttr *Attr = ::new (Context) FormatAttr(Range, Context, Format, - FormatIdx, FirstArg); - D->addAttr(Attr); - return true; + return ::new (Context) FormatAttr(Range, Context, Format, FormatIdx, + FirstArg); } /// Handle __attribute__((format(type,idx,firstarg))) attributes based on @@ -2749,8 +2737,11 @@ static void handleFormatAttr(Sema &S, Decl *D, const AttributeList &Attr) { return; } - S.mergeFormatAttr(D, Attr.getRange(), false, Format, Idx.getZExtValue(), - FirstArg.getZExtValue()); + FormatAttr *NewAttr = S.mergeFormatAttr(D, Attr.getRange(), Format, + Idx.getZExtValue(), + FirstArg.getZExtValue()); + if (NewAttr) + D->addAttr(NewAttr); } static void handleTransparentUnionAttr(Sema &S, Decl *D, diff --git a/lib/Sema/TargetAttributesSema.cpp b/lib/Sema/TargetAttributesSema.cpp index 9ace9ad65a..893c3e4319 100644 --- a/lib/Sema/TargetAttributesSema.cpp +++ b/lib/Sema/TargetAttributesSema.cpp @@ -151,22 +151,16 @@ static void HandleX86ForceAlignArgPointerAttr(Decl *D, S.Context)); } -bool Sema::mergeDLLImportAttr(Decl *D, SourceRange Range, bool Inherited) { +DLLImportAttr *Sema::mergeDLLImportAttr(Decl *D, SourceRange Range) { if (D->hasAttr()) { Diag(Range.getBegin(), diag::warn_attribute_ignored) << "dllimport"; - return false; + return NULL; } if (D->hasAttr()) - return false; + return NULL; - DLLImportAttr *Attr = - ::new (Context) DLLImportAttr(Range, Context); - if (Inherited) - Attr->setInherited(true); - D->addAttr(Attr); - - return true; + return ::new (Context) DLLImportAttr(Range, Context); } static void HandleDLLImportAttr(Decl *D, const AttributeList &Attr, Sema &S) { @@ -195,25 +189,21 @@ static void HandleDLLImportAttr(Decl *D, const AttributeList &Attr, Sema &S) { return; } - S.mergeDLLImportAttr(D, Attr.getRange(), false); + DLLImportAttr *NewAttr = S.mergeDLLImportAttr(D, Attr.getRange()); + if (NewAttr) + D->addAttr(NewAttr); } -bool Sema::mergeDLLExportAttr(Decl *D, SourceRange Range, bool Inherited) { +DLLExportAttr *Sema::mergeDLLExportAttr(Decl *D, SourceRange Range) { if (DLLImportAttr *Import = D->getAttr()) { Diag(Import->getLocation(), diag::warn_attribute_ignored) << "dllimport"; D->dropAttr(); } if (D->hasAttr()) - return false; - - DLLExportAttr *Attr = - ::new (Context) DLLExportAttr(Range, Context); - if (Inherited) - Attr->setInherited(true); - D->addAttr(Attr); + return NULL; - return true; + return ::new (Context) DLLExportAttr(Range, Context); } static void HandleDLLExportAttr(Decl *D, const AttributeList &Attr, Sema &S) { @@ -239,7 +229,9 @@ static void HandleDLLExportAttr(Decl *D, const AttributeList &Attr, Sema &S) { return; } - S.mergeDLLExportAttr(D, Attr.getRange(), false); + DLLExportAttr *NewAttr = S.mergeDLLExportAttr(D, Attr.getRange()); + if (NewAttr) + D->addAttr(NewAttr); } namespace {