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