]> granicus.if.org Git - clang/commitdiff
Fix AST serialization of reference-to-reference types. This previously caused
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 12 Apr 2011 10:38:03 +0000 (10:38 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 12 Apr 2011 10:38:03 +0000 (10:38 +0000)
a crash when deserializing the AST for this:

  typedef char (&R);
    extern R &r;

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129358 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Serialization/ASTReader.cpp
lib/Serialization/ASTWriter.cpp
test/PCH/cxx-reference.cpp [new file with mode: 0644]
test/PCH/cxx-reference.h [new file with mode: 0644]

index 0e96770f5789e6f1522118ddb640599d9d675e46..1b0f8c56a0b149d12da277154e2ed24e8ecbe4c5 100644 (file)
@@ -3009,12 +3009,12 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
   }
 
   case TYPE_LVALUE_REFERENCE: {
-    if (Record.size() != 1) {
+    if (Record.size() != 2) {
       Error("Incorrect encoding of lvalue reference type");
       return QualType();
     }
     QualType PointeeType = GetType(Record[0]);
-    return Context->getLValueReferenceType(PointeeType);
+    return Context->getLValueReferenceType(PointeeType, Record[1]);
   }
 
   case TYPE_RVALUE_REFERENCE: {
index f0f5347a16d8a4094a80b6ac4c11b15230ad4e3d..f7dfc38224d528c9490736db050c96574671a2eb 100644 (file)
@@ -105,12 +105,13 @@ void ASTTypeWriter::VisitBlockPointerType(const BlockPointerType *T) {
 }
 
 void ASTTypeWriter::VisitLValueReferenceType(const LValueReferenceType *T) {
-  Writer.AddTypeRef(T->getPointeeType(), Record);
+  Writer.AddTypeRef(T->getPointeeTypeAsWritten(), Record);
+  Record.push_back(T->isSpelledAsLValue());
   Code = TYPE_LVALUE_REFERENCE;
 }
 
 void ASTTypeWriter::VisitRValueReferenceType(const RValueReferenceType *T) {
-  Writer.AddTypeRef(T->getPointeeType(), Record);
+  Writer.AddTypeRef(T->getPointeeTypeAsWritten(), Record);
   Code = TYPE_RVALUE_REFERENCE;
 }
 
diff --git a/test/PCH/cxx-reference.cpp b/test/PCH/cxx-reference.cpp
new file mode 100644 (file)
index 0000000..90d00d7
--- /dev/null
@@ -0,0 +1,6 @@
+// Test this without pch.
+// RUN: %clang_cc1 -std=c++0x -include %S/cxx-reference.h -fsyntax-only -emit-llvm -o - %s
+
+// Test with pch.
+// RUN: %clang_cc1 -std=c++0x -emit-pch -o %t %S/cxx-reference.h
+// RUN: %clang_cc1 -std=c++0x -include-pch %t -fsyntax-only -emit-llvm -o - %s 
diff --git a/test/PCH/cxx-reference.h b/test/PCH/cxx-reference.h
new file mode 100644 (file)
index 0000000..b46a367
--- /dev/null
@@ -0,0 +1,13 @@
+// Header for PCH test cxx-reference.cpp
+
+typedef char (&LR);
+typedef char (&&RR);
+
+char c;
+
+char &lr = c;
+char &&rr = 'c';
+LR &lrlr = c;
+LR &&rrlr = c;
+RR &lrrr = c;
+RR &&rrrr = 'c';