19109bf10d50d3b5aa57205db1b8e38a31e3ae477Richard Smith// RUN: %clang_cc1 -std=c++98 %s -Wdeprecated -verify -triple x86_64-linux-gnu 29109bf10d50d3b5aa57205db1b8e38a31e3ae477Richard Smith// RUN: %clang_cc1 -std=c++11 %s -Wdeprecated -verify -triple x86_64-linux-gnu 39109bf10d50d3b5aa57205db1b8e38a31e3ae477Richard Smith// RUN: %clang_cc1 -std=c++1y %s -Wdeprecated -verify -triple x86_64-linux-gnu 487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -std=c++1z %s -Wdeprecated -verify -triple x86_64-linux-gnu 579f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith 69109bf10d50d3b5aa57205db1b8e38a31e3ae477Richard Smith// RUN: %clang_cc1 -std=c++1y %s -Wdeprecated -verify -triple x86_64-linux-gnu -Wno-deprecated-register -DNO_DEPRECATED_FLAGS 758df0426944c1bf8a80b6935bbea3815fc506474Richard Smith 86b759f4d3c8bce0fe1f416953ef790c68e7c30b2Richard Smith#include "Inputs/register.h" 96b759f4d3c8bce0fe1f416953ef790c68e7c30b2Richard Smith 1079f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smithvoid f() throw(); 1179f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smithvoid g() throw(int); 1279f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smithvoid h() throw(...); 1379f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith#if __cplusplus >= 201103L 1479f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith// expected-warning@-4 {{dynamic exception specifications are deprecated}} expected-note@-4 {{use 'noexcept' instead}} 1579f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith// expected-warning@-4 {{dynamic exception specifications are deprecated}} expected-note@-4 {{use 'noexcept(false)' instead}} 1679f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith// expected-warning@-4 {{dynamic exception specifications are deprecated}} expected-note@-4 {{use 'noexcept(false)' instead}} 1779f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith#endif 1879f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith 1979f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smithvoid stuff() { 2079f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith register int n; 2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus > 201402L 2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-error@-2 {{ISO C++1z does not allow 'register' storage class specifier}} 2387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#elif __cplusplus >= 201103L && !defined(NO_DEPRECATED_FLAGS) 2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-4 {{'register' storage class specifier is deprecated}} 2579f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith#endif 2679f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith 279109bf10d50d3b5aa57205db1b8e38a31e3ae477Richard Smith register int m asm("rbx"); // no-warning 289109bf10d50d3b5aa57205db1b8e38a31e3ae477Richard Smith 296b759f4d3c8bce0fe1f416953ef790c68e7c30b2Richard Smith int k = to_int(n); // no-warning 3079f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith bool b; 3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ++b; 3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus > 201402L 3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-error@-2 {{ISO C++1z does not allow incrementing expression of type bool}} 3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#else 3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-4 {{incrementing expression of type bool is deprecated}} 3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif 3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar b++; 3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus > 201402L 4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-error@-2 {{ISO C++1z does not allow incrementing expression of type bool}} 4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#else 4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-4 {{incrementing expression of type bool is deprecated}} 4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif 4479f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines char *p = "foo"; 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}} 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning@-4 {{ISO C++11 does not allow conversion from string literal to 'char *'}} 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 5179f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith} 5279f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith 53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct S { int n; void operator+(int); }; 5479f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smithstruct T : private S { 551b2209fd149436c98e73d4b8667b40b5f4b974cdRichard Smith S::n; 561b2209fd149436c98e73d4b8667b40b5f4b974cdRichard Smith#if __cplusplus < 201103L 571b2209fd149436c98e73d4b8667b40b5f4b974cdRichard Smith // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 581b2209fd149436c98e73d4b8667b40b5f4b974cdRichard Smith#else 591b2209fd149436c98e73d4b8667b40b5f4b974cdRichard Smith // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 601b2209fd149436c98e73d4b8667b40b5f4b974cdRichard Smith#endif 61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S::operator+; 62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus < 201103L 63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // expected-warning@-2 {{access declarations are deprecated; use using declarations instead}} 64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#else 65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // expected-error@-4 {{ISO C++11 does not allow access declarations; use using declarations instead}} 66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif 6779f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith}; 6836155c14b691720ee3e94bfe99886229650bbfb5Richard Smith 6936155c14b691720ee3e94bfe99886229650bbfb5Richard Smith#if __cplusplus >= 201103L 7036155c14b691720ee3e94bfe99886229650bbfb5Richard Smithnamespace DeprecatedCopy { 7136155c14b691720ee3e94bfe99886229650bbfb5Richard Smith struct Assign { 7236155c14b691720ee3e94bfe99886229650bbfb5Richard Smith Assign &operator=(const Assign&); // expected-warning {{definition of implicit copy constructor for 'Assign' is deprecated because it has a user-declared copy assignment operator}} 7336155c14b691720ee3e94bfe99886229650bbfb5Richard Smith }; 746698be8a6930730df5e61c941197e72682196187Richard Smith Assign a1, a2(a1); // expected-note {{implicit copy constructor for 'Assign' first required here}} 7536155c14b691720ee3e94bfe99886229650bbfb5Richard Smith 7636155c14b691720ee3e94bfe99886229650bbfb5Richard Smith struct Ctor { 7736155c14b691720ee3e94bfe99886229650bbfb5Richard Smith Ctor(); 7836155c14b691720ee3e94bfe99886229650bbfb5Richard Smith Ctor(const Ctor&); // expected-warning {{definition of implicit copy assignment operator for 'Ctor' is deprecated because it has a user-declared copy constructor}} 7936155c14b691720ee3e94bfe99886229650bbfb5Richard Smith }; 8036155c14b691720ee3e94bfe99886229650bbfb5Richard Smith Ctor b1, b2; 816698be8a6930730df5e61c941197e72682196187Richard Smith void f() { b1 = b2; } // expected-note {{implicit copy assignment operator for 'Ctor' first required here}} 8236155c14b691720ee3e94bfe99886229650bbfb5Richard Smith 8336155c14b691720ee3e94bfe99886229650bbfb5Richard Smith struct Dtor { 8436155c14b691720ee3e94bfe99886229650bbfb5Richard Smith ~Dtor(); 8536155c14b691720ee3e94bfe99886229650bbfb5Richard Smith // expected-warning@-1 {{definition of implicit copy constructor for 'Dtor' is deprecated because it has a user-declared destructor}} 8636155c14b691720ee3e94bfe99886229650bbfb5Richard Smith // expected-warning@-2 {{definition of implicit copy assignment operator for 'Dtor' is deprecated because it has a user-declared destructor}} 8736155c14b691720ee3e94bfe99886229650bbfb5Richard Smith }; 886698be8a6930730df5e61c941197e72682196187Richard Smith Dtor c1, c2(c1); // expected-note {{implicit copy constructor for 'Dtor' first required here}} 896698be8a6930730df5e61c941197e72682196187Richard Smith void g() { c1 = c2; } // expected-note {{implicit copy assignment operator for 'Dtor' first required here}} 9036155c14b691720ee3e94bfe99886229650bbfb5Richard Smith} 9136155c14b691720ee3e94bfe99886229650bbfb5Richard Smith#endif 92