]> granicus.if.org Git - clang/commitdiff
Serialize the NoReturn bit on FunctionTypes for precompiled headers
authorDouglas Gregor <dgregor@apple.com>
Tue, 22 Dec 2009 18:11:50 +0000 (18:11 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 22 Dec 2009 18:11:50 +0000 (18:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91911 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Frontend/PCHReader.cpp
lib/Frontend/PCHWriter.cpp
test/PCH/functions.c
test/PCH/functions.h

index 48ef2ac31abab8b295df3cda45db4b43795369e2..2eabdc93f43145b81fd38d3e0c21089017e6b8db 100644 (file)
@@ -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:
index 0e4516877de21b69b5e0e2c737879b9bc05247d5..124df63aade073f1f4503c44a9fc127ce355f100 100644 (file)
@@ -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) {
index fd0c3764b4707d060da7bdbad28384f80ca501ed..eb8579ab2ef46c3a43a7e3e36e04349a91ba992a 100644 (file)
@@ -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);
+}
+  
index bc28ad7321c7f0cbe2a65183ff6a483f88dd91e8..39724300816a04f94c46ece4ccf5cdbb1f6b630c 100644 (file)
@@ -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));