summaryrefslogtreecommitdiff
path: root/test/SemaTemplate/instantiate-non-type-template-parameter.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-02-18 02:12:44 +0000
committerDouglas Gregor <dgregor@apple.com>2011-02-18 02:12:44 +0000
commit8f5667d06a785719691c1139b961411d7f0aedf5 (patch)
tree19366c905ad4a27f7d1e4f2767d7932b1f0b07f5 /test/SemaTemplate/instantiate-non-type-template-parameter.cpp
parent4ae493cccbfbf122ec6ebac0e330232c22fa8489 (diff)
downloadclang-8f5667d06a785719691c1139b961411d7f0aedf5.tar.gz
clang-8f5667d06a785719691c1139b961411d7f0aedf5.tar.bz2
clang-8f5667d06a785719691c1139b961411d7f0aedf5.tar.xz
When we're creating an expression for an integral template argument of
enumeration type, we were generating an integer literal implicitly casted to the appropriate enumeration type. However, later checks on that expression would strip the implicit cast. This commit tweaks the lame hack, by creating an explicit cast instead of an implicit cast. The right answer is to introduce a SubstNonTypeTemplateParmExpr expression that acts like the substituted result. I'll investigate that soon. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125818 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaTemplate/instantiate-non-type-template-parameter.cpp')
-rw-r--r--test/SemaTemplate/instantiate-non-type-template-parameter.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/test/SemaTemplate/instantiate-non-type-template-parameter.cpp b/test/SemaTemplate/instantiate-non-type-template-parameter.cpp
index cbadcde2c1..027c1e8bb7 100644
--- a/test/SemaTemplate/instantiate-non-type-template-parameter.cpp
+++ b/test/SemaTemplate/instantiate-non-type-template-parameter.cpp
@@ -34,3 +34,22 @@ namespace PR6986 {
ckey_m m;
}
}
+
+namespace rdar8980215 {
+ enum E { E1, E2, E3 };
+
+ template<typename T, E e = E2>
+ struct X0 {
+ X0() {}
+ template<typename U> X0(const X0<U, e> &);
+ };
+
+ template<typename T>
+ struct X1 : X0<T> {
+ X1() {}
+ template<typename U> X1(const X1<U> &x) : X0<T>(x) { }
+ };
+
+ X1<int> x1i;
+ X1<float> x1f(x1i);
+}