1// Copyright (c) 2012 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#ifndef INLINE_CTOR_H_
6#define INLINE_CTOR_H_
7
8#include <string>
9#include <vector>
10
11class InlineCtorsArentOKInHeader {
12 public:
13  InlineCtorsArentOKInHeader() {}
14  ~InlineCtorsArentOKInHeader() {}
15
16 private:
17  std::vector<int> one_;
18  std::vector<std::string> two_;
19};
20
21#define INLINE_CTORS_IN_A_MACRO(CLASS_NAME) \
22  class CLASS_NAME {                        \
23   public:                                  \
24    CLASS_NAME() {}                         \
25    ~CLASS_NAME() {}                        \
26                                            \
27   private:                                 \
28    std::vector<int> one_;                  \
29    std::vector<std::string> two_;          \
30  }
31INLINE_CTORS_IN_A_MACRO(InlineCtorsBehindAMacroArentOKInHeader);
32MACRO_FROM_CPP;
33
34class DeletedMembersInHeaderAreOKThough {
35 public:
36  DeletedMembersInHeaderAreOKThough() = delete;
37  ~DeletedMembersInHeaderAreOKThough() = delete;
38  DeletedMembersInHeaderAreOKThough(const DeletedMembersInHeaderAreOKThough&) =
39      delete;
40
41 private:
42  std::vector<int> one_;
43  std::vector<std::string> two_;
44};
45
46class ExplicitlyInlinedIsAlsoOK {
47  ExplicitlyInlinedIsAlsoOK();
48  ~ExplicitlyInlinedIsAlsoOK();
49  ExplicitlyInlinedIsAlsoOK(const ExplicitlyInlinedIsAlsoOK&);
50
51 private:
52  std::vector<int> one_;
53  std::vector<std::string> two_;
54};
55
56inline ExplicitlyInlinedIsAlsoOK::ExplicitlyInlinedIsAlsoOK() {
57}
58
59inline ExplicitlyInlinedIsAlsoOK::~ExplicitlyInlinedIsAlsoOK() {
60}
61
62inline ExplicitlyInlinedIsAlsoOK::ExplicitlyInlinedIsAlsoOK(
63    const ExplicitlyInlinedIsAlsoOK&) {
64}
65
66struct TrivialStruct {
67  int something_;
68};
69
70struct NonTrivialStruct {
71  NonTrivialStruct();
72  ~NonTrivialStruct();
73
74  int something_;
75};
76
77// Plugin doesn't warn about inlining trivial member dtor calls.
78struct FourTrivialMembers {
79  ~FourTrivialMembers();
80
81  TrivialStruct a;
82  TrivialStruct b;
83  TrivialStruct c;
84  TrivialStruct d;
85};
86
87// Plugin doesn't warn about inlining three ctor/dtor calls.
88struct ThreeNonTrivialMembers {
89  NonTrivialStruct a;
90  NonTrivialStruct b;
91  NonTrivialStruct c;
92};
93
94// Plugin does warn about inlining four ctor/dtor calls.
95struct FourNonTrivialMembers {
96  NonTrivialStruct a;
97  NonTrivialStruct b;
98  NonTrivialStruct c;
99  NonTrivialStruct d;
100};
101
102#endif  // INLINE_CTOR_H_
103