зеркало из https://github.com/microsoft/clang-1.git
Add noreturn for exit.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77237 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
aecae62926
Коммит
0feecbb316
|
@ -54,6 +54,7 @@
|
||||||
// of the function. These must be kept in sync with the predicates in the
|
// of the function. These must be kept in sync with the predicates in the
|
||||||
// Builtin::Context class. Currently we have:
|
// Builtin::Context class. Currently we have:
|
||||||
// n -> nothrow
|
// n -> nothrow
|
||||||
|
// r -> noreturn
|
||||||
// c -> const
|
// c -> const
|
||||||
// F -> this is a libc/libm function with a '__builtin_' prefix added.
|
// F -> this is a libc/libm function with a '__builtin_' prefix added.
|
||||||
// f -> this is a libc/libm function without the '__builtin_' prefix. It can
|
// f -> this is a libc/libm function without the '__builtin_' prefix. It can
|
||||||
|
@ -335,6 +336,9 @@ BUILTIN(__sync_fetch_and_umax, "UiUi*Ui", "n")
|
||||||
// C99 library functions
|
// C99 library functions
|
||||||
// C99 stdlib.h
|
// C99 stdlib.h
|
||||||
LIBBUILTIN(calloc, "v*zz", "f", "stdlib.h")
|
LIBBUILTIN(calloc, "v*zz", "f", "stdlib.h")
|
||||||
|
LIBBUILTIN(exit, "vi", "fr", "stdlib.h")
|
||||||
|
LIBBUILTIN(_Exit, "vi", "fr", "stdlib.h")
|
||||||
|
LIBBUILTIN(_exit, "vi", "fr", "unistd.h")
|
||||||
LIBBUILTIN(malloc, "v*z", "f", "stdlib.h")
|
LIBBUILTIN(malloc, "v*z", "f", "stdlib.h")
|
||||||
LIBBUILTIN(realloc, "v*v*z", "f", "stdlib.h")
|
LIBBUILTIN(realloc, "v*v*z", "f", "stdlib.h")
|
||||||
// C99 string.h
|
// C99 string.h
|
||||||
|
|
|
@ -90,6 +90,11 @@ public:
|
||||||
return strchr(GetRecord(ID).Attributes, 'n') != 0;
|
return strchr(GetRecord(ID).Attributes, 'n') != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// isNoReturn - Return true if we know this builtin never returns.
|
||||||
|
bool isNoReturn(unsigned ID) const {
|
||||||
|
return strchr(GetRecord(ID).Attributes, 'r') != 0;
|
||||||
|
}
|
||||||
|
|
||||||
/// isLibFunction - Return true if this is a builtin for a libc/libm function,
|
/// isLibFunction - Return true if this is a builtin for a libc/libm function,
|
||||||
/// with a "__builtin_" prefix (e.g. __builtin_abs).
|
/// with a "__builtin_" prefix (e.g. __builtin_abs).
|
||||||
bool isLibFunction(unsigned ID) const {
|
bool isLibFunction(unsigned ID) const {
|
||||||
|
|
|
@ -3676,6 +3676,9 @@ void Sema::AddKnownFunctionAttributes(FunctionDecl *FD) {
|
||||||
if (!FD->getAttr<ConstAttr>())
|
if (!FD->getAttr<ConstAttr>())
|
||||||
FD->addAttr(::new (Context) ConstAttr());
|
FD->addAttr(::new (Context) ConstAttr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Context.BuiltinInfo.isNoReturn(BuiltinID))
|
||||||
|
FD->addAttr(::new (Context) NoReturnAttr());
|
||||||
}
|
}
|
||||||
|
|
||||||
IdentifierInfo *Name = FD->getIdentifier();
|
IdentifierInfo *Name = FD->getIdentifier();
|
||||||
|
|
|
@ -191,3 +191,8 @@ int test27() {
|
||||||
// PR4624
|
// PR4624
|
||||||
void test28() __attribute__((noreturn));
|
void test28() __attribute__((noreturn));
|
||||||
void test28(x) { while (1) { } }
|
void test28(x) { while (1) { } }
|
||||||
|
|
||||||
|
void exit(int);
|
||||||
|
int test29() {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче