llvm-project/clang/test/SemaTemplate/default-arguments-cxx0x.cpp
David Majnemer 8918920a32 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
2013-08-28 23:48:32 +00:00

59 lines
1009 B
C++

// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
// expected-no-diagnostics
// Test default template arguments for function templates.
template<typename T = int>
void f0();
template<typename T>
void f0();
void g0() {
f0(); // okay!
}
template<typename T, int N = T::value>
int &f1(T);
float &f1(...);
struct HasValue {
static const int value = 17;
};
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};
}