| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507 |
- // RUN: %clang_cc1 -std=c++11 -triple x86_64-linux-gnu -fms-extensions -ast-dump -ast-dump-filter Test %s | FileCheck -check-prefix CHECK -strict-whitespace %s
- class testEnumDecl {
- enum class TestEnumDeclScoped;
- enum TestEnumDeclFixed : int;
- };
- // CHECK: EnumDecl{{.*}} class TestEnumDeclScoped 'int'
- // CHECK: EnumDecl{{.*}} TestEnumDeclFixed 'int'
- class testFieldDecl {
- int TestFieldDeclInit = 0;
- };
- // CHECK: FieldDecl{{.*}} TestFieldDeclInit 'int'
- // CHECK-NEXT: IntegerLiteral
- namespace testVarDeclNRVO {
- class A { };
- A foo() {
- A TestVarDeclNRVO;
- return TestVarDeclNRVO;
- }
- }
- // CHECK: VarDecl{{.*}} TestVarDeclNRVO 'class testVarDeclNRVO::A' nrvo
- void testParmVarDeclInit(int TestParmVarDeclInit = 0);
- // CHECK: ParmVarDecl{{.*}} TestParmVarDeclInit 'int'
- // CHECK-NEXT: IntegerLiteral{{.*}}
- namespace TestNamespaceDecl {
- int i;
- }
- // CHECK: NamespaceDecl{{.*}} TestNamespaceDecl
- // CHECK-NEXT: VarDecl
- namespace TestNamespaceDecl {
- int j;
- }
- // CHECK: NamespaceDecl{{.*}} TestNamespaceDecl
- // CHECK-NEXT: original Namespace
- // CHECK-NEXT: VarDecl
- inline namespace TestNamespaceDeclInline {
- }
- // CHECK: NamespaceDecl{{.*}} TestNamespaceDeclInline inline
- namespace testUsingDirectiveDecl {
- namespace A {
- }
- }
- namespace TestUsingDirectiveDecl {
- using namespace testUsingDirectiveDecl::A;
- }
- // CHECK: NamespaceDecl{{.*}} TestUsingDirectiveDecl
- // CHECK-NEXT: UsingDirectiveDecl{{.*}} Namespace{{.*}} 'A'
- namespace testNamespaceAlias {
- namespace A {
- }
- }
- namespace TestNamespaceAlias = testNamespaceAlias::A;
- // CHECK: NamespaceAliasDecl{{.*}} TestNamespaceAlias
- // CHECK-NEXT: Namespace{{.*}} 'A'
- using TestTypeAliasDecl = int;
- // CHECK: TypeAliasDecl{{.*}} TestTypeAliasDecl 'int'
- namespace testTypeAliasTemplateDecl {
- template<typename T> class A;
- template<typename T> using TestTypeAliasTemplateDecl = A<T>;
- }
- // CHECK: TypeAliasTemplateDecl{{.*}} TestTypeAliasTemplateDecl
- // CHECK-NEXT: TemplateTypeParmDecl
- // CHECK-NEXT: TypeAliasDecl{{.*}} TestTypeAliasTemplateDecl 'A<T>'
- namespace testCXXRecordDecl {
- class A { };
- class B { };
- class TestCXXRecordDecl : virtual A, public B {
- int i;
- };
- }
- // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDecl
- // CHECK-NEXT: virtual private 'class testCXXRecordDecl::A'
- // CHECK-NEXT: public 'class testCXXRecordDecl::B'
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestCXXRecordDecl
- // CHECK-NEXT: FieldDecl
- template<class...T>
- class TestCXXRecordDeclPack : public T... {
- };
- // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDeclPack
- // CHECK-NEXT: public 'T'...
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestCXXRecordDeclPack
- thread_local int TestThreadLocalInt;
- // CHECK: TestThreadLocalInt {{.*}} tls_dynamic
- __module_private__ class TestCXXRecordDeclPrivate;
- // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDeclPrivate __module_private__
- class testCXXMethodDecl {
- __module_private__ void TestCXXMethodDeclPrivate();
- virtual void TestCXXMethodDeclPure() = 0;
- void TestCXXMethodDeclDelete() = delete;
- void TestCXXMethodDeclThrow() throw();
- void TestCXXMethodDeclThrowType() throw(int);
- };
- // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclPrivate 'void (void)' __module_private__
- // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclPure 'void (void)' virtual pure
- // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclDelete 'void (void)' delete
- // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclThrow 'void (void) throw()'
- // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclThrowType 'void (void) throw(int)'
- namespace testCXXConstructorDecl {
- class A { };
- class TestCXXConstructorDecl : public A {
- int I;
- TestCXXConstructorDecl(A &a, int i) : A(a), I(i) { }
- TestCXXConstructorDecl(A &a) : TestCXXConstructorDecl(a, 0) { }
- };
- }
- // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}'
- // CHECK-NEXT: ParmVarDecl{{.*}} a
- // CHECK-NEXT: ParmVarDecl{{.*}} i
- // CHECK-NEXT: CXXCtorInitializer{{.*}}A
- // CHECK-NEXT: Expr
- // CHECK: CXXCtorInitializer{{.*}}I
- // CHECK-NEXT: Expr
- // CHECK: CompoundStmt
- // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}'
- // CHECK-NEXT: ParmVarDecl{{.*}} a
- // CHECK-NEXT: CXXCtorInitializer{{.*}}TestCXXConstructorDecl
- // CHECK-NEXT: CXXConstructExpr{{.*}}TestCXXConstructorDecl
- class TestCXXDestructorDecl {
- ~TestCXXDestructorDecl() { }
- };
- // CHECK: CXXDestructorDecl{{.*}} ~TestCXXDestructorDecl 'void (void) noexcept'
- // CHECK-NEXT: CompoundStmt
- // Test that the range of a defaulted members is computed correctly.
- class TestMemberRanges {
- public:
- TestMemberRanges() = default;
- TestMemberRanges(const TestMemberRanges &Other) = default;
- TestMemberRanges(TestMemberRanges &&Other) = default;
- ~TestMemberRanges() = default;
- TestMemberRanges &operator=(const TestMemberRanges &Other) = default;
- TestMemberRanges &operator=(TestMemberRanges &&Other) = default;
- };
- void SomeFunction() {
- TestMemberRanges A;
- TestMemberRanges B(A);
- B = A;
- A = static_cast<TestMemberRanges &&>(B);
- TestMemberRanges C(static_cast<TestMemberRanges &&>(A));
- }
- // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:30>
- // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:59>
- // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:54>
- // CHECK: CXXDestructorDecl{{.*}} <line:{{.*}}:3, col:31>
- // CHECK: CXXMethodDecl{{.*}} <line:{{.*}}:3, col:70>
- // CHECK: CXXMethodDecl{{.*}} <line:{{.*}}:3, col:65>
- class TestCXXConversionDecl {
- operator int() { return 0; }
- };
- // CHECK: CXXConversionDecl{{.*}} operator int 'int (void)'
- // CHECK-NEXT: CompoundStmt
- namespace TestStaticAssertDecl {
- static_assert(true, "msg");
- }
- // CHECK: NamespaceDecl{{.*}} TestStaticAssertDecl
- // CHECK-NEXT: StaticAssertDecl{{.*> .*$}}
- // CHECK-NEXT: CXXBoolLiteralExpr
- // CHECK-NEXT: StringLiteral
- namespace testFunctionTemplateDecl {
- class A { };
- class B { };
- class C { };
- class D { };
- template<typename T> void TestFunctionTemplate(T) { }
- // implicit instantiation
- void bar(A a) { TestFunctionTemplate(a); }
- // explicit specialization
- template<> void TestFunctionTemplate(B);
- // explicit instantiation declaration
- extern template void TestFunctionTemplate(C);
- // explicit instantiation definition
- template void TestFunctionTemplate(D);
- }
- // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
- // CHECK-NEXT: TemplateTypeParmDecl
- // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
- // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
- // CHECK-NEXT: CompoundStmt
- // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}A
- // CHECK-NEXT: TemplateArgument
- // CHECK-NEXT: ParmVarDecl
- // CHECK-NEXT: CompoundStmt
- // CHECK-NEXT: Function{{.*}} 'TestFunctionTemplate' {{.*}}B
- // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}C
- // CHECK-NEXT: TemplateArgument
- // CHECK-NEXT: ParmVarDecl
- // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}D
- // CHECK-NEXT: TemplateArgument
- // CHECK-NEXT: ParmVarDecl
- // CHECK-NEXT: CompoundStmt
- // CHECK: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}B
- // CHECK-NEXT: TemplateArgument
- // CHECK-NEXT: ParmVarDecl
- namespace testClassTemplateDecl {
- class A { };
- class B { };
- class C { };
- class D { };
- template<typename T> class TestClassTemplate {
- int i;
- };
- // implicit instantiation
- TestClassTemplate<A> a;
- // explicit specialization
- template<> class TestClassTemplate<B> {
- int j;
- };
- // explicit instantiation declaration
- extern template class TestClassTemplate<C>;
- // explicit instantiation definition
- template class TestClassTemplate<D>;
- // partial explicit specialization
- template<typename T1, typename T2> class TestClassTemplatePartial {
- int i;
- };
- template<typename T1> class TestClassTemplatePartial<T1, A> {
- int j;
- };
- }
- // CHECK: ClassTemplateDecl{{.*}} TestClassTemplate
- // CHECK-NEXT: TemplateTypeParmDecl
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: FieldDecl{{.*}} i
- // CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: TemplateArgument{{.*}}A
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: FieldDecl{{.*}} i
- // CHECK: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
- // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
- // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
- // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: TemplateArgument{{.*}}B
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: FieldDecl{{.*}} j
- // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: TemplateArgument{{.*}}C
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: FieldDecl{{.*}} i
- // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: TemplateArgument{{.*}}D
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: FieldDecl{{.*}} i
- // CHECK: ClassTemplatePartialSpecializationDecl{{.*}} class TestClassTemplatePartial
- // CHECK-NEXT: TemplateArgument
- // CHECK-NEXT: TemplateArgument{{.*}}A
- // CHECK-NEXT: TemplateTypeParmDecl
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplatePartial
- // CHECK-NEXT: FieldDecl{{.*}} j
- // PR15220 dump instantiation only once
- namespace testCanonicalTemplate {
- class A {};
- template<typename T> void TestFunctionTemplate(T);
- template<typename T> void TestFunctionTemplate(T);
- void bar(A a) { TestFunctionTemplate(a); }
- // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
- // CHECK-NEXT: TemplateTypeParmDecl
- // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
- // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
- // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}A
- // CHECK-NEXT: TemplateArgument
- // CHECK-NEXT: ParmVarDecl
- // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
- // CHECK-NEXT: TemplateTypeParmDecl
- // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
- // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
- // CHECK-NEXT: Function{{.*}} 'TestFunctionTemplate'
- // CHECK-NOT: TemplateArgument
- template<typename T1> class TestClassTemplate {
- template<typename T2> friend class TestClassTemplate;
- };
- TestClassTemplate<A> a;
- // CHECK: ClassTemplateDecl{{.*}} TestClassTemplate
- // CHECK-NEXT: TemplateTypeParmDecl
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: FriendDecl
- // CHECK-NEXT: ClassTemplateDecl{{.*}} TestClassTemplate
- // CHECK-NEXT: TemplateTypeParmDecl
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
- // CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
- // CHECK-NEXT: TemplateArgument{{.*}}A
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
- }
- template <class T>
- class TestClassScopeFunctionSpecialization {
- template<class U> void foo(U a) { }
- template<> void foo<int>(int a) { }
- };
- // CHECK: ClassScopeFunctionSpecializationDecl
- // CHECK-NEXT: CXXMethod{{.*}} 'foo' 'void (int)'
- // CHECK-NEXT: TemplateArgument{{.*}} 'int'
- namespace TestTemplateTypeParmDecl {
- template<typename ... T, class U = int> void foo();
- }
- // CHECK: NamespaceDecl{{.*}} TestTemplateTypeParmDecl
- // CHECK-NEXT: FunctionTemplateDecl
- // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename ... T
- // CHECK-NEXT: TemplateTypeParmDecl{{.*}} class U
- // CHECK-NEXT: TemplateArgument type 'int'
- namespace TestNonTypeTemplateParmDecl {
- template<int I = 1, int ... J> void foo();
- }
- // CHECK: NamespaceDecl{{.*}} TestNonTypeTemplateParmDecl
- // CHECK-NEXT: FunctionTemplateDecl
- // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' I
- // CHECK-NEXT: TemplateArgument expr
- // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
- // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' ... J
- namespace TestTemplateTemplateParmDecl {
- template<typename T> class A;
- template <template <typename> class T = A, template <typename> class ... U> void foo();
- }
- // CHECK: NamespaceDecl{{.*}} TestTemplateTemplateParmDecl
- // CHECK: FunctionTemplateDecl
- // CHECK-NEXT: TemplateTemplateParmDecl{{.*}} T
- // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename
- // CHECK-NEXT: TemplateArgument{{.*}} template A
- // CHECK-NEXT: TemplateTemplateParmDecl{{.*}} ... U
- // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename
- namespace TestTemplateArgument {
- template<typename> class A { };
- template<template<typename> class ...> class B { };
- int foo();
- template<typename> class testType { };
- template class testType<int>;
- // CHECK: ClassTemplateSpecializationDecl{{.*}} class testType
- // CHECK-NEXT: TemplateArgument{{.*}} type 'int'
- template<int fp(void)> class testDecl { };
- template class testDecl<foo>;
- // CHECK: ClassTemplateSpecializationDecl{{.*}} class testDecl
- // CHECK-NEXT: TemplateArgument{{.*}} decl
- // CHECK-NEXT: Function{{.*}}foo
- template class testDecl<nullptr>;
- // CHECK: ClassTemplateSpecializationDecl{{.*}} class testDecl
- // CHECK-NEXT: TemplateArgument{{.*}} nullptr
- template<int> class testIntegral { };
- template class testIntegral<1>;
- // CHECK: ClassTemplateSpecializationDecl{{.*}} class testIntegral
- // CHECK-NEXT: TemplateArgument{{.*}} integral 1
- template<template<typename> class> class testTemplate { };
- template class testTemplate<A>;
- // CHECK: ClassTemplateSpecializationDecl{{.*}} class testTemplate
- // CHECK-NEXT: TemplateArgument{{.*}} A
- template<template<typename> class ...T> class C {
- B<T...> testTemplateExpansion;
- };
- // FIXME: Need TemplateSpecializationType dumping to test TemplateExpansion.
- template<int, int = 0> class testExpr;
- template<int I> class testExpr<I> { };
- // CHECK: ClassTemplatePartialSpecializationDecl{{.*}} class testExpr
- // CHECK-NEXT: TemplateArgument{{.*}} expr
- // CHECK-NEXT: DeclRefExpr{{.*}}I
- template<int, int ...> class testPack { };
- template class testPack<0, 1, 2>;
- // CHECK: ClassTemplateSpecializationDecl{{.*}} class testPack
- // CHECK-NEXT: TemplateArgument{{.*}} integral 0
- // CHECK-NEXT: TemplateArgument{{.*}} pack
- // CHECK-NEXT: TemplateArgument{{.*}} integral 1
- // CHECK-NEXT: TemplateArgument{{.*}} integral 2
- }
- namespace testUsingDecl {
- int i;
- }
- namespace TestUsingDecl {
- using testUsingDecl::i;
- }
- // CHECK: NamespaceDecl{{.*}} TestUsingDecl
- // CHECK-NEXT: UsingDecl{{.*}} testUsingDecl::i
- // CHECK-NEXT: UsingShadowDecl{{.*}} Var{{.*}} 'i' 'int'
- namespace testUnresolvedUsing {
- class A { };
- template<class T> class B {
- public:
- A a;
- };
- template<class T> class TestUnresolvedUsing : public B<T> {
- using typename B<T>::a;
- using B<T>::a;
- };
- }
- // CHECK: CXXRecordDecl{{.*}} TestUnresolvedUsing
- // CHECK: UnresolvedUsingTypenameDecl{{.*}} B<T>::a
- // CHECK: UnresolvedUsingValueDecl{{.*}} B<T>::a
- namespace TestLinkageSpecDecl {
- extern "C" void test1();
- extern "C++" void test2();
- }
- // CHECK: NamespaceDecl{{.*}} TestLinkageSpecDecl
- // CHECK-NEXT: LinkageSpecDecl{{.*}} C
- // CHECK-NEXT: FunctionDecl
- // CHECK-NEXT: LinkageSpecDecl{{.*}} C++
- // CHECK-NEXT: FunctionDecl
- class TestAccessSpecDecl {
- public:
- private:
- protected:
- };
- // CHECK: CXXRecordDecl{{.*}} class TestAccessSpecDecl
- // CHECK-NEXT: CXXRecordDecl{{.*}} class TestAccessSpecDecl
- // CHECK-NEXT: AccessSpecDecl{{.*}} public
- // CHECK-NEXT: AccessSpecDecl{{.*}} private
- // CHECK-NEXT: AccessSpecDecl{{.*}} protected
- template<typename T> class TestFriendDecl {
- friend int foo();
- friend class A;
- friend T;
- };
- // CHECK: CXXRecord{{.*}} TestFriendDecl
- // CHECK-NEXT: CXXRecord{{.*}} TestFriendDecl
- // CHECK-NEXT: FriendDecl
- // CHECK-NEXT: FunctionDecl{{.*}} foo
- // CHECK-NEXT: FriendDecl{{.*}} 'class A':'class A'
- // CHECK-NEXT: FriendDecl{{.*}} 'T'
- namespace TestFileScopeAsmDecl {
- asm("ret");
- }
- // CHECK: NamespaceDecl{{.*}} TestFileScopeAsmDecl{{$}}
- // CHECK: FileScopeAsmDecl{{.*> .*$}}
- // CHECK-NEXT: StringLiteral
- namespace TestFriendDecl2 {
- void f();
- struct S {
- friend void f();
- };
- }
- // CHECK: NamespaceDecl [[TestFriendDecl2:0x.*]] <{{.*}}> {{.*}} TestFriendDecl2
- // CHECK: |-FunctionDecl [[TestFriendDecl2_f:0x.*]] <{{.*}}> {{.*}} f 'void (void)'
- // CHECK: `-CXXRecordDecl {{.*}} struct S
- // CHECK: |-CXXRecordDecl {{.*}} struct S
- // CHECK: `-FriendDecl
- // CHECK: `-FunctionDecl {{.*}} parent [[TestFriendDecl2]] prev [[TestFriendDecl2_f]] <{{.*}}> {{.*}} f 'void (void)'
- namespace Comment {
- extern int Test;
- /// Something here.
- extern int Test;
- extern int Test;
- }
- // CHECK: VarDecl {{.*}} Test 'int' extern
- // CHECK-NOT: FullComment
- // CHECK: VarDecl {{.*}} Test 'int' extern
- // CHECK: `-FullComment
- // CHECK: `-ParagraphComment
- // CHECK: `-TextComment
- // CHECK: VarDecl {{.*}} Test 'int' extern
- // CHECK-NOT: FullComment
|