summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2013-02-16 00:48:59 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2013-02-16 00:48:59 +0000
commit83a6e3bfabb392cfa636d921b19db48ef45b69d0 (patch)
tree71fe8f6ae96610460251840b60d327763441490a /clang/test
parent0062ba649478e2052fa6ef6a141f44cbf208c56e (diff)
downloadbcm5719-llvm-83a6e3bfabb392cfa636d921b19db48ef45b69d0.tar.gz
bcm5719-llvm-83a6e3bfabb392cfa636d921b19db48ef45b69d0.zip
[PCH] Deserializing the DeclContext of a template parameter is not safe
until recursive loading is finished. Otherwise we may end up with a template trying to deserialize a template parameter that is in the process of getting loaded. rdar://13135282 llvm-svn: 175329
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/PCH/cxx-templates.cpp6
-rw-r--r--clang/test/PCH/cxx-templates.h26
2 files changed, 32 insertions, 0 deletions
diff --git a/clang/test/PCH/cxx-templates.cpp b/clang/test/PCH/cxx-templates.cpp
index d27e9ca93c4..ddebae4df24 100644
--- a/clang/test/PCH/cxx-templates.cpp
+++ b/clang/test/PCH/cxx-templates.cpp
@@ -79,3 +79,9 @@ namespace TestNestedExpansion {
Int &g(Int, int, double);
Int &test = NestedExpansion<char, char, char>().f(0, 1, 2, Int(3), 4, 5.0);
}
+
+namespace rdar13135282 {
+ void test() {
+ __mt_alloc<> mt = __mt_alloc<>();
+ }
+}
diff --git a/clang/test/PCH/cxx-templates.h b/clang/test/PCH/cxx-templates.h
index 756f208b76f..3dda0590264 100644
--- a/clang/test/PCH/cxx-templates.h
+++ b/clang/test/PCH/cxx-templates.h
@@ -220,3 +220,29 @@ template<typename...A> struct NestedExpansion {
template<typename...B> auto f(A...a, B...b) -> decltype(g(a + b...));
};
template struct NestedExpansion<char, char, char>;
+
+namespace rdar13135282 {
+template < typename _Alloc >
+void foo(_Alloc = _Alloc());
+
+template < bool > class __pool;
+
+template < template < bool > class _PoolTp >
+struct __common_pool {
+ typedef _PoolTp < 0 > pool_type;
+};
+
+template < template < bool > class _PoolTp >
+struct __common_pool_base : __common_pool < _PoolTp > {};
+
+template < template < bool > class _PoolTp >
+struct A : __common_pool_base < _PoolTp > {};
+
+template < typename _Poolp = A < __pool > >
+struct __mt_alloc {
+ typedef typename _Poolp::pool_type __pool_type;
+ __mt_alloc() {
+ foo<__mt_alloc<> >();
+ }
+};
+}
OpenPOWER on IntegriCloud