diff options
-rw-r--r-- | clang/Parse/AttributeList.cpp | 3 | ||||
-rw-r--r-- | clang/Sema/Sema.h | 1 | ||||
-rw-r--r-- | clang/Sema/SemaDecl.cpp | 14 | ||||
-rw-r--r-- | clang/include/clang/AST/Attr.h | 13 | ||||
-rw-r--r-- | clang/include/clang/Parse/AttributeList.h | 3 |
5 files changed, 31 insertions, 3 deletions
diff --git a/clang/Parse/AttributeList.cpp b/clang/Parse/AttributeList.cpp index 63d07b399b3..4ceece8f27a 100644 --- a/clang/Parse/AttributeList.cpp +++ b/clang/Parse/AttributeList.cpp @@ -49,7 +49,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) { Str += 2; Len -= 4; } - + switch (Len) { case 6: if (!memcmp(Str, "packed", 6)) return AT_packed; @@ -59,6 +59,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) { break; case 8: if (!memcmp(Str, "annotate", 8)) return AT_annotate; + if (!memcmp(Str, "noreturn", 8)) return AT_noreturn; break; case 11: if (!memcmp(Str, "vector_size", 11)) return AT_vector_size; diff --git a/clang/Sema/Sema.h b/clang/Sema/Sema.h index c2d249a9c6d..17ba542fc58 100644 --- a/clang/Sema/Sema.h +++ b/clang/Sema/Sema.h @@ -272,6 +272,7 @@ private: void HandleAlignedAttribute(Decl *d, AttributeList *rawAttr); void HandlePackedAttribute(Decl *d, AttributeList *rawAttr); void HandleAnnotateAttribute(Decl *d, AttributeList *rawAttr); + void HandleNoReturnAttribute(Decl *d, AttributeList *rawAttr); void WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method, bool &IncompleteImpl); diff --git a/clang/Sema/SemaDecl.cpp b/clang/Sema/SemaDecl.cpp index 1a0c3b20791..e841787a58d 100644 --- a/clang/Sema/SemaDecl.cpp +++ b/clang/Sema/SemaDecl.cpp @@ -1785,6 +1785,9 @@ void Sema::HandleDeclAttribute(Decl *New, AttributeList *Attr) { case AttributeList::AT_annotate: HandleAnnotateAttribute(New, Attr); break; + case AttributeList::AT_noreturn: + HandleNoReturnAttribute(New, Attr); + break; default: // FIXME: add other attributes... break; @@ -1927,6 +1930,17 @@ void Sema::HandlePackedAttribute(Decl *d, AttributeList *rawAttr) { rawAttr->getName()->getName()); } +void Sema::HandleNoReturnAttribute(Decl *d, AttributeList *rawAttr) { + // check the attribute arguments. + if (rawAttr->getNumArgs() != 0) { + Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments, + std::string("0")); + return; + } + + d->addAttr(new NoReturnAttr()); +} + void Sema::HandleAnnotateAttribute(Decl *d, AttributeList *rawAttr) { // check the attribute arguments. if (rawAttr->getNumArgs() != 1) { diff --git a/clang/include/clang/AST/Attr.h b/clang/include/clang/AST/Attr.h index fea0b404df3..25172884604 100644 --- a/clang/include/clang/AST/Attr.h +++ b/clang/include/clang/AST/Attr.h @@ -25,7 +25,8 @@ public: enum Kind { Aligned, Packed, - Annotate + Annotate, + NoReturn }; private: @@ -95,6 +96,16 @@ public: } static bool classof(const AnnotateAttr *A) { return true; } }; + +class NoReturnAttr : public Attr { +public: + NoReturnAttr() : Attr(NoReturn) {} + + // Implement isa/cast/dyncast/etc. + + static bool classof(const Attr *A) { return A->getKind() == NoReturn; } + static bool classof(const NoReturnAttr *A) { return true; } +}; } // end namespace clang diff --git a/clang/include/clang/Parse/AttributeList.h b/clang/include/clang/Parse/AttributeList.h index d627f10b868..a6a699ef8ba 100644 --- a/clang/include/clang/Parse/AttributeList.h +++ b/clang/include/clang/Parse/AttributeList.h @@ -48,7 +48,8 @@ public: AT_address_space, AT_aligned, AT_packed, - AT_annotate + AT_annotate, + AT_noreturn }; IdentifierInfo *getName() const { return AttrName; } |