diff options
author | David Majnemer <david.majnemer@gmail.com> | 2013-08-28 23:48:32 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2013-08-28 23:48:32 +0000 |
commit | 8918920a329506ea76693876cc8f23af145a6aaa (patch) | |
tree | 12cffd36b8397a1e04b4ad0b9aca982ff2046519 /clang/test/SemaTemplate/default-arguments-cxx0x.cpp | |
parent | 4c459bcd472c32e68654c0ffea48a5978819c4e7 (diff) | |
download | bcm5719-llvm-8918920a329506ea76693876cc8f23af145a6aaa.tar.gz bcm5719-llvm-8918920a329506ea76693876cc8f23af145a6aaa.zip |
Sema: Subst type default template args earlier
Summary:
We would not perform substitution at an appropriate point, allowing strange
results to appear. We would accepts things that we shouldn't or mangle things incorrectly. Note that this hasn't fixed the other cases like
template-template parameters or non-type template parameters.
Reviewers: doug.gregor, rjmccall, rsmith
Reviewed By: rsmith
CC: cfe-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D1507
llvm-svn: 189540
Diffstat (limited to 'clang/test/SemaTemplate/default-arguments-cxx0x.cpp')
-rw-r--r-- | clang/test/SemaTemplate/default-arguments-cxx0x.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/clang/test/SemaTemplate/default-arguments-cxx0x.cpp b/clang/test/SemaTemplate/default-arguments-cxx0x.cpp index 4c815f65587..4cfd7a5843f 100644 --- a/clang/test/SemaTemplate/default-arguments-cxx0x.cpp +++ b/clang/test/SemaTemplate/default-arguments-cxx0x.cpp @@ -25,3 +25,34 @@ void g1() { float &fr = f1(15); int &ir = f1(HasValue()); } + +namespace PR16689 { + template <typename T1, typename T2> class tuple { + public: + template <typename = T2> + constexpr tuple() {} + }; + template <class X, class... Y> struct a : public X { + using X::X; + }; + auto x = a<tuple<int, int> >(); +} + +namespace PR16975 { + template <typename...> struct is { + constexpr operator bool() const { return false; } + }; + + template <typename... Types> + struct bar { + template <typename T, + bool = is<Types...>()> + bar(T); + }; + + struct baz : public bar<> { + using bar::bar; + }; + + baz data{0}; +} |