From: Richard Smith Date: Thu, 22 Jan 2015 01:41:56 +0000 (+0000) Subject: [modules] It's possible to merge into the pattern of a class template before we X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=197904daa1fc67d7069153e4b5f61ef86b74938d;p=clang [modules] It's possible to merge into the pattern of a class template before we load the definition data from the declaration itself. In that case, merge properly; don't assume the prior definition is the same as our own. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226761 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index a783183d2e..8c03b0b8b2 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -1457,9 +1457,13 @@ void ASTDeclReader::ReadCXXRecordDefinition(CXXRecordDecl *D) { ReadCXXDefinitionData(*DD, Record, Idx); - // If we're reading an update record, we might already have a definition for - // this record. If so, just merge into it. - if (D->DefinitionData.getNotUpdated()) { + // We might already have a definition for this record. This can happen either + // because we're reading an update record, or because we've already done some + // merging. Either way, just merge into it. + if (auto *CanonDD = D->DefinitionData.getNotUpdated()) { + if (CanonDD->Definition != DD->Definition) + Reader.MergedDeclContexts.insert( + std::make_pair(DD->Definition, CanonDD->Definition)); MergeDefinitionData(D, *DD); return; } diff --git a/test/Modules/Inputs/merge-anon-in-template/a.h b/test/Modules/Inputs/merge-anon-in-template/a.h new file mode 100644 index 0000000000..82540e397b --- /dev/null +++ b/test/Modules/Inputs/merge-anon-in-template/a.h @@ -0,0 +1,4 @@ +template struct is_floating { + enum { value = 0 }; + typedef int type; +}; diff --git a/test/Modules/Inputs/merge-anon-in-template/b.h b/test/Modules/Inputs/merge-anon-in-template/b.h new file mode 100644 index 0000000000..87c053d962 --- /dev/null +++ b/test/Modules/Inputs/merge-anon-in-template/b.h @@ -0,0 +1,2 @@ +#include "a.h" +bool k = is_floating::value; diff --git a/test/Modules/Inputs/merge-anon-in-template/c.h b/test/Modules/Inputs/merge-anon-in-template/c.h new file mode 100644 index 0000000000..e0b9b0a331 --- /dev/null +++ b/test/Modules/Inputs/merge-anon-in-template/c.h @@ -0,0 +1,6 @@ +template struct is_floating { + enum { value = 0 }; + typedef int type; +}; +#include "b.h" +bool n20 = is_floating::value; diff --git a/test/Modules/Inputs/merge-anon-in-template/module.modulemap b/test/Modules/Inputs/merge-anon-in-template/module.modulemap new file mode 100644 index 0000000000..77e0a89e39 --- /dev/null +++ b/test/Modules/Inputs/merge-anon-in-template/module.modulemap @@ -0,0 +1,3 @@ +module a { header "a.h" export * } +module b { header "b.h" export * } +module c { header "c.h" export * } diff --git a/test/Modules/merge-anon-in-template.cc b/test/Modules/merge-anon-in-template.cc new file mode 100644 index 0000000000..6e4e6e09e9 --- /dev/null +++ b/test/Modules/merge-anon-in-template.cc @@ -0,0 +1,6 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I%S/Inputs/merge-anon-in-template -verify %s +// expected-no-diagnostics +#include "a.h" +#include "c.h" +is_floating::type t;