diff options
8 files changed, 46 insertions, 10 deletions
diff --git a/clang/include/clang/AST/ODRHash.h b/clang/include/clang/AST/ODRHash.h index c9e80278c7d..d4cddb8dfd7 100644 --- a/clang/include/clang/AST/ODRHash.h +++ b/clang/include/clang/AST/ODRHash.h @@ -40,7 +40,6 @@ class ODRHash { // Use DenseMaps to convert from DeclarationName and Type pointers // to an index value. llvm::DenseMap<DeclarationName, unsigned> DeclNameMap; - llvm::DenseMap<const Type*, unsigned> TypeMap; // Save space by processing bools at the end. llvm::SmallVector<bool, 128> Bools; diff --git a/clang/lib/AST/ODRHash.cpp b/clang/lib/AST/ODRHash.cpp index 126b6de25e4..ef1235e1d8c 100644 --- a/clang/lib/AST/ODRHash.cpp +++ b/clang/lib/AST/ODRHash.cpp @@ -180,7 +180,6 @@ void ODRHash::AddTemplateParameterList(const TemplateParameterList *TPL) { void ODRHash::clear() { DeclNameMap.clear(); - TypeMap.clear(); Bools.clear(); ID.clear(); } @@ -770,14 +769,6 @@ public: void ODRHash::AddType(const Type *T) { assert(T && "Expecting non-null pointer."); - auto Result = TypeMap.insert(std::make_pair(T, TypeMap.size())); - ID.AddInteger(Result.first->second); - // On first encounter of a Type pointer, process it. Every time afterwards, - // only the index value is needed. - if (!Result.second) { - return; - } - ODRTypeVisitor(ID, *this).Visit(T); } diff --git a/clang/test/Modules/Inputs/odr_hash-elaborated-types/first.h b/clang/test/Modules/Inputs/odr_hash-elaborated-types/first.h new file mode 100644 index 00000000000..d2c4a033a16 --- /dev/null +++ b/clang/test/Modules/Inputs/odr_hash-elaborated-types/first.h @@ -0,0 +1,6 @@ +#ifndef FIRST +#define FIRST + +#include "textual_time.h" + +#endif diff --git a/clang/test/Modules/Inputs/odr_hash-elaborated-types/module.modulemap b/clang/test/Modules/Inputs/odr_hash-elaborated-types/module.modulemap new file mode 100644 index 00000000000..94cb4c11191 --- /dev/null +++ b/clang/test/Modules/Inputs/odr_hash-elaborated-types/module.modulemap @@ -0,0 +1,5 @@ +module M { + module first { header "first.h" export *} + module second { header "second.h" export *} + export * +} diff --git a/clang/test/Modules/Inputs/odr_hash-elaborated-types/second.h b/clang/test/Modules/Inputs/odr_hash-elaborated-types/second.h new file mode 100644 index 00000000000..577cf113457 --- /dev/null +++ b/clang/test/Modules/Inputs/odr_hash-elaborated-types/second.h @@ -0,0 +1,6 @@ +#ifndef SECOND +#define SECOND + +#include "textual_stat.h" + +#endif diff --git a/clang/test/Modules/Inputs/odr_hash-elaborated-types/textual_stat.h b/clang/test/Modules/Inputs/odr_hash-elaborated-types/textual_stat.h new file mode 100644 index 00000000000..5dad510f9eb --- /dev/null +++ b/clang/test/Modules/Inputs/odr_hash-elaborated-types/textual_stat.h @@ -0,0 +1,11 @@ +#ifndef _SYS_STAT_H +#define _SYS_STAT_H + +#include "textual_time.h" + +struct stat { + struct timespec st_atim; + struct timespec st_mtim; +}; + +#endif diff --git a/clang/test/Modules/Inputs/odr_hash-elaborated-types/textual_time.h b/clang/test/Modules/Inputs/odr_hash-elaborated-types/textual_time.h new file mode 100644 index 00000000000..2a2a89c5a7e --- /dev/null +++ b/clang/test/Modules/Inputs/odr_hash-elaborated-types/textual_time.h @@ -0,0 +1,6 @@ +#ifndef _TIME_H +#define _TIME_H + +struct timespec { }; + +#endif diff --git a/clang/test/Modules/odr_hash-elaborated-types.cpp b/clang/test/Modules/odr_hash-elaborated-types.cpp new file mode 100644 index 00000000000..7dd11ac6d7f --- /dev/null +++ b/clang/test/Modules/odr_hash-elaborated-types.cpp @@ -0,0 +1,12 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -std=c++1z -I%S/Inputs/odr_hash-elaborated-types -verify %s +// RUN: %clang_cc1 -std=c++1z -fmodules -fmodules-local-submodule-visibility -fmodule-map-file=%S/Inputs/odr_hash-elaborated-types/module.modulemap -fmodules-cache-path=%t -x c++ -I%S/Inputs/odr_hash-elaborated-types -verify %s + +#include "textual_stat.h" + +#include "first.h" +#include "second.h" + +void use() { struct stat value; } + +// expected-no-diagnostics |