[cfe-commits] [PATCH][MSExtensions] Add support for __forceinline.
Richard Smith
richard at metafoo.co.uk
Sun Jun 17 23:41:55 PDT 2012
On Sun, Jun 17, 2012 at 11:30 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> Hi,
>
> On Sun, Jun 17, 2012 at 8:47 PM, Michael Spencer <bigcheesegs at gmail.com> wrote:
>> This patch adds codegen support for __forceinline. __forceinline is a
>> combination of the inline keyword and __attribute__((always_inline)).
>
> Should handleForceInlineAttr call FunctionDecl::setImplicitlyInline?
> As implemented, the attribute seems to have the same semantic effect
> as just __attribute__((always_inline)).
Ah, I missed that you were calling SetFunctionSpecInline. That seems
reasonable (I'd expected the full semantic effect of the attribute to
be handled by handleForceInlineAttr). LGTM subject to a couple of
pedantic whitespacey things:
--- a/lib/Parse/ParseDecl.cpp
+++ b/lib/Parse/ParseDecl.cpp
@@ -2251,9 +2251,14 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
continue;
// Microsoft single token adornments.
- case tok::kw___forceinline:
- // FIXME: Add handling here!
- break;
+ case tok::kw___forceinline: {
+ isInvalid = DS.SetFunctionSpecInline(Loc, PrevSpec, DiagID);
+ IdentifierInfo *AttrName = Tok.getIdentifierInfo();
+ SourceLocation AttrNameLoc = ConsumeToken();
+ DS.getAttributes().addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0,
+ SourceLocation(), 0, 0, false);
+ }
+ continue;
Convention in Clang is to only indent once after "case ...: {" (just
like without the '{'), and to put the 'continue' inside the braces.
I'd prefer the SourceLocation() lined up with the '(' on the previous
line.
--- a/lib/Sema/SemaDeclAttr.cpp
+++ b/lib/Sema/SemaDeclAttr.cpp
@@ -3888,6 +3888,13 @@ static void handlePortabilityAttr(Sema &S, Decl
*D, const AttributeList &Attr) {
S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
}
+static void handleForceInlineAttr(Sema &S, Decl *D, const
AttributeList &Attr) {
+ if (S.LangOpts.MicrosoftExt) {
+ D->addAttr(::new (S.Context) ForceInlineAttr(Attr.getRange(), S.Context));
+ } else
+ S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
+}
No braces on the 'if' here.
-- Richard
More information about the cfe-commits
mailing list