blob: 35db82efaeecdee356a99ba9811c08ce72e1f1b3 [file] [log] [blame]
Sam Weinigce757a72010-01-16 21:21:01 +00001// Header for PCH test cxx_exprs.cpp
2
Chris Lattner14ab24f2010-05-09 06:03:39 +00003
Sam Weinigce757a72010-01-16 21:21:01 +00004// CXXStaticCastExpr
Sam Weinigeb7f9612010-02-07 06:32:43 +00005typedef __typeof__(static_cast<void *>(0)) static_cast_result;
Sam Weinigce757a72010-01-16 21:21:01 +00006
7// CXXDynamicCastExpr
Chris Lattner59218632010-05-10 01:22:27 +00008struct Base { Base(int); virtual void f(int x = 492); ~Base(); };
9struct Derived : Base { Derived(); void g(); };
Sam Weinigce757a72010-01-16 21:21:01 +000010Base *base_ptr;
Sam Weinigeb7f9612010-02-07 06:32:43 +000011typedef __typeof__(dynamic_cast<Derived *>(base_ptr)) dynamic_cast_result;
Sam Weinigce757a72010-01-16 21:21:01 +000012
13// CXXReinterpretCastExpr
Sam Weinigeb7f9612010-02-07 06:32:43 +000014typedef __typeof__(reinterpret_cast<void *>(0)) reinterpret_cast_result;
Sam Weinigce757a72010-01-16 21:21:01 +000015
16// CXXConstCastExpr
17const char *const_char_ptr_value;
Sam Weinigeb7f9612010-02-07 06:32:43 +000018typedef __typeof__(const_cast<char *>(const_char_ptr_value)) const_cast_result;
Sam Weinigce757a72010-01-16 21:21:01 +000019
20// CXXFunctionalCastExpr
21int int_value;
Sam Weinigeb7f9612010-02-07 06:32:43 +000022typedef __typeof__(double(int_value)) functional_cast_result;
23
24// CXXBoolLiteralExpr
25typedef __typeof__(true) bool_literal_result;
26const bool true_value = true;
27const bool false_value = false;
28
29// CXXNullPtrLiteralExpr
30typedef __typeof__(nullptr) cxx_null_ptr_result;
Chris Lattner1817bd42010-05-09 05:36:05 +000031
32void foo(Derived *P) {
33 // CXXMemberCallExpr
Chris Lattner030854b2010-05-09 06:40:08 +000034 P->f(12);
Chris Lattner14ab24f2010-05-09 06:03:39 +000035}
36
37
38// FIXME: This is a hack until <typeinfo> works completely.
39namespace std {
40 class type_info {};
41}
42
43// CXXTypeidExpr - Both expr and type forms.
44typedef __typeof__(typeid(int))* typeid_result1;
45typedef __typeof__(typeid(2))* typeid_result2;
Chris Lattner2fbdfcd2010-05-09 06:15:05 +000046
Chris Lattnerd2598362010-05-10 00:25:06 +000047Derived foo();
48
Chris Lattner59218632010-05-10 01:22:27 +000049Derived::Derived() : Base(4) {
50}
51
Chris Lattner2fbdfcd2010-05-09 06:15:05 +000052void Derived::g() {
53 // CXXThisExpr
Chris Lattner030854b2010-05-09 06:40:08 +000054 f(2); // Implicit
55 this->f(1); // Explicit
Chris Lattner2fbdfcd2010-05-09 06:15:05 +000056
57 // CXXThrowExpr
58 throw;
59 throw 42;
Chris Lattner030854b2010-05-09 06:40:08 +000060
61 // CXXDefaultArgExpr
62 f();
Chris Lattnerd2598362010-05-10 00:25:06 +000063
64 const Derived &X = foo();
65
Chris Lattner59218632010-05-10 01:22:27 +000066 // FIXME: How do I make a CXXBindReferenceExpr, CXXConstructExpr?
Chris Lattnerd2598362010-05-10 00:25:06 +000067
Chris Lattner59218632010-05-10 01:22:27 +000068 int A = int(0.5); // CXXFunctionalCastExpr
69 A = int(); // CXXZeroInitValueExpr
70
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +000071 Base *b = new Base(4); // CXXNewExpr
72 delete b; // CXXDeleteExpr
Chris Lattner59218632010-05-10 01:22:27 +000073}
74
75
76// FIXME: The comment on CXXTemporaryObjectExpr is broken, this doesn't make
77// one.
78struct CtorStruct { CtorStruct(int, float); };
79
80CtorStruct create_CtorStruct() {
81 return CtorStruct(1, 3.14f); // CXXTemporaryObjectExpr
82};
83
Eli Friedmanb3b6c222012-09-14 00:51:36 +000084// CharacterLiteral variants
85const char char_value = 'a';
86const wchar_t wchar_t_value = L'ı';
87const char16_t char16_t_value = u'ç';
88const char32_t char32_t_value = U'∂';