[PATCH] Downgrade 'optnone' attribute conflicts to warning

Robinson, Paul Paul_Robinson at playstation.sony.com
Tue Jan 13 10:36:47 PST 2015


r225813, thanks!

> -----Original Message-----
> From: Aaron Ballman [mailto:aaron.ballman at gmail.com]
> Sent: Tuesday, January 13, 2015 7:26 AM
> To: Robinson, Paul
> Cc: reviews+D6933+public+e7e8eb108c4fe81a at reviews.llvm.org; llvm cfe
> Subject: Re: [PATCH] Downgrade 'optnone' attribute conflicts to warning
> 
> On Tue, Jan 13, 2015 at 10:21 AM, Robinson, Paul
> <Paul_Robinson at playstation.sony.com> wrote:
> >
> >
> >> -----Original Message-----
> >> From: cfe-commits-bounces at cs.uiuc.edu [mailto:cfe-commits-
> >> bounces at cs.uiuc.edu] On Behalf Of Aaron Ballman
> >> Sent: Tuesday, January 13, 2015 6:55 AM
> >> To: reviews+D6933+public+e7e8eb108c4fe81a at reviews.llvm.org
> >> Cc: llvm cfe
> >> Subject: Re: [PATCH] Downgrade 'optnone' attribute conflicts to warning
> >>
> >> On Mon, Jan 12, 2015 at 3:31 PM, Paul Robinson
> >> <Paul_Robinson at playstation.sony.com> wrote:
> >> > Hi aaron.ballman,
> >> >
> >> > When attribute 'optnone' appears on the same declaration with a
> >> > conflicting attribute, warn about the conflict and pick a "winning"
> >> > attribute to preserve, instead of emitting an error.  This matches
> the
> >> > behavior when the conflicting attributes are on different
> declarations.
> >> >
> >> > Along the way I discovered that conflicts involving __forceinline
> were
> >> > reported as 'always_inline' (alternate spellings for the same
> >> > attribute) so I hacked in a way to provide the spelling used in the
> >> > declaration. There must be a better way, though...
> >>
> >> LGTM, with one possible suggestion below.
> >>
> >> >
> >> > http://reviews.llvm.org/D6933
> >> >
> >> > Files:
> >> >   include/clang/Sema/Sema.h
> >> >   lib/Sema/SemaDecl.cpp
> >> >   lib/Sema/SemaDeclAttr.cpp
> >> >   test/SemaCXX/attr-optnone.cpp
> >> >
> >> > EMAIL PREFERENCES
> >> >   http://reviews.llvm.org/settings/panel/emailpreferences/
> >>
> >> > Index: include/clang/Sema/Sema.h
> >> > ===================================================================
> >> > --- include/clang/Sema/Sema.h
> >> > +++ include/clang/Sema/Sema.h
> >> > @@ -2009,6 +2009,7 @@
> >> >    SectionAttr *mergeSectionAttr(Decl *D, SourceRange Range,
> StringRef
> >> Name,
> >> >                                  unsigned AttrSpellingListIndex);
> >> >    AlwaysInlineAttr *mergeAlwaysInlineAttr(Decl *D, SourceRange
> Range,
> >> > +                                          StringRef Name,
> >> >                                            unsigned
> >> AttrSpellingListIndex);
> >> >    MinSizeAttr *mergeMinSizeAttr(Decl *D, SourceRange Range,
> >> >                                  unsigned AttrSpellingListIndex);
> >> > Index: lib/Sema/SemaDecl.cpp
> >> > ===================================================================
> >> > --- lib/Sema/SemaDecl.cpp
> >> > +++ lib/Sema/SemaDecl.cpp
> >> > @@ -2155,7 +2155,8 @@
> >> >                                         AttrSpellingListIndex,
> >> >                                         IA->getSemanticSpelling());
> >> >    else if (const auto *AA = dyn_cast<AlwaysInlineAttr>(Attr))
> >> > -    NewAttr = S.mergeAlwaysInlineAttr(D, AA->getRange(),
> >> AttrSpellingListIndex);
> >> > +    NewAttr = S.mergeAlwaysInlineAttr(D, AA->getRange(), AA-
> >> >getSpelling(),
> >> > +                                      AttrSpellingListIndex);
> >> >    else if (const auto *MA = dyn_cast<MinSizeAttr>(Attr))
> >> >      NewAttr = S.mergeMinSizeAttr(D, MA->getRange(),
> >> AttrSpellingListIndex);
> >> >    else if (const auto *OA = dyn_cast<OptimizeNoneAttr>(Attr))
> >> > Index: lib/Sema/SemaDeclAttr.cpp
> >> > ===================================================================
> >> > --- lib/Sema/SemaDeclAttr.cpp
> >> > +++ lib/Sema/SemaDeclAttr.cpp
> >> > @@ -3141,9 +3141,14 @@
> >> >  }
> >> >
> >> >  AlwaysInlineAttr *Sema::mergeAlwaysInlineAttr(Decl *D, SourceRange
> >> Range,
> >> > +                                              StringRef Name,
> >> >                                                unsigned
> >> AttrSpellingListIndex) {
> >> >    if (OptimizeNoneAttr *Optnone = D->getAttr<OptimizeNoneAttr>()) {
> >> > -    Diag(Range.getBegin(), diag::warn_attribute_ignored) <<
> >> "'always_inline'";
> >> > +    SmallString<40> QuotedName;
> >> > +    QuotedName = "'";
> >> > +    QuotedName += Name;
> >> > +    QuotedName += "'";
> >> > +    Diag(Range.getBegin(), diag::warn_attribute_ignored) <<
> QuotedName;
> >> >      Diag(Optnone->getLocation(), diag::note_conflicting_attribute);
> >> >      return nullptr;
> >> >    }
> >>
> >> You could pass in the name as an IdentifierInfo * and ditch the manual
> >> quoting. I realize that Attr::getSpelling() returns a StringRef, but
> >> getting the IdentifierInfo should be low-cost and slightly less ugly.
> >
> > Yes, with an IdentifierInfo then I just << it into Diag and the quoting
> > happens for me, definitely cleaner.
> >
> > That works when calling mergeAlwaysInlineAttr from
> handleAlwaysInlineAttr,
> > but it's also called from mergeDeclAttribute in SemaDecl.cpp.  In that
> case
> > I have an InheritableAttr, not an AttributeList, and I didn't see a way
> to
> > get an IdentifierInfo out of it.  That's why I went with passing the
> string.
> >
> > Is there a way to get IdentifierInfo out of InheritableAttr?
> 
> Context.Idents.get(theAttr->getSpelling())
> 
> ~Aaron




More information about the cfe-commits mailing list