From f7eadeaffa5ce26cb1f45de35bac0658adf7b40b Mon Sep 17 00:00:00 2001 From: Vassil Vassilev Date: Wed, 30 Mar 2016 20:16:03 +0000 Subject: [PATCH] [modules] Write out identifiers if the ID is local, too. In some cases a slot for an identifier is requested but it gets written to another module, causing an assertion. At the point when we start serializing Rtypes, we have no imported IdentifierID for float_round_style. We start serializing stuff and allocate an ID for it. Then, during the serialization process, we pull in the identifier info for it from TSchemaHelper. Finally, WriteIdentifierTable decides that the identifier has not changed since it was deserialized, so doesn't emit it. Fixes https://llvm.org/bugs/show_bug.cgi?id=27041 Discussed on IRC with Richard Smith. Agreed on post commit review if needed. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@264913 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Serialization/ASTWriter.cpp | 5 ++++- test/Modules/Inputs/PR27041/Rtypes.h | 1 + test/Modules/Inputs/PR27041/TGenericClassInfo.h | 3 +++ test/Modules/Inputs/PR27041/TSchemaHelper.h | 1 + test/Modules/Inputs/PR27041/module.modulemap | 2 ++ test/Modules/pr27041.cpp | 7 +++++++ 6 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 test/Modules/Inputs/PR27041/Rtypes.h create mode 100644 test/Modules/Inputs/PR27041/TGenericClassInfo.h create mode 100644 test/Modules/Inputs/PR27041/TSchemaHelper.h create mode 100644 test/Modules/Inputs/PR27041/module.modulemap create mode 100644 test/Modules/pr27041.cpp diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index a828d350c0..78fc6eb4ba 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -3340,7 +3340,10 @@ void ASTWriter::WriteIdentifierTable(Preprocessor &PP, auto *II = const_cast(IdentIDPair.first); IdentID ID = IdentIDPair.second; assert(II && "NULL identifier in identifier table"); - if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization() || + // Write out identifiers if either the ID is local or the identifier has + // changed since it was loaded. + if (ID >= FirstIdentID || !Chain || !II->isFromAST() + || II->hasChangedSinceDeserialization() || (Trait.needDecls() && II->hasFETokenInfoChangedSinceDeserialization())) Generator.insert(II, ID, Trait); diff --git a/test/Modules/Inputs/PR27041/Rtypes.h b/test/Modules/Inputs/PR27041/Rtypes.h new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/test/Modules/Inputs/PR27041/Rtypes.h @@ -0,0 +1 @@ + diff --git a/test/Modules/Inputs/PR27041/TGenericClassInfo.h b/test/Modules/Inputs/PR27041/TGenericClassInfo.h new file mode 100644 index 0000000000..b43b2c90f2 --- /dev/null +++ b/test/Modules/Inputs/PR27041/TGenericClassInfo.h @@ -0,0 +1,3 @@ +namespace std {} +namespace std { enum float_round_style { denorm_present }; } +#include "TSchemaHelper.h" diff --git a/test/Modules/Inputs/PR27041/TSchemaHelper.h b/test/Modules/Inputs/PR27041/TSchemaHelper.h new file mode 100644 index 0000000000..31f726f4d7 --- /dev/null +++ b/test/Modules/Inputs/PR27041/TSchemaHelper.h @@ -0,0 +1 @@ +namespace std { enum float_round_style { denorm_present }; } diff --git a/test/Modules/Inputs/PR27041/module.modulemap b/test/Modules/Inputs/PR27041/module.modulemap new file mode 100644 index 0000000000..f0147cdf97 --- /dev/null +++ b/test/Modules/Inputs/PR27041/module.modulemap @@ -0,0 +1,2 @@ +module "Rtypes.h" { header "Rtypes.h" header "TGenericClassInfo.h" } +module "TSchemaHelper.h" { header "TSchemaHelper.h" } diff --git a/test/Modules/pr27041.cpp b/test/Modules/pr27041.cpp new file mode 100644 index 0000000000..9d06468b97 --- /dev/null +++ b/test/Modules/pr27041.cpp @@ -0,0 +1,7 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -std=c++11 -I%S/Inputs/PR27041 -verify %s +// RUN: %clang_cc1 -std=c++11 -fmodules -fmodule-map-file=%S/Inputs/PR27041/module.modulemap -fmodules-cache-path=%t -I%S/Inputs/PR27041 -verify %s + +#include "Rtypes.h" + +// expected-no-diagnostics -- 2.50.1