]> git.ipfire.org Git - thirdparty/gcc.git/blob - libcody/CODING.md
Use OEP_DECL_NAME when comparing VLA bounds [PR101585].
[thirdparty/gcc.git] / libcody / CODING.md
1 # Coding standard
2
3 I guess I should document this, it might not be obvious.
4
5 libcody is implemented in C++11. Because it's used in compiler
6 development, we can't use the latest and greatest.
7
8 The formatting is close to GNU, but with a few differences.
9
10 ## Extensions to C++11
11
12 It uses __VA_OPT__ when available, falling back on GNU's variadic
13 macro `,#` extension. This is in the `Assert` macro, so one can have
14 multi-argument template instantiations there. Not that libcody does
15 that, but this is code I used elsewhere.
16
17 ## GNU
18
19 The underlying formatting is GNU style. Here are a few notes about
20 things that commonly catches programmers unfamiliar with it is:
21
22 * Spaces between binary operators. Particularly in a function call,
23 between the name and the open paren:
24
25 ```c++
26 Fn (a + b, ary[4], *ptr);
27 ```
28
29 In general GNU style uses a lot more whitespace than Clang-style.
30 We're not trying to cram as much code as possible onto a page!
31
32 * Scope braces are always on a line of their own, indented by 2
33 spaces, if they're a sub-statement of an `if`, `for` or whatever:
34
35 ```c++
36 if (bob)
37 {
38 Frob ();
39 Quux ();
40 }
41 ```
42
43 Conditions and loops containing a single statement should not use `{}`.
44 FWIW this was my personal indentation scheme, before I even met GNU code!
45
46 * The same is true for a function definition body, except the
47 indentation is zero:
48
49 ```c++
50 int Foo ()
51 noexcept // indented
52 {
53 return 0;
54 }
55 ```
56
57 * Initialization bracing is not like scope bracing. There tends to be
58 more flexibility.
59
60 * Break lines at 80 chars, this should be /before/ the operator, not after:
61
62 ```c++
63 a = (b
64 + c);
65 ptr
66 ->MemberFn (stuff);
67 Func
68 (arg);
69 ```
70
71 Thus you can tell what lines are continued from the previous by
72 looking at their start. Use parens to control indentation.
73
74 If you find yourself wanting to break a line at `.`, don't.
75 Refactor your code to avoid needing that.
76
77 * Template instantiations and C++ casts should have no space before the `<`:
78
79 ```c++
80 std::vector<int> k;
81 static_cast<T> (arg); // space before the ( though
82 ```
83
84 * Pointer and reference types need a space before the `*` or `&`, if
85 the preceding token is ascii text (a cpp-identifier):
86
87 ```
88 int *ptr;
89 int **ptr_ptr;
90 int *&pref = ptr;
91 ```
92
93 See below a difference in qualifier placement.
94
95 * Code should compile without warnings.
96
97 ## Not GNU
98
99 ### Names
100
101 Unlike GNU code, variants of Camel Case are used. use `PascalCase`
102 for function, type and global variable names. Use `dromedaryCase` for
103 member variables. Block-scope vars can be `dromedaryCase` or
104 `snake_case`, your choice.
105
106 ### Type qualifiers
107
108 Type qualifiers go after the thing they qualify. You have to do this
109 for pointers anyway, and read them inside-out, because, C Just being
110 consistent:
111
112 ```c++
113 int const foo = 5; // constant int
114 int *const pfoo = nullptr; // constant pointer to int
115 ```