2019-05-14 20:09:55 +08:00
// RUN: %clang_cc1 -fsyntax-only -std=c2x -verify %s
2017-10-18 04:33:35 +08:00
struct [ [ nodiscard ] ] S1 { // ok
int i ;
} ;
struct [ [ nodiscard nodiscard ] ] S2 { // expected-error {{attribute 'nodiscard' cannot appear multiple times in an attribute specifier}}
int i ;
} ;
2019-07-20 15:56:34 +08:00
struct [ [ nodiscard ( " Wrong " ) ] ] S3 { // FIXME: may need an extension warning.
2017-10-18 04:33:35 +08:00
int i ;
} ;
2019-07-20 15:56:34 +08:00
struct S3 get_s3 ( void ) ;
2017-10-18 04:33:35 +08:00
[ [ nodiscard ] ] int f1 ( void ) ;
enum [ [ nodiscard ] ] E1 { One } ;
2017-11-27 04:01:12 +08:00
[ [ nodiscard ] ] int i ; // expected-warning {{'nodiscard' attribute only applies to Objective-C methods, enums, structs, unions, classes, functions, and function pointers}}
2017-10-18 04:33:35 +08:00
struct [ [ nodiscard ] ] S4 {
int i ;
} ;
struct S4 get_s ( void ) ;
enum [ [ nodiscard ] ] E2 { Two } ;
enum E2 get_e ( void ) ;
[ [ nodiscard ] ] int get_i ( ) ;
void f2 ( void ) {
get_s ( ) ; // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
2019-07-20 15:56:34 +08:00
get_s3 ( ) ; // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute: Wrong}}
2017-10-18 04:33:35 +08:00
get_i ( ) ; // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
get_e ( ) ; // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
// Okay, warnings are not encouraged
( void ) get_s ( ) ;
2019-07-20 15:56:34 +08:00
( void ) get_s3 ( ) ;
2017-10-18 04:33:35 +08:00
( void ) get_i ( ) ;
( void ) get_e ( ) ;
}
struct [ [ nodiscard ] ] error_info {
int i ;
} ;
struct error_info enable_missile_safety_mode ( void ) ;
void launch_missiles ( void ) ;
void test_missiles ( void ) {
enable_missile_safety_mode ( ) ; // expected-warning {{ignoring return value of function declared with 'nodiscard'}}
launch_missiles ( ) ;
}