1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #define DEFINE_TYPE_CASTS(thisType, argumentType, argumentName, predicate) \
6 inline thisType* To##thisType(argumentType* argumentName) { \
7 if (!predicate) \
8 asm("int 3"); \
9 return static_cast<thisType*>(argumentName); \
10 } \
11 inline long long ToInt(argumentType* argumentName) { \
12 return reinterpret_cast<long long>(argumentName); \
13 }
14
15 #define LIKELY(x) x
16
17 namespace blink {
18
19 struct Base {};
20 struct Derived : public Base {};
21
22 DEFINE_TYPE_CASTS(Derived, Base, the_object, true);
23
F()24 void F() {
25 Base* base_ptr = new Derived;
26 Derived* derived_ptr = ToDerived(base_ptr);
27 long long as_int = ToInt(base_ptr);
28 // 'derivedPtr' should be renamed: it's a reference to a declaration defined
29 // outside a macro invocation.
30 if (LIKELY(derived_ptr)) {
31 delete derived_ptr;
32 }
33 }
34
35 #define CALL_METHOD_FROM_MACRO() \
36 void CallMethodFromMacro() { Method(); } \
37 void Pmethod() override {}
38
39 struct WithMacroP {
Pmethodblink::WithMacroP40 virtual void Pmethod() {}
41 };
42
43 struct WithMacro : public WithMacroP {
Methodblink::WithMacro44 void Method() {}
45 CALL_METHOD_FROM_MACRO();
46 };
47
48 #define DEFINE_WITH_TOKEN_CONCATENATION2(arg1, arg2) \
49 void arg1##arg2() {}
50 // We definitely don't want to rewrite |arg1| on the previous line into
51 // either |Arg1| or |Frg1| or |Brg1| or |Foo| or |Baz|.
52
53 // We might or might not want to rewrite |foo|->|Foo| and |baz|->|Baz| below.
54 // The test below just spells out the current behavior of the tool (which one
55 // can argue is accidental).
DEFINE_WITH_TOKEN_CONCATENATION2(foo,Bar1)56 DEFINE_WITH_TOKEN_CONCATENATION2(foo, Bar1)
57 DEFINE_WITH_TOKEN_CONCATENATION2(baz, Bar2)
58
59 void TokenConcatenationTest2() {
60 // We might or might not want to rewrite |foo|->|Foo| and |baz|->|Baz| below.
61 // The test below just spells out the current behavior of the tool (which one
62 // can argue is accidental).
63 fooBar1();
64 bazBar2();
65 }
66
67 class FieldsMacro {
68 public:
69 // We shouldn't rewrite |m_fooBar| -> |foo_bar_|, because we cannot rewrite
70 // |m_##name| -> |???|.
FieldsMacro()71 FieldsMacro() : m_fooBar(123), m_barBaz(456) {}
72
73 #define DECLARE_FIELD(name, Name) \
74 private: \
75 int m_##name; \
76 \
77 public: \
78 int name() { return m_##name; } \
79 void Set##Name(int name) { m_##name = name; }
80
81 DECLARE_FIELD(FooBar, FooBar)
82 DECLARE_FIELD(BarBaz, BarBaz)
83 };
84
FieldsMacroTest()85 int FieldsMacroTest() {
86 FieldsMacro fm;
87 fm.SetFooBar(789);
88 return fm.FooBar() + fm.BarBaz();
89 }
90
91 } // namespace blink
92