2017-03-01 18:23:38 +08:00
// RUN: %clang_cc1 -fsyntax-only -Wunused-lambda-capture -Wused-but-marked-unused -Wno-uninitialized -verify -std=c++1z %s
2017-01-13 23:01:06 +08:00
class NonTrivialConstructor {
public :
NonTrivialConstructor ( ) { }
} ;
2017-03-01 18:23:38 +08:00
class NonTrivialCopyConstructor {
public :
NonTrivialCopyConstructor ( ) = default ;
NonTrivialCopyConstructor ( const NonTrivialCopyConstructor & ) { }
} ;
2017-01-13 23:01:06 +08:00
class NonTrivialDestructor {
public :
~ NonTrivialDestructor ( ) { }
} ;
class Trivial {
public :
Trivial ( ) = default ;
Trivial ( int a ) { }
} ;
int side_effect ( ) {
return 42 ;
}
void test ( ) {
int i = 0 ;
2017-01-20 01:19:22 +08:00
const int k = 0 ;
2017-01-13 23:01:06 +08:00
auto captures_nothing = [ ] { } ;
auto captures_nothing_by_value = [ = ] { } ;
auto captures_nothing_by_reference = [ & ] { } ;
auto implicit_by_value = [ = ] ( ) mutable { i + + ; } ;
auto implicit_by_reference = [ & ] { i + + ; } ;
auto explicit_by_value_used = [ i ] { return i + 1 ; } ;
auto explicit_by_value_used_void = [ i ] { ( void ) i ; } ;
auto explicit_by_value_unused = [ i ] { } ; // expected-warning{{lambda capture 'i' is not used}}
2018-07-17 21:17:01 +08:00
auto explicit_by_value_unused_sizeof = [ i ] { return sizeof ( i ) ; } ; // expected-warning{{lambda capture 'i' is not required to be captured for this use}}
auto explicit_by_value_unused_decltype = [ i ] { decltype ( i ) j = 0 ; } ; // expected-warning{{lambda capture 'i' is not required to be captured for this use}}
auto explicit_by_value_unused_const = [ k ] { return k + 1 ; } ; // expected-warning{{lambda capture 'k' is not required to be captured for this use}}
2017-01-13 23:01:06 +08:00
auto explicit_by_reference_used = [ & i ] { i + + ; } ;
auto explicit_by_reference_unused = [ & i ] { } ; // expected-warning{{lambda capture 'i' is not used}}
auto explicit_initialized_reference_used = [ & j = i ] { return j + 1 ; } ;
auto explicit_initialized_reference_unused = [ & j = i ] { } ; // expected-warning{{lambda capture 'j' is not used}}
auto explicit_initialized_value_used = [ j = 1 ] { return j + 1 ; } ;
auto explicit_initialized_value_unused = [ j = 1 ] { } ; // expected-warning{{lambda capture 'j' is not used}}
auto explicit_initialized_value_non_trivial_constructor = [ j = NonTrivialConstructor ( ) ] { } ;
auto explicit_initialized_value_non_trivial_destructor = [ j = NonTrivialDestructor ( ) ] { } ;
auto explicit_initialized_value_trivial_init = [ j = Trivial ( ) ] { } ; // expected-warning{{lambda capture 'j' is not used}}
auto explicit_initialized_value_non_trivial_init = [ j = Trivial ( 42 ) ] { } ;
auto explicit_initialized_value_with_side_effect = [ j = side_effect ( ) ] { } ;
auto nested = [ & i ] {
auto explicit_by_value_used = [ i ] { return i + 1 ; } ;
auto explicit_by_value_unused = [ i ] { } ; // expected-warning{{lambda capture 'i' is not used}}
} ;
2017-03-01 18:23:38 +08:00
Trivial trivial ;
auto explicit_by_value_trivial = [ trivial ] { } ; // expected-warning{{lambda capture 'trivial' is not used}}
NonTrivialConstructor cons ;
auto explicit_by_value_non_trivial_constructor = [ cons ] { } ; // expected-warning{{lambda capture 'cons' is not used}}
NonTrivialCopyConstructor copy_cons ;
auto explicit_by_value_non_trivial_copy_constructor = [ copy_cons ] { } ;
NonTrivialDestructor dest ;
auto explicit_by_value_non_trivial_destructor = [ dest ] { } ;
volatile int v ;
auto explicit_by_value_volatile = [ v ] { } ;
2017-01-13 23:01:06 +08:00
}
2017-03-01 18:23:38 +08:00
class TrivialThis : Trivial {
2017-01-13 23:01:06 +08:00
void test ( ) {
auto explicit_this_used = [ this ] { return i ; } ;
auto explicit_this_used_void = [ this ] { ( void ) this ; } ;
auto explicit_this_unused = [ this ] { } ; // expected-warning{{lambda capture 'this' is not used}}
2017-03-01 18:23:38 +08:00
auto explicit_star_this_used = [ * this ] { return i ; } ;
auto explicit_star_this_used_void = [ * this ] { ( void ) this ; } ;
auto explicit_star_this_unused = [ * this ] { } ; // expected-warning{{lambda capture 'this' is not used}}
}
int i ;
} ;
class NonTrivialConstructorThis : NonTrivialConstructor {
void test ( ) {
auto explicit_this_used = [ this ] { return i ; } ;
auto explicit_this_used_void = [ this ] { ( void ) this ; } ;
auto explicit_this_unused = [ this ] { } ; // expected-warning{{lambda capture 'this' is not used}}
auto explicit_star_this_used = [ * this ] { return i ; } ;
auto explicit_star_this_used_void = [ * this ] { ( void ) this ; } ;
auto explicit_star_this_unused = [ * this ] { } ; // expected-warning{{lambda capture 'this' is not used}}
}
int i ;
} ;
class NonTrivialCopyConstructorThis : NonTrivialCopyConstructor {
void test ( ) {
auto explicit_this_used = [ this ] { return i ; } ;
auto explicit_this_used_void = [ this ] { ( void ) this ; } ;
auto explicit_this_unused = [ this ] { } ; // expected-warning{{lambda capture 'this' is not used}}
auto explicit_star_this_used = [ * this ] { return i ; } ;
auto explicit_star_this_used_void = [ * this ] { ( void ) this ; } ;
auto explicit_star_this_unused = [ * this ] { } ;
}
int i ;
} ;
class NonTrivialDestructorThis : NonTrivialDestructor {
void test ( ) {
auto explicit_this_used = [ this ] { return i ; } ;
auto explicit_this_used_void = [ this ] { ( void ) this ; } ;
auto explicit_this_unused = [ this ] { } ; // expected-warning{{lambda capture 'this' is not used}}
auto explicit_star_this_used = [ * this ] { return i ; } ;
auto explicit_star_this_used_void = [ * this ] { ( void ) this ; } ;
auto explicit_star_this_unused = [ * this ] { } ;
2017-01-13 23:01:06 +08:00
}
int i ;
} ;
template < typename T >
void test_templated ( ) {
int i = 0 ;
2017-01-20 01:19:22 +08:00
const int k = 0 ;
2017-01-13 23:01:06 +08:00
auto captures_nothing = [ ] { } ;
auto captures_nothing_by_value = [ = ] { } ;
auto captures_nothing_by_reference = [ & ] { } ;
auto implicit_by_value = [ = ] ( ) mutable { i + + ; } ;
auto implicit_by_reference = [ & ] { i + + ; } ;
auto explicit_by_value_used = [ i ] { return i + 1 ; } ;
2017-06-14 02:38:31 +08:00
auto explicit_by_value_used_generic = [ i ] ( auto c ) { return i + 1 ; } ;
2017-01-13 23:01:06 +08:00
auto explicit_by_value_used_void = [ i ] { ( void ) i ; } ;
2017-06-14 02:38:31 +08:00
2017-01-13 23:01:06 +08:00
auto explicit_by_value_unused = [ i ] { } ; // expected-warning{{lambda capture 'i' is not used}}
2018-07-17 21:17:01 +08:00
auto explicit_by_value_unused_sizeof = [ i ] { return sizeof ( i ) ; } ; // expected-warning{{lambda capture 'i' is not required to be captured for this use}}
Revert "Following up on PR48517, fix handling of template arguments that refer"
Combined with 'da98651 - Revert "DR2064:
decltype(E) is only a dependent', this change (5a391d3) caused verifier
errors when building Chromium. See https://crbug.com/1168494#c1 for a
reproducer.
Additionally it reverts changes that were dependent on this one, see
below.
> Following up on PR48517, fix handling of template arguments that refer
> to dependent declarations.
>
> Treat an id-expression that names a local variable in a templated
> function as being instantiation-dependent.
>
> This addresses a language defect whereby a reference to a dependent
> declaration can be formed without any construct being value-dependent.
> Fixing that through value-dependence turns out to be problematic, so
> instead this patch takes the approach (proposed on the core reflector)
> of allowing the use of pointers or references to (but not values of)
> dependent declarations inside value-dependent expressions, and instead
> treating template arguments as dependent if they evaluate to a constant
> involving such dependent declarations.
>
> This ends up affecting a bunch of OpenMP tests, due to OpenMP
> imprecisely handling instantiation-dependent constructs, bailing out
> early instead of processing dependent constructs to the extent possible
> when handling the template.
>
> Previously committed as 8c1f2d15b826591cdf6bd6b468b8a7d23377b29e, and
> reverted because a dependency commit was reverted.
This reverts commit 5a391d38ac6c561ba908334d427f26124ed9132e.
It also restores clang/test/SemaCXX/coroutines.cpp to its state before
da986511fb9da1a46a0ca4dba2e49e2426036303.
Revert "[c++20] P1907R1: Support for generalized non-type template arguments of scalar type."
> Previously committed as 9e08e51a20d0d2b1c5724bb17e969d036fced4cd, and
> reverted because a dependency commit was reverted. This incorporates the
> following follow-on commits that were also reverted:
>
> 7e84aa1b81e72d44bcc58ffe1731bfc7abb73ce0 by Simon Pilgrim
> ed13d8c66781b50ff007cb089c5905f9bb9e8af2 by me
> 95c7b6cadbc9a3d4376ef44edbeb3c8bb5b8d7fc by Sam McCall
> 430d5d8429473c2b10b109991d7577a3cea41140 by Dave Zarzycki
This reverts commit 4b574008aef5a7235c1f894ab065fe300d26e786.
Revert "[msabi] Mangle a template argument referring to array-to-pointer decay"
> [msabi] Mangle a template argument referring to array-to-pointer decay
> applied to an array the same as the array itself.
>
> This follows MS ABI, and corrects a regression from the implementation
> of generalized non-type template parameters, where we "forgot" how to
> mangle this case.
This reverts commit 18e093faf726d15f210ab4917142beec51848258.
2021-01-20 22:25:33 +08:00
auto explicit_by_value_unused_decltype = [ i ] { decltype ( i ) j = 0 ; } ; // expected-warning{{lambda capture 'i' is not used}}
2018-07-17 21:17:01 +08:00
auto explicit_by_value_unused_const = [ k ] { return k + 1 ; } ; // expected-warning{{lambda capture 'k' is not required to be captured for this use}}
auto explicit_by_value_unused_const_generic = [ k ] ( auto c ) { return k + 1 ; } ; // expected-warning{{lambda capture 'k' is not required to be captured for this use}}
2017-01-13 23:01:06 +08:00
auto explicit_by_reference_used = [ & i ] { i + + ; } ;
auto explicit_by_reference_unused = [ & i ] { } ; // expected-warning{{lambda capture 'i' is not used}}
auto explicit_initialized_reference_used = [ & j = i ] { return j + 1 ; } ;
auto explicit_initialized_reference_unused = [ & j = i ] { } ; // expected-warning{{lambda capture 'j' is not used}}
auto explicit_initialized_value_used = [ j = 1 ] { return j + 1 ; } ;
auto explicit_initialized_value_unused = [ j = 1 ] { } ; // expected-warning{{lambda capture 'j' is not used}}
auto explicit_initialized_value_non_trivial_constructor = [ j = NonTrivialConstructor ( ) ] { } ;
auto explicit_initialized_value_non_trivial_destructor = [ j = NonTrivialDestructor ( ) ] { } ;
auto explicit_initialized_value_trivial_init = [ j = Trivial ( ) ] { } ; // expected-warning{{lambda capture 'j' is not used}}
auto explicit_initialized_value_non_trivial_init = [ j = Trivial ( 42 ) ] { } ;
auto explicit_initialized_value_with_side_effect = [ j = side_effect ( ) ] { } ;
2017-06-14 02:38:31 +08:00
auto explicit_initialized_value_generic_used = [ i = 1 ] ( auto c ) mutable { i + + ; } ;
auto explicit_initialized_value_generic_unused = [ i = 1 ] ( auto c ) mutable { } ; // expected-warning{{lambda capture 'i' is not used}}
2017-01-13 23:01:06 +08:00
auto nested = [ & i ] {
auto explicit_by_value_used = [ i ] { return i + 1 ; } ;
auto explicit_by_value_unused = [ i ] { } ; // expected-warning{{lambda capture 'i' is not used}}
} ;
2017-03-01 18:23:38 +08:00
Trivial trivial ;
auto explicit_by_value_trivial = [ trivial ] { } ; // expected-warning{{lambda capture 'trivial' is not used}}
NonTrivialConstructor cons ;
auto explicit_by_value_non_trivial_constructor = [ cons ] { } ; // expected-warning{{lambda capture 'cons' is not used}}
NonTrivialCopyConstructor copy_cons ;
auto explicit_by_value_non_trivial_copy_constructor = [ copy_cons ] { } ;
NonTrivialDestructor dest ;
auto explicit_by_value_non_trivial_destructor = [ dest ] { } ;
volatile int v ;
auto explicit_by_value_volatile = [ v ] { } ;
2017-01-13 23:01:06 +08:00
}
void test_use_template ( ) {
test_templated < int > ( ) ; // expected-note{{in instantiation of function template specialization 'test_templated<int>' requested here}}
}
2017-12-12 02:00:36 +08:00
namespace pr35555 {
int a ;
void b ( ) {
int c [ a ] ;
auto vla_used = [ & c ] { return c [ 0 ] ; } ;
auto vla_unused = [ & c ] { } ; // expected-warning{{lambda capture 'c' is not used}}
}
} // namespace pr35555