From: Mike Stump Date: Mon, 27 Jul 2009 21:33:40 +0000 (+0000) Subject: Add builtin knowledge about longjmp being noreturn. Add printing for X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fd350b5b4ae557d6b74899b945e77508f33149a9;p=clang Add builtin knowledge about longjmp being noreturn. Add printing for the noreturn attribute. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77253 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/DeclPrinter.cpp b/lib/AST/DeclPrinter.cpp index 589cdeca8a..e5bf59f8f9 100644 --- a/lib/AST/DeclPrinter.cpp +++ b/lib/AST/DeclPrinter.cpp @@ -335,6 +335,8 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) { } Proto += ")"; + if (D->hasAttr()) + Proto += " __attribute((noreturn))"; if (CXXConstructorDecl *CDecl = dyn_cast(D)) { if (CDecl->getNumBaseOrMemberInitializers() > 0) { Proto += " : "; diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index bf2d3ccec2..d168a907a0 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -3705,7 +3705,9 @@ void Sema::AddKnownFunctionAttributes(FunctionDecl *FD) { if (!FD->getAttr()) FD->addAttr(::new (Context) FormatAttr("printf", 2, Name->isStr("vasprintf") ? 0 : 3)); - } + } else if (Name->isStr("longjmp") && + !FD->hasAttr()) + FD->addAttr(::new (Context) NoReturnAttr()); } TypedefDecl *Sema::ParseTypedefDecl(Scope *S, Declarator &D, QualType T) { diff --git a/test/Sema/return.c b/test/Sema/return.c index 99568b07cd..f439ad7994 100644 --- a/test/Sema/return.c +++ b/test/Sema/return.c @@ -196,3 +196,9 @@ void exit(int); int test29() { exit(1); } + +#include +jmp_buf test30_j; +int test30() { + longjmp(test30_j, 1); +}