1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -verify %s
287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -verify -std=c++98 %s
387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -verify -std=c++11 %s
4cb8845f3e358b8583c41ba9bdb9165670900a8e2Daniel Dunbar
5cb8845f3e358b8583c41ba9bdb9165670900a8e2Daniel Dunbarclass A {
6cb8845f3e358b8583c41ba9bdb9165670900a8e2Daniel Dunbarpublic:
7cb8845f3e358b8583c41ba9bdb9165670900a8e2Daniel Dunbar  explicit A();
8cb8845f3e358b8583c41ba9bdb9165670900a8e2Daniel Dunbar
987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  explicit operator int();
1087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus <= 199711L // C++03 or earlier modes
1187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // expected-warning@-2 {{explicit conversion functions are a C++11 extension}}
1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif
13cb8845f3e358b8583c41ba9bdb9165670900a8e2Daniel Dunbar
140757c8ccb79210ce1f22142851cdcbf6e42a71d6Anders Carlsson  explicit void f0(); // expected-error {{'explicit' can only be applied to a constructor or conversion function}}
150757c8ccb79210ce1f22142851cdcbf6e42a71d6Anders Carlsson
160757c8ccb79210ce1f22142851cdcbf6e42a71d6Anders Carlsson  operator bool();
17cb8845f3e358b8583c41ba9bdb9165670900a8e2Daniel Dunbar};
18cb8845f3e358b8583c41ba9bdb9165670900a8e2Daniel Dunbar
190757c8ccb79210ce1f22142851cdcbf6e42a71d6Anders Carlssonexplicit A::A() { } // expected-error {{'explicit' can only be specified inside the class definition}}
2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarexplicit A::operator bool() { return false; }
2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus <= 199711L // C++03 or earlier modes
2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-warning@-2 {{explicit conversion functions are a C++11 extension}}
2387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif
2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@-4 {{'explicit' can only be specified inside the class definition}}
256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass B {
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  friend explicit A::A(); // expected-error {{'explicit' is invalid in friend declarations}}
286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
29