summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Frontend/PCHReader.cpp9
-rw-r--r--clang/lib/Frontend/PCHWriter.cpp1
-rw-r--r--clang/test/PCH/functions.c5
-rw-r--r--clang/test/PCH/functions.h2
4 files changed, 13 insertions, 4 deletions
diff --git a/clang/lib/Frontend/PCHReader.cpp b/clang/lib/Frontend/PCHReader.cpp
index 48ef2ac31ab..2eabdc93f43 100644
--- a/clang/lib/Frontend/PCHReader.cpp
+++ b/clang/lib/Frontend/PCHReader.cpp
@@ -1854,17 +1854,18 @@ QualType PCHReader::ReadTypeRecord(uint64_t Offset) {
}
case pch::TYPE_FUNCTION_NO_PROTO: {
- if (Record.size() != 1) {
+ if (Record.size() != 2) {
Error("incorrect encoding of no-proto function type");
return QualType();
}
QualType ResultType = GetType(Record[0]);
- return Context->getFunctionNoProtoType(ResultType);
+ return Context->getFunctionNoProtoType(ResultType, Record[1]);
}
case pch::TYPE_FUNCTION_PROTO: {
QualType ResultType = GetType(Record[0]);
- unsigned Idx = 1;
+ bool NoReturn = Record[1];
+ unsigned Idx = 2;
unsigned NumParams = Record[Idx++];
llvm::SmallVector<QualType, 16> ParamTypes;
for (unsigned I = 0; I != NumParams; ++I)
@@ -1880,7 +1881,7 @@ QualType PCHReader::ReadTypeRecord(uint64_t Offset) {
return Context->getFunctionType(ResultType, ParamTypes.data(), NumParams,
isVariadic, Quals, hasExceptionSpec,
hasAnyExceptionSpec, NumExceptions,
- Exceptions.data());
+ Exceptions.data(), NoReturn);
}
case pch::TYPE_UNRESOLVED_USING:
diff --git a/clang/lib/Frontend/PCHWriter.cpp b/clang/lib/Frontend/PCHWriter.cpp
index 0e4516877de..124df63aade 100644
--- a/clang/lib/Frontend/PCHWriter.cpp
+++ b/clang/lib/Frontend/PCHWriter.cpp
@@ -144,6 +144,7 @@ void PCHTypeWriter::VisitExtVectorType(const ExtVectorType *T) {
void PCHTypeWriter::VisitFunctionType(const FunctionType *T) {
Writer.AddTypeRef(T->getResultType(), Record);
+ Record.push_back(T->getNoReturnAttr());
}
void PCHTypeWriter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
diff --git a/clang/test/PCH/functions.c b/clang/test/PCH/functions.c
index fd0c3764b47..eb8579ab2ef 100644
--- a/clang/test/PCH/functions.c
+++ b/clang/test/PCH/functions.c
@@ -18,3 +18,8 @@ void test_g0(int *x, float * y) {
g0(y); // expected-warning{{incompatible pointer types passing 'float *', expected 'int *'}}
g0(x);
}
+
+void __attribute__((noreturn)) test_abort(int code) {
+ do_abort(code);
+}
+
diff --git a/clang/test/PCH/functions.h b/clang/test/PCH/functions.h
index bc28ad7321c..39724300816 100644
--- a/clang/test/PCH/functions.h
+++ b/clang/test/PCH/functions.h
@@ -4,3 +4,5 @@ int f0(int x, int y, ...);
float *f1(float x, float y);
void g0(int *);
+
+void do_abort(int) __attribute__((noreturn));
OpenPOWER on IntegriCloud