2016-04-29 07:50:12 +08:00
// RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s
2016-04-29 10:24:14 +08:00
template < class > auto fn0 = [ ] { } ;
template < typename > void foo0 ( ) { fn0 < char > ( ) ; }
2016-04-29 07:50:12 +08:00
template < typename T > auto fn1 = [ ] ( auto a ) { return a + T ( 1 ) ; } ;
2016-12-17 05:16:57 +08:00
template < typename T > auto v1 = [ ] ( int a = T ( 1 ) ) { return a ; } ( ) ;
struct S {
template < class T >
2017-09-21 10:51:56 +08:00
static constexpr T t = [ ] ( int f = T ( 7 ) ) { return f ; } ( ) ; // expected-error{{constexpr variable 't<int>' must be initialized by a constant expression}} expected-error{{a lambda expression may not appear inside of a constant expression}} expected-note{{cannot be used in a constant expression}}
2016-12-17 05:16:57 +08:00
} ;
2016-04-29 07:50:12 +08:00
template < typename X >
int foo2 ( ) {
X a = 0x61 ;
fn1 < char > ( a ) ;
2016-12-17 05:16:57 +08:00
( void ) v1 < int > ;
( void ) S : : t < int > ; // expected-note{{in instantiation of static data member 'S::t<int>' requested here}}
2016-04-29 07:50:12 +08:00
return 0 ;
}
2016-12-17 05:16:57 +08:00
template < class C >
int foo3 ( ) {
C : : m1 ( ) ; // expected-error{{type 'long long' cannot be used prior to '::' because it has no members}}
return 1 ;
}
template < class C >
auto v2 = [ ] ( int a = foo3 < C > ( ) ) { } ; // expected-note{{in instantiation of function template specialization 'foo3<long long>' requested here}}
2016-04-29 07:50:12 +08:00
int main ( ) {
2016-12-17 05:16:57 +08:00
v2 < long long > ( ) ; // This line causes foo3<long long> to be instantiated.
v2 < long long > ( 2 ) ; // This line does not.
2016-04-29 07:50:12 +08:00
foo2 < int > ( ) ;
}