mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-22 04:55:50 -04:00

r246546, with a workaround for an MSVC 2013 miscompile and an MSVC 2015 rejects-valid. Original commit message: [modules] Rework serialized DeclContext lookup table management. Instead of walking the loaded ModuleFiles looking for lookup tables for the context, store them all in one place, and merge them together if we find we have too many (currently, more than 4). If we do merge, include the merged form in our serialized lookup table, so that downstream readers never need to look at our imports' tables. This gives a huge performance improvement to builds with very large numbers of modules (in some cases, more than a 2x speedup was observed). llvm-svn: 246582
72 lines
3.3 KiB
C++
72 lines
3.3 KiB
C++
// RUN: rm -rf %t
|
|
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -x c++ -I%S/Inputs/merge-using-decls -verify %s -DORDER=1
|
|
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -x c++ -I%S/Inputs/merge-using-decls -verify %s -DORDER=2
|
|
|
|
#if ORDER == 1
|
|
#include "a.h"
|
|
#include "b.h"
|
|
#else
|
|
#include "b.h"
|
|
#include "a.h"
|
|
#endif
|
|
|
|
struct Y {
|
|
int value; // expected-note 0-1{{target of using}}
|
|
typedef int type; // expected-note 0-1{{target of using}}
|
|
};
|
|
|
|
template<typename T> int Use() {
|
|
int k = T().v + T().value; // expected-note 0-2{{instantiation of}}
|
|
typedef typename T::type I;
|
|
typedef typename T::t I;
|
|
typedef int I;
|
|
return k;
|
|
}
|
|
|
|
template<typename T> int UseAll() {
|
|
return Use<C<T> >() + Use<D<T> >() + Use<E<T> >() + Use<F<T> >(); // expected-note 0-2{{instantiation of}}
|
|
}
|
|
|
|
template int UseAll<YA>();
|
|
template int UseAll<YB>();
|
|
template int UseAll<Y>();
|
|
|
|
// Which of these two sets of diagnostics is chosen is not important. It's OK
|
|
// if this varies with ORDER, but it must be consistent across runs.
|
|
#if ORDER == 1
|
|
// Here, we're instantiating the definition from 'A' and merging the definition
|
|
// from 'B' into it.
|
|
|
|
// expected-error@b.h:* {{'E::value' from module 'B' is not present in definition of 'E<T>' in module 'A'}}
|
|
// expected-error@b.h:* {{'E::v' from module 'B' is not present in definition of 'E<T>' in module 'A'}}
|
|
|
|
// expected-error@b.h:* {{'F::type' from module 'B' is not present in definition of 'F<T>' in module 'A'}}
|
|
// expected-error@b.h:* {{'F::t' from module 'B' is not present in definition of 'F<T>' in module 'A'}}
|
|
// expected-error@b.h:* {{'F::value' from module 'B' is not present in definition of 'F<T>' in module 'A'}}
|
|
// expected-error@b.h:* {{'F::v' from module 'B' is not present in definition of 'F<T>' in module 'A'}}
|
|
|
|
// expected-note@a.h:* +{{does not match}}
|
|
#else
|
|
// Here, we're instantiating the definition from 'B' and merging the definition
|
|
// from 'A' into it.
|
|
|
|
// expected-error@a.h:* {{'D::type' from module 'A' is not present in definition of 'D<T>' in module 'B'}}
|
|
// expected-error@a.h:* {{'D::value' from module 'A' is not present in definition of 'D<T>' in module 'B'}}
|
|
// expected-error@b.h:* 2{{'typename' keyword used on a non-type}}
|
|
// expected-error@b.h:* 2{{dependent using declaration resolved to type without 'typename'}}
|
|
|
|
// expected-error@a.h:* {{'E::type' from module 'A' is not present in definition of 'E<T>' in module 'B'}}
|
|
// expected-error@a.h:* {{'E::t' from module 'A' is not present in definition of 'E<T>' in module 'B'}}
|
|
// expected-error@a.h:* {{'E::value' from module 'A' is not present in definition of 'E<T>' in module 'B'}}
|
|
// expected-error@a.h:* {{'E::v' from module 'A' is not present in definition of 'E<T>' in module 'B'}}
|
|
// expected-note@b.h:* 2{{definition has no member}}
|
|
|
|
// expected-error@a.h:* {{'F::type' from module 'A' is not present in definition of 'F<T>' in module 'B'}}
|
|
// expected-error@a.h:* {{'F::t' from module 'A' is not present in definition of 'F<T>' in module 'B'}}
|
|
// expected-error@a.h:* {{'F::value' from module 'A' is not present in definition of 'F<T>' in module 'B'}}
|
|
// expected-error@a.h:* {{'F::v' from module 'A' is not present in definition of 'F<T>' in module 'B'}}
|
|
|
|
// expected-note@b.h:* +{{does not match}}
|
|
// expected-note@b.h:* +{{target of using}}
|
|
#endif
|