xref: /llvm-project/clang/test/Interpreter/disambiguate-decl-stmt.cpp (revision 818de32f31e8075657dd27938e4aeb1a46f3f631)
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 Vassilev namespace 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 Vassilev S1::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 Vassilev Dtor1::~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 Vassilev ANestedDtor::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 Hahnfeld PrivateUsingMember::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 Hahnfeld PrivateUsingNamespace::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 Hahnfeld PrivateUsingFriend::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 Vassilev N::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 Vassilev void Ns::Ns::Ns() { printf("void Ns::Ns::Ns()\n"); }
Fs()92dc488935SVassil Vassilev void 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