diff options
Diffstat (limited to 'lib/Sema')
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 43 | ||||
-rw-r--r-- | lib/Sema/SemaDeclAttr.cpp | 103 | ||||
-rw-r--r-- | lib/Sema/TargetAttributesSema.cpp | 34 |
3 files changed, 80 insertions, 100 deletions
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<AvailabilityAttr>(Attr)) - return mergeAvailabilityAttr(D, AA->getRange(), true, AA->getPlatform(), - AA->getIntroduced(), AA->getDeprecated(), - AA->getObsoleted(), AA->getUnavailable(), - AA->getMessage()); - - if (VisibilityAttr *VA = dyn_cast<VisibilityAttr>(Attr)) - return mergeVisibilityAttr(D, VA->getRange(), true, VA->getVisibility()); - - if (DLLImportAttr *ImportA = dyn_cast<DLLImportAttr>(Attr)) - return mergeDLLImportAttr(D, ImportA->getRange(), true); - - if (DLLExportAttr *ExportA = dyn_cast<DLLExportAttr>(Attr)) - return mergeDLLExportAttr(D, ExportA->getRange(), true); - - if (FormatAttr *FA = dyn_cast<FormatAttr>(Attr)) - return mergeFormatAttr(D, FA->getRange(), true, FA->getType(), - FA->getFormatIdx(), FA->getFirstArg()); - - if (SectionAttr *SA = dyn_cast<SectionAttr>(Attr)) - return mergeSectionAttr(D, SA->getRange(), true, SA->getName()); - - if (!DeclHasAttr(D, Attr)) { - InheritableAttr *NewAttr = cast<InheritableAttr>(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<VisibilityAttr>(Attr)) + NewAttr = mergeVisibilityAttr(D, VA->getRange(), VA->getVisibility()); + else if (DLLImportAttr *ImportA = dyn_cast<DLLImportAttr>(Attr)) + NewAttr = mergeDLLImportAttr(D, ImportA->getRange()); + else if (DLLExportAttr *ExportA = dyn_cast<DLLExportAttr>(Attr)) + NewAttr = mergeDLLExportAttr(D, ExportA->getRange()); + else if (FormatAttr *FA = dyn_cast<FormatAttr>(Attr)) + NewAttr = mergeFormatAttr(D, FA->getRange(), FA->getType(), + FA->getFormatIdx(), FA->getFirstArg()); + else if (SectionAttr *SA = dyn_cast<SectionAttr>(Attr)) + NewAttr = mergeSectionAttr(D, SA->getRange(), SA->getName()); + else if (!DeclHasAttr(D, Attr)) + NewAttr = cast<InheritableAttr>(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<TypedefNameDecl>(D)) { Diag(Range.getBegin(), diag::warn_attribute_ignored) << "visibility"; - return false; + return NULL; } VisibilityAttr *ExistingAttr = D->getAttr<VisibilityAttr>(); 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>(); } - 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<SectionAttr>()) { 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<FormatAttr> i = D->specific_attr_begin<FormatAttr>(), @@ -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<DLLExportAttr>()) { Diag(Range.getBegin(), diag::warn_attribute_ignored) << "dllimport"; - return false; + return NULL; } if (D->hasAttr<DLLImportAttr>()) - 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<DLLImportAttr>()) { Diag(Import->getLocation(), diag::warn_attribute_ignored) << "dllimport"; D->dropAttr<DLLImportAttr>(); } if (D->hasAttr<DLLExportAttr>()) - 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 { |