hans updated this revision to Diff 125227. hans retitled this revision from "Correctly handle line directives without filenames that come first in the file" to "Correctly handle line table entries without filenames during AST serialization". hans edited the summary of this revision.
https://reviews.llvm.org/D40746 Files: lib/Serialization/ASTReader.cpp lib/Serialization/ASTWriter.cpp test/PCH/line-directive-nofilename.c test/PCH/line-directive-nofilename.h Index: test/PCH/line-directive-nofilename.h =================================================================== --- /dev/null +++ test/PCH/line-directive-nofilename.h @@ -0,0 +1,5 @@ +#line 42 +int foo; // This should appear as at line-directive-nofilename.h:42 + +#line 100 "foobar.h" +int bar; // This should appear as at foobar.h:100 Index: test/PCH/line-directive-nofilename.c =================================================================== --- /dev/null +++ test/PCH/line-directive-nofilename.c @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -emit-pch -o %t %S/line-directive-nofilename.h +// RUN: not %clang_cc1 -include-pch %t -fsyntax-only %s 2>&1 | FileCheck %s + +// This causes an "error: redefinition" diagnostic. The notes will have the +// locations of the declarations from the PCH file. +double foo, bar; + +// CHECK: line-directive-nofilename.h:42:5: note: previous definition is here +// CHECK: foobar.h:100:5: note: previous definition is here Index: lib/Serialization/ASTWriter.cpp =================================================================== --- lib/Serialization/ASTWriter.cpp +++ lib/Serialization/ASTWriter.cpp @@ -2363,12 +2363,13 @@ // Emit the needed file names. llvm::DenseMap<int, int> FilenameMap; + FilenameMap[-1] = -1; // For unspecified filenames. for (const auto &L : LineTable) { if (L.first.ID < 0) continue; for (auto &LE : L.second) { if (FilenameMap.insert(std::make_pair(LE.FilenameID, - FilenameMap.size())).second) + FilenameMap.size() - 1)).second) AddPath(LineTable.getFilename(LE.FilenameID), Record); } } Index: lib/Serialization/ASTReader.cpp =================================================================== --- lib/Serialization/ASTReader.cpp +++ lib/Serialization/ASTReader.cpp @@ -1220,6 +1220,7 @@ // Parse the file names std::map<int, int> FileIDs; + FileIDs[-1] = -1; // For unspecified filenames. for (unsigned I = 0; Record[Idx]; ++I) { // Extract the file name auto Filename = ReadPath(F, Record, Idx);
Index: test/PCH/line-directive-nofilename.h =================================================================== --- /dev/null +++ test/PCH/line-directive-nofilename.h @@ -0,0 +1,5 @@ +#line 42 +int foo; // This should appear as at line-directive-nofilename.h:42 + +#line 100 "foobar.h" +int bar; // This should appear as at foobar.h:100 Index: test/PCH/line-directive-nofilename.c =================================================================== --- /dev/null +++ test/PCH/line-directive-nofilename.c @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -emit-pch -o %t %S/line-directive-nofilename.h +// RUN: not %clang_cc1 -include-pch %t -fsyntax-only %s 2>&1 | FileCheck %s + +// This causes an "error: redefinition" diagnostic. The notes will have the +// locations of the declarations from the PCH file. +double foo, bar; + +// CHECK: line-directive-nofilename.h:42:5: note: previous definition is here +// CHECK: foobar.h:100:5: note: previous definition is here Index: lib/Serialization/ASTWriter.cpp =================================================================== --- lib/Serialization/ASTWriter.cpp +++ lib/Serialization/ASTWriter.cpp @@ -2363,12 +2363,13 @@ // Emit the needed file names. llvm::DenseMap<int, int> FilenameMap; + FilenameMap[-1] = -1; // For unspecified filenames. for (const auto &L : LineTable) { if (L.first.ID < 0) continue; for (auto &LE : L.second) { if (FilenameMap.insert(std::make_pair(LE.FilenameID, - FilenameMap.size())).second) + FilenameMap.size() - 1)).second) AddPath(LineTable.getFilename(LE.FilenameID), Record); } } Index: lib/Serialization/ASTReader.cpp =================================================================== --- lib/Serialization/ASTReader.cpp +++ lib/Serialization/ASTReader.cpp @@ -1220,6 +1220,7 @@ // Parse the file names std::map<int, int> FileIDs; + FileIDs[-1] = -1; // For unspecified filenames. for (unsigned I = 0; Record[Idx]; ++I) { // Extract the file name auto Filename = ReadPath(F, Record, Idx);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits