1dc488935SVassil Vassilev // RUN: %clang_cc1 -fsyntax-only -verify -fincremental-extensions -std=c++20 %s 2dc488935SVassil Vassilev // RUN: %clang_cc1 -fsyntax-only -DMS -fms-extensions -verify -fincremental-extensions -std=c++20 %s 3dc488935SVassil Vassilev 4dc488935SVassil Vassilev extern "C" int printf(const char*,...); 5dc488935SVassil Vassilev 6dc488935SVassil Vassilev // Decls which are hard to disambiguate 7dc488935SVassil Vassilev 82c4620c1SVassil Vassilev // Templates tmplt(T &)92c4620c1SVassil Vassilevnamespace ns1 { template<typename T> void tmplt(T &) {}} 102c4620c1SVassil Vassilev int arg_tmplt = 12; ns1::tmplt(arg_tmplt); 112c4620c1SVassil Vassilev 12da555f75SJonas Hahnfeld namespace ns2 { template <typename T> struct S {}; } 13da555f75SJonas Hahnfeld namespace ns3 { struct A { public: using S = int; }; } 14da555f75SJonas Hahnfeld namespace ns3 { A::S f(A::S a); } 15da555f75SJonas Hahnfeld 16dc488935SVassil Vassilev // ParseStatementOrDeclaration returns multiple statements. 17dc488935SVassil Vassilev #ifdef MS 18dc488935SVassil Vassilev int g_bFlag = 1; __if_exists(::g_bFlag)19dc488935SVassil Vassilev__if_exists(::g_bFlag) { 20dc488935SVassil Vassilev printf("Entering __if_exists\n"); 21dc488935SVassil Vassilev printf("g_bFlag = %d\n", g_bFlag); 22dc488935SVassil Vassilev } 23dc488935SVassil Vassilev #endif // MS 24dc488935SVassil Vassilev 25dc488935SVassil Vassilev // Operators. 26dc488935SVassil Vassilev struct S1 { operator int(); }; operator int()27dc488935SVassil VassilevS1::operator int() { return 0; } 28dc488935SVassil Vassilev 29dc488935SVassil Vassilev // Dtors 30dc488935SVassil Vassilev using I = int; 31dc488935SVassil Vassilev I x = 10; 32dc488935SVassil Vassilev x.I::~I(); 33dc488935SVassil Vassilev x = 20; 34dc488935SVassil Vassilev 355a9abe84SVassil Vassilev struct Dtor1 {~Dtor1();}; ~Dtor1()365a9abe84SVassil VassilevDtor1::~Dtor1() { printf("Dtor1\n"); } 375a9abe84SVassil Vassilev Dtor1 d1; 385a9abe84SVassil Vassilev 39ba475a4aSJonas Hahnfeld struct Dtor2 { ~Dtor2(); }; ~Dtor2()40ba475a4aSJonas Hahnfeld::Dtor2::~Dtor2() { printf("Dtor2\n"); } 41ba475a4aSJonas Hahnfeld Dtor2 d2; 42ba475a4aSJonas Hahnfeld 4387ae7469SVassil Vassilev struct ANestedDtor { struct A1 { struct A2 { ~A2(); }; }; }; ~A2()4487ae7469SVassil VassilevANestedDtor::A1::A2::~A2() { printf("Dtor A::A1::A2::~A2\n"); } 4587ae7469SVassil Vassilev 46dc488935SVassil Vassilev // Ctors 47dc488935SVassil Vassilev 486c274ba4SJonas Hahnfeld // Private typedefs / using declarations 496c274ba4SJonas Hahnfeld class PrivateUsingMember { using T = int; T f(); }; f()506c274ba4SJonas HahnfeldPrivateUsingMember::T PrivateUsingMember::f() { return 0; } 516c274ba4SJonas Hahnfeld 526c274ba4SJonas Hahnfeld class PrivateUsingVar { using T = int; static T i; }; 536c274ba4SJonas Hahnfeld PrivateUsingVar::T PrivateUsingVar::i = 42; 546c274ba4SJonas Hahnfeld 556c274ba4SJonas Hahnfeld // The same with namespaces 566c274ba4SJonas Hahnfeld namespace PrivateUsingNamespace { class Member { using T = int; T f(); }; } f()576c274ba4SJonas HahnfeldPrivateUsingNamespace::Member::T PrivateUsingNamespace::Member::f() { return 0; } 586c274ba4SJonas Hahnfeld 596c274ba4SJonas Hahnfeld namespace PrivateUsingNamespace { class Var { using T = int; static T i; }; } 606c274ba4SJonas Hahnfeld PrivateUsingNamespace::Var::T PrivateUsingNamespace::Var::i = 42; 616c274ba4SJonas Hahnfeld 626c274ba4SJonas Hahnfeld // The same with friend declarations 636c274ba4SJonas Hahnfeld class PrivateUsingFriendMember; 646c274ba4SJonas Hahnfeld class PrivateUsingFriendVar; 656c274ba4SJonas Hahnfeld class PrivateUsingFriend { friend class PrivateUsingFriendMember; friend class PrivateUsingFriendVar; using T = int; }; 666c274ba4SJonas Hahnfeld class PrivateUsingFriendMember { PrivateUsingFriend::T f(); }; f()676c274ba4SJonas HahnfeldPrivateUsingFriend::T PrivateUsingFriendMember::f() { return 0; } 686c274ba4SJonas Hahnfeld 696c274ba4SJonas Hahnfeld class PrivateUsingFriendVar { static PrivateUsingFriend::T i; }; 706c274ba4SJonas Hahnfeld PrivateUsingFriend::T PrivateUsingFriendVar::i = 42; 716c274ba4SJonas Hahnfeld 726c274ba4SJonas Hahnfeld // The following should still diagnose (inspired by PR13642) 736c274ba4SJonas Hahnfeld // FIXME: Should not be diagnosed twice! 746c274ba4SJonas Hahnfeld class PR13642 { class Inner { public: static int i; }; }; 756c274ba4SJonas Hahnfeld // expected-note@-1 2 {{implicitly declared private here}} 766c274ba4SJonas Hahnfeld PR13642::Inner::i = 5; 776c274ba4SJonas Hahnfeld // expected-error@-1 2 {{'Inner' is a private member of 'PR13642'}} 786c274ba4SJonas Hahnfeld 79dc488935SVassil Vassilev // Deduction guide 80dc488935SVassil Vassilev template<typename T> struct A { A(); A(T); }; 81dc488935SVassil Vassilev A() -> A<int>; 82dc488935SVassil Vassilev 83dc488935SVassil Vassilev struct S2 { S2(); }; 84dc488935SVassil Vassilev S2::S2() = default; 85dc488935SVassil Vassilev 86dc488935SVassil Vassilev namespace N { struct S { S(); }; } S()87dc488935SVassil VassilevN::S::S() { printf("N::S::S()\n"); } 88dc488935SVassil Vassilev N::S s; 89dc488935SVassil Vassilev 90dc488935SVassil Vassilev namespace Ns {namespace Ns { void Ns(); void Fs();}} Ns()91dc488935SVassil Vassilevvoid Ns::Ns::Ns() { printf("void Ns::Ns::Ns()\n"); } Fs()92dc488935SVassil Vassilevvoid Ns::Ns::Fs() {} 93dc488935SVassil Vassilev 94dc488935SVassil Vassilev Ns::Ns::Fs(); 95dc488935SVassil Vassilev Ns::Ns::Ns(); 96dc488935SVassil Vassilev 97dc488935SVassil Vassilev struct Attrs1 { Attrs1(); }; 98*818de32fSkelbon Attrs1::Attrs1() __attribute((noreturn)) = default; 99dc488935SVassil Vassilev 100dc488935SVassil Vassilev struct Attrs2 { Attrs2(); }; 101*818de32fSkelbon __attribute((noreturn)) Attrs2::Attrs2() = default; 102dc488935SVassil Vassilev 103dc488935SVassil Vassilev // Extra semicolon 104dc488935SVassil Vassilev namespace N {}; 105