diff options
author | Anders Carlsson <andersca@mac.com> | 2009-02-19 19:16:48 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-02-19 19:16:48 +0000 |
commit | 5bab788d40026ad6e932a3cd9b86bc13f8a27661 (patch) | |
tree | a3655832324e987c2ace522ebbaec7dfce18332a /lib | |
parent | 0527f0d0f3837841ae47963881cb6f899a6b8f52 (diff) |
Add sema support for the noinline attribute.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65055 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Sema/SemaDeclAttr.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 614e53a751..2ceea33d07 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -395,6 +395,12 @@ static void HandleAlwaysInlineAttr(Decl *d, const AttributeList &Attr, S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0; return; } + + if (!isFunctionOrMethod(d)) { + S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) + << "always_inline" << 0 /*function*/; + return; + } d->addAttr(new AlwaysInlineAttr()); } @@ -1343,7 +1349,7 @@ static void HandleNodebugAttr(Decl *d, const AttributeList &Attr, Sema &S) { return; } - if (!isa<FunctionDecl>(d)) { + if (!isFunctionOrMethod(d)) { S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) << "nodebug" << 0 /*function*/; return; @@ -1352,6 +1358,22 @@ static void HandleNodebugAttr(Decl *d, const AttributeList &Attr, Sema &S) { d->addAttr(new NodebugAttr()); } +static void HandleNoinlineAttr(Decl *d, const AttributeList &Attr, Sema &S) { + // check the attribute arguments. + if (Attr.getNumArgs() != 0) { + S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0; + return; + } + + if (!isFunctionOrMethod(d)) { + S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) + << "noinline" << 0 /*function*/; + return; + } + + d->addAttr(new NoinlineAttr()); +} + //===----------------------------------------------------------------------===// // Top Level Sema Entry Points //===----------------------------------------------------------------------===// @@ -1410,6 +1432,7 @@ static void ProcessDeclAttribute(Decl *D, const AttributeList &Attr, Sema &S) { case AttributeList::AT_pure: HandlePureAttr (D, Attr, S); break; case AttributeList::AT_cleanup: HandleCleanupAttr (D, Attr, S); break; case AttributeList::AT_nodebug: HandleNodebugAttr (D, Attr, S); break; + case AttributeList::AT_noinline: HandleNoinlineAttr (D, Attr, S); break; case AttributeList::IgnoredAttribute: // Just ignore break; |