SemaStmtAttr.cpp revision 234973
1234973Sdim//===--- SemaStmtAttr.cpp - Statement Attribute Handling ------------------===//
2234973Sdim//
3234973Sdim//                     The LLVM Compiler Infrastructure
4234973Sdim//
5234973Sdim// This file is distributed under the University of Illinois Open Source
6234973Sdim// License. See LICENSE.TXT for details.
7234973Sdim//
8234973Sdim//===----------------------------------------------------------------------===//
9234973Sdim//
10234973Sdim//  This file implements stmt-related attribute processing.
11234973Sdim//
12234973Sdim//===----------------------------------------------------------------------===//
13234973Sdim
14234973Sdim#include "clang/Sema/SemaInternal.h"
15234973Sdim#include "TargetAttributesSema.h"
16234973Sdim#include "clang/AST/ASTContext.h"
17234973Sdim#include "clang/Basic/SourceManager.h"
18234973Sdim#include "clang/Sema/DelayedDiagnostic.h"
19234973Sdim#include "clang/Sema/Lookup.h"
20234973Sdim#include "llvm/ADT/StringExtras.h"
21234973Sdimusing namespace clang;
22234973Sdimusing namespace sema;
23234973Sdim
24234973Sdim
25234973Sdimstatic Attr *ProcessStmtAttribute(Sema &S, Stmt *St, const AttributeList &A) {
26234973Sdim  switch (A.getKind()) {
27234973Sdim  default:
28234973Sdim    // if we're here, then we parsed an attribute, but didn't recognize it as a
29234973Sdim    // statement attribute => it is declaration attribute
30234973Sdim    S.Diag(A.getRange().getBegin(), diag::warn_attribute_invalid_on_stmt) <<
31234973Sdim      A.getName()->getName();
32234973Sdim    return 0;
33234973Sdim  }
34234973Sdim}
35234973Sdim
36234973SdimStmtResult Sema::ProcessStmtAttributes(Stmt *S, AttributeList *AttrList,
37234973Sdim                                       SourceRange Range) {
38234973Sdim  AttrVec Attrs;
39234973Sdim  for (const AttributeList* l = AttrList; l; l = l->getNext()) {
40234973Sdim    if (Attr *a = ProcessStmtAttribute(*this, S, *l))
41234973Sdim      Attrs.push_back(a);
42234973Sdim  }
43234973Sdim
44234973Sdim  if (Attrs.empty())
45234973Sdim    return S;
46234973Sdim
47234973Sdim  return ActOnAttributedStmt(Range.getBegin(), Attrs, S);
48234973Sdim}
49