xref: /Universal-ctags/docs/parser-cxx.rst (revision 8a87cfff4050b199f0bf8803961fc79cdd22226b)
1eb892c4cSMasatake YAMATO.. _cxx:
2eb892c4cSMasatake YAMATO
3eb892c4cSMasatake YAMATO======================================================================
4eb892c4cSMasatake YAMATOThe new C/C++ parser
5eb892c4cSMasatake YAMATO======================================================================
6eb892c4cSMasatake YAMATO
7eb892c4cSMasatake YAMATO:Maintainer: Szymon Tomasz Stefanek <s.stefanek@gmail.com>
8eb892c4cSMasatake YAMATO
9eb892c4cSMasatake YAMATOIntroduction
10eb892c4cSMasatake YAMATO---------------------------------------------------------------------
11eb892c4cSMasatake YAMATO
12eb892c4cSMasatake YAMATOThe C++ language has strongly evolved since the old C/C++ parser was
13eb892c4cSMasatake YAMATOwritten. The old parser was struggling with some of the new features
14ef3f4dd3SDoug Kearnsof the language and has shown signs of reaching its limits. For this
15ef3f4dd3SDoug Kearnsreason in February/March 2016 the C/C++ parser was rewritten from
16ef3f4dd3SDoug Kearnsscratch.
17eb892c4cSMasatake YAMATO
18eb892c4cSMasatake YAMATOIn the first release several outstanding bugs were fixed and some new
19ef3f4dd3SDoug Kearnsfeatures were added. Among them:
20eb892c4cSMasatake YAMATO
21eb892c4cSMasatake YAMATO- Tagging of "using namespace" declarations
22eb892c4cSMasatake YAMATO- Tagging of function parameters
23eb892c4cSMasatake YAMATO- Extraction of function parameter types
24eb892c4cSMasatake YAMATO- Tagging of anonymous structures/unions/classes/enums
25eb892c4cSMasatake YAMATO- Support for C++11 lambdas (as anonymous functions)
26eb892c4cSMasatake YAMATO- Support for function-level scopes (for local variables and parameters)
27eb892c4cSMasatake YAMATO- Extraction of local variables which include calls to constructors
28eb892c4cSMasatake YAMATO- Extraction of local variables from within the for(), while(), if()
29eb892c4cSMasatake YAMATO  and switch() parentheses.
30ef3f4dd3SDoug Kearns- Support for function prototypes/declarations with trailing return type
31eb892c4cSMasatake YAMATO
32eb892c4cSMasatake YAMATOAt the time of writing (March 2016) more features are planned.
33eb892c4cSMasatake YAMATO
34c775c46fSSzymon Tomasz StefanekNotable New Features
35c775c46fSSzymon Tomasz Stefanek---------------------------------------------------------------------
36c775c46fSSzymon Tomasz Stefanek
37c775c46fSSzymon Tomasz StefanekSome of the notable new features are described below.
38c775c46fSSzymon Tomasz Stefanek
39c775c46fSSzymon Tomasz StefanekProperties
40c775c46fSSzymon Tomasz Stefanek^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41c775c46fSSzymon Tomasz Stefanek
42c775c46fSSzymon Tomasz StefanekSeveral properties of functions and variables can be extracted
43c775c46fSSzymon Tomasz Stefanekand placed in a new field called ``properties``.
44c775c46fSSzymon Tomasz StefanekThe syntax to enable it is:
45c775c46fSSzymon Tomasz Stefanek
469617a164SMasatake YAMATO.. code-block:: console
47c775c46fSSzymon Tomasz Stefanek
48c775c46fSSzymon Tomasz Stefanek	$ ctags ... --fields-c++=+{properties} ...
49c775c46fSSzymon Tomasz Stefanek
50c775c46fSSzymon Tomasz StefanekAt the time of writing the following properties are reported:
51c775c46fSSzymon Tomasz Stefanek
52c775c46fSSzymon Tomasz Stefanek- ``virtual``: a function is marked as virtual
53c775c46fSSzymon Tomasz Stefanek- ``static``: a function/variable is marked as static
54c775c46fSSzymon Tomasz Stefanek- ``inline``: a function implementation is marked as inline
55c775c46fSSzymon Tomasz Stefanek- ``explicit``: a function is marked as explicit
56c775c46fSSzymon Tomasz Stefanek- ``extern``: a function/variable is marked as extern
57c775c46fSSzymon Tomasz Stefanek- ``const``: a function is marked as const
58c775c46fSSzymon Tomasz Stefanek- ``pure``: a virtual function is pure (i.e = 0)
59c775c46fSSzymon Tomasz Stefanek- ``override``: a function is marked as override
60c775c46fSSzymon Tomasz Stefanek- ``default``: a function is marked as default
61c775c46fSSzymon Tomasz Stefanek- ``final``: a function is marked as final
62c775c46fSSzymon Tomasz Stefanek- ``delete``: a function is marked as delete
63c775c46fSSzymon Tomasz Stefanek- ``mutable``: a variable is marked as mutable
64c775c46fSSzymon Tomasz Stefanek- ``volatile``: a function is marked as volatile
65c775c46fSSzymon Tomasz Stefanek- ``specialization``: a function is a template specialization
66c775c46fSSzymon Tomasz Stefanek- ``scopespecialization``: template specialization of scope ``a<x>::b()``
67c775c46fSSzymon Tomasz Stefanek- ``deprecated``: a function is marked as deprecated via ``__attribute__``
68c775c46fSSzymon Tomasz Stefanek- ``scopedenum``: a scoped enumeration (C++11)
69c775c46fSSzymon Tomasz Stefanek
70c775c46fSSzymon Tomasz StefanekPreprocessor macros
71c775c46fSSzymon Tomasz Stefanek^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
72c775c46fSSzymon Tomasz Stefanek
73450c0ab4SMasatake YAMATODefining a macro from command line
74450c0ab4SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75450c0ab4SMasatake YAMATO
76c775c46fSSzymon Tomasz StefanekThe new parser supports the definition of real preprocessor macros
77c775c46fSSzymon Tomasz Stefanekvia the ``-D`` option. All types of macros are supported,
78c775c46fSSzymon Tomasz Stefanekincluding the ones with parameters and variable arguments.
79c775c46fSSzymon Tomasz StefanekStringification, token pasting and recursive macro expansion are also supported.
80c775c46fSSzymon Tomasz Stefanek
81c775c46fSSzymon Tomasz StefanekOption ``-I`` is now simply a backward-compatible syntax to define a
82c775c46fSSzymon Tomasz Stefanekmacro with no replacement.
83c775c46fSSzymon Tomasz Stefanek
84c775c46fSSzymon Tomasz StefanekThe syntax is similar to the corresponding gcc ``-D`` option.
85c775c46fSSzymon Tomasz Stefanek
86c775c46fSSzymon Tomasz StefanekSome examples follow.
87c775c46fSSzymon Tomasz Stefanek
88c775c46fSSzymon Tomasz Stefanek.. code-block:: console
89c775c46fSSzymon Tomasz Stefanek
90c775c46fSSzymon Tomasz Stefanek	$ ctags ... -D IGNORE_THIS ...
91c775c46fSSzymon Tomasz Stefanek
92c775c46fSSzymon Tomasz StefanekWith this commandline the following C/C++ input
93c775c46fSSzymon Tomasz Stefanek
94c775c46fSSzymon Tomasz Stefanek.. code-block:: C
95c775c46fSSzymon Tomasz Stefanek
96c775c46fSSzymon Tomasz Stefanek	int IGNORE_THIS a;
97c775c46fSSzymon Tomasz Stefanek
98c775c46fSSzymon Tomasz Stefanekwill be processed as if it was
99c775c46fSSzymon Tomasz Stefanek
100c775c46fSSzymon Tomasz Stefanek.. code-block:: C
101c775c46fSSzymon Tomasz Stefanek
102c775c46fSSzymon Tomasz Stefanek	int a;
103c775c46fSSzymon Tomasz Stefanek
104c775c46fSSzymon Tomasz StefanekDefining a macro with parameters uses the following syntax:
105c775c46fSSzymon Tomasz Stefanek
106c775c46fSSzymon Tomasz Stefanek.. code-block:: console
107c775c46fSSzymon Tomasz Stefanek
108c775c46fSSzymon Tomasz Stefanek	$ ctags ... -D "foreach(arg)=for(arg;;)" ...
109c775c46fSSzymon Tomasz Stefanek
110c775c46fSSzymon Tomasz StefanekThis example defines ``for(arg;;)`` as the replacement ``foreach(arg)``.
111c775c46fSSzymon Tomasz StefanekSo the following C/C++ input
112c775c46fSSzymon Tomasz Stefanek
113c775c46fSSzymon Tomasz Stefanek.. code-block:: C
114c775c46fSSzymon Tomasz Stefanek
115c775c46fSSzymon Tomasz Stefanek	foreach(char * p,pointers)
116c775c46fSSzymon Tomasz Stefanek	{
117c775c46fSSzymon Tomasz Stefanek
118c775c46fSSzymon Tomasz Stefanek	}
119c775c46fSSzymon Tomasz Stefanek
120c775c46fSSzymon Tomasz Stefanekis processed in new C/C++ parser as:
121c775c46fSSzymon Tomasz Stefanek
122c775c46fSSzymon Tomasz Stefanek.. code-block:: C
123c775c46fSSzymon Tomasz Stefanek
124c775c46fSSzymon Tomasz Stefanek	for(char * p;;)
125c775c46fSSzymon Tomasz Stefanek	{
126c775c46fSSzymon Tomasz Stefanek
127c775c46fSSzymon Tomasz Stefanek	}
128c775c46fSSzymon Tomasz Stefanek
129c775c46fSSzymon Tomasz Stefanekand the p local variable can be extracted.
130c775c46fSSzymon Tomasz Stefanek
131c775c46fSSzymon Tomasz StefanekThe previous commandline includes quotes since the macros generally contain
132c775c46fSSzymon Tomasz Stefanekcharacters that are treated specially by the shells. You may need some escaping.
133c775c46fSSzymon Tomasz Stefanek
134c775c46fSSzymon Tomasz StefanekToken pasting is performed by the ``##`` operator, just like in the normal
135c775c46fSSzymon Tomasz StefanekC preprocessor.
136c775c46fSSzymon Tomasz Stefanek
137c775c46fSSzymon Tomasz Stefanek.. code-block:: console
138c775c46fSSzymon Tomasz Stefanek
139c775c46fSSzymon Tomasz Stefanek	$ ctags ... -D "DECLARE_FUNCTION(prefix)=int prefix ## Call();"
140c775c46fSSzymon Tomasz Stefanek
141c775c46fSSzymon Tomasz StefanekSo the following code
142c775c46fSSzymon Tomasz Stefanek
143c775c46fSSzymon Tomasz Stefanek.. code-block:: C
144c775c46fSSzymon Tomasz Stefanek
145c775c46fSSzymon Tomasz Stefanek	DECLARE_FUNCTION(a)
146c775c46fSSzymon Tomasz Stefanek	DECLARE_FUNCTION(b)
147c775c46fSSzymon Tomasz Stefanek
148c775c46fSSzymon Tomasz Stefanekwill be processed as
149c775c46fSSzymon Tomasz Stefanek
150c775c46fSSzymon Tomasz Stefanek.. code-block:: C
151c775c46fSSzymon Tomasz Stefanek
152c775c46fSSzymon Tomasz Stefanek	int aCall();
153c775c46fSSzymon Tomasz Stefanek	int bCall();
154c775c46fSSzymon Tomasz Stefanek
155c775c46fSSzymon Tomasz StefanekMacros with variable arguments use the gcc ``__VA_ARGS__`` syntax.
156c775c46fSSzymon Tomasz Stefanek
157c775c46fSSzymon Tomasz Stefanek.. code-block:: console
158c775c46fSSzymon Tomasz Stefanek
159c775c46fSSzymon Tomasz Stefanek	$ ctags ... -D "DECLARE_FUNCTION(name,...)=int name(__VA_ARGS__);"
160c775c46fSSzymon Tomasz Stefanek
161c775c46fSSzymon Tomasz StefanekSo the following code
162c775c46fSSzymon Tomasz Stefanek
163c775c46fSSzymon Tomasz Stefanek.. code-block:: C
164c775c46fSSzymon Tomasz Stefanek
165c775c46fSSzymon Tomasz Stefanek	DECLARE_FUNCTION(x,int a,int b)
166c775c46fSSzymon Tomasz Stefanek
167c775c46fSSzymon Tomasz Stefanekwill be processed as
168c775c46fSSzymon Tomasz Stefanek
169c775c46fSSzymon Tomasz Stefanek.. code-block:: C
170c775c46fSSzymon Tomasz Stefanek
171c775c46fSSzymon Tomasz Stefanek	int x(int a,int b);
172c775c46fSSzymon Tomasz Stefanek
173124dad23SMasatake YAMATOAutomatically expanding macros defined in the same input file (HIGHLY EXPERIMENTAL)
174124dad23SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
175124dad23SMasatake YAMATO
176124dad23SMasatake YAMATOIf a CPreProcessor macro defined in a C/C++/CUDA file, the macro invocation in the
177124dad23SMasatake YAMATOSAME file can be expanded with following options:
178124dad23SMasatake YAMATO
179124dad23SMasatake YAMATO.. code-block:: text
180124dad23SMasatake YAMATO
181*8a87cfffSMasatake YAMATO   --param-CPreProcessor._expand=1
182124dad23SMasatake YAMATO   --fields-C=+{macrodef}
183124dad23SMasatake YAMATO   --fields-C++=+{macrodef}
184124dad23SMasatake YAMATO   --fields-CUDA=+{macrodef}
185124dad23SMasatake YAMATO   --fields=+{signature}
186124dad23SMasatake YAMATO
187124dad23SMasatake YAMATOLet's see an example.
188124dad23SMasatake YAMATO
189124dad23SMasatake YAMATOinput.c:
190124dad23SMasatake YAMATO.. code-block:: C
191124dad23SMasatake YAMATO
192124dad23SMasatake YAMATO	#define DEFUN(NAME) int NAME (int x, int y)
193124dad23SMasatake YAMATO	#define BEGIN {
194124dad23SMasatake YAMATO	#define END }
195124dad23SMasatake YAMATO
196124dad23SMasatake YAMATO	DEFUN(myfunc)
197124dad23SMasatake YAMATO	  BEGIN
198124dad23SMasatake YAMATO	  return -1
199124dad23SMasatake YAMATO	  END
200124dad23SMasatake YAMATO
201124dad23SMasatake YAMATOThe output without options:
202124dad23SMasatake YAMATO.. code-block::
203124dad23SMasatake YAMATO
204124dad23SMasatake YAMATO   $ ctags -o - input.c
205124dad23SMasatake YAMATO   BEGIN	input.c	/^#define BEGIN /;"	d	language:C	file:
206124dad23SMasatake YAMATO   DEFUN	input.c	/^#define DEFUN(/;"	d	language:C	file:
207124dad23SMasatake YAMATO   END	input.c	/^#define END /;"	d	language:C	file:
208124dad23SMasatake YAMATO
209124dad23SMasatake YAMATOThe output with options:
210124dad23SMasatake YAMATO.. code-block::
211124dad23SMasatake YAMATO
212*8a87cfffSMasatake YAMATO   $ ctags --param-CPreProcessor._expand=1 --fields-C=+'{macrodef}' --fields=+'{signature}' -o - input.c
213124dad23SMasatake YAMATO   BEGIN	input.c	/^#define BEGIN /;"	d	language:C	file:	macrodef:{
214124dad23SMasatake YAMATO   DEFUN	input.c	/^#define DEFUN(/;"	d	language:C	file:	signature:(NAME)	macrodef:int NAME (int x, int y)
215124dad23SMasatake YAMATO   END	input.c	/^#define END /;"	d	language:C	file:	macrodef:}
216124dad23SMasatake YAMATO   myfunc	input.c	/^DEFUN(myfunc)$/;"	f	language:C	typeref:typename:int	signature:(int x,int y)
217124dad23SMasatake YAMATO
218124dad23SMasatake YAMATO``myfunc`` coded by ``DEFUN`` macro is captured well.
219124dad23SMasatake YAMATO
220124dad23SMasatake YAMATO
221124dad23SMasatake YAMATOThis feature is highly experimental. At least three limitations are known.
222124dad23SMasatake YAMATO
223124dad23SMasatake YAMATO* This feature doesn't understand ``#undef`` yet.
224124dad23SMasatake YAMATO  Once a macro is defined, its invocation is always expanded even
225124dad23SMasatake YAMATO  after the parser sees ``#undef`` for the macro in the same input
226124dad23SMasatake YAMATO  file.
227124dad23SMasatake YAMATO
228124dad23SMasatake YAMATO* Macros are expanded incorrectly if the result of macro expansion
229124dad23SMasatake YAMATO  includes the macro invocation again.
230124dad23SMasatake YAMATO
231124dad23SMasatake YAMATO* Currently, ctags can expand a macro invocation only if its
232124dad23SMasatake YAMATO  definitions are in the same input file. ctags cannot expand a macro
233124dad23SMasatake YAMATO  defined in the header file included from the current input file.
234124dad23SMasatake YAMATO
235124dad23SMasatake YAMATOEnabling this macro expansion feature makes the parsing speed about
236124dad23SMasatake YAMATOtwo times slower.
237124dad23SMasatake YAMATO
238124dad23SMasatake YAMATO
239c775c46fSSzymon Tomasz StefanekIncompatible Changes
240c775c46fSSzymon Tomasz Stefanek---------------------------------------------------------------------
241c775c46fSSzymon Tomasz Stefanek
242eb892c4cSMasatake YAMATOThe parser is mostly compatible with the old one. There are some minor
243eb892c4cSMasatake YAMATOincompatible changes which are described below.
244eb892c4cSMasatake YAMATO
245eb892c4cSMasatake YAMATO
246c775c46fSSzymon Tomasz StefanekAnonymous structure names
247c775c46fSSzymon Tomasz Stefanek^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
248c775c46fSSzymon Tomasz Stefanek
249c775c46fSSzymon Tomasz StefanekThe old parser produced structure names in the form ``__anonN`` where N
250eb892c4cSMasatake YAMATOwas a number starting at 1 in each file and increasing at each new
251eb892c4cSMasatake YAMATOstructure. This caused collisions in symbol names when ctags was run
252eb892c4cSMasatake YAMATOon multiple files.
253eb892c4cSMasatake YAMATO
254eb892c4cSMasatake YAMATOIn the new parser the anonymous structure names depend on the file name
255eb892c4cSMasatake YAMATObeing processed and on the type of the structure itself. Collisions are
256eb892c4cSMasatake YAMATOfar less likely (though not impossible as hash functions are unavoidably
257eb892c4cSMasatake YAMATOimperfect).
258eb892c4cSMasatake YAMATO
259eb892c4cSMasatake YAMATOPitfall: the file name used for hashing includes the path as passed to the
260eb892c4cSMasatake YAMATOctags executable. So the same file "seen" from different paths will produce
261eb892c4cSMasatake YAMATOdifferent structure names. This is unavoidable and is up to the user to
262eb892c4cSMasatake YAMATOensure that multiple ctags runs are started from a common directory root.
263eb892c4cSMasatake YAMATO
264eb892c4cSMasatake YAMATOFile scope
265c775c46fSSzymon Tomasz Stefanek^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
266eb892c4cSMasatake YAMATO
267eb892c4cSMasatake YAMATOThe file scope information is not 100% reliable. It never was.
268eb892c4cSMasatake YAMATOThere are several cases in that compiler, linker or even source code
269eb892c4cSMasatake YAMATOtricks can "unhide" file scope symbols (for instance \*.c files can be
270eb892c4cSMasatake YAMATOincluded into each other) and several other cases in that the limitation
271eb892c4cSMasatake YAMATOof the scope of a symbol to a single file simply cannot be determined
272eb892c4cSMasatake YAMATOwith a single pass or without looking at a program as a whole.
273eb892c4cSMasatake YAMATO
274eb892c4cSMasatake YAMATOThe new parser defines a simple policy for file scope association
275ef3f4dd3SDoug Kearnsthat tries to be as compatible as possible with the old parser and
276ef3f4dd3SDoug Kearnsshould reflect the most common usages. The policy is the following:
277eb892c4cSMasatake YAMATO
278eb892c4cSMasatake YAMATO- Namespaces are in file scope if declared inside a .c or .cpp file
279eb892c4cSMasatake YAMATO
280eb892c4cSMasatake YAMATO- Function prototypes are in file scope if declared inside a .c or .cpp file
281eb892c4cSMasatake YAMATO
282eb892c4cSMasatake YAMATO- K&R style function definitions are in file scope if declared static
283eb892c4cSMasatake YAMATO  inside a .c file.
284eb892c4cSMasatake YAMATO
285eb892c4cSMasatake YAMATO- Function definitions appearing inside a namespace are in file scope only
286eb892c4cSMasatake YAMATO  if declared static inside a .c or .cpp file.
287eb892c4cSMasatake YAMATO  Note that this rule includes both global functions (global namespace)
288eb892c4cSMasatake YAMATO  and class/struct/union members defined outside of the class/struct/union
289eb892c4cSMasatake YAMATO  declaration.
290eb892c4cSMasatake YAMATO
291eb892c4cSMasatake YAMATO- Function definitions appearing inside a class/struct/union declaration
292eb892c4cSMasatake YAMATO  are in file scope only if declared static inside a .cpp file
293eb892c4cSMasatake YAMATO
294eb892c4cSMasatake YAMATO- Function parameters are always in file scope
295eb892c4cSMasatake YAMATO
296eb892c4cSMasatake YAMATO- Local variables are always in file scope
297eb892c4cSMasatake YAMATO
298eb892c4cSMasatake YAMATO- Variables appearing inside a namespace are in file scope only if
299eb892c4cSMasatake YAMATO  they are declared static inside a .c or .cpp file
300eb892c4cSMasatake YAMATO
301eb892c4cSMasatake YAMATO- Variables that are members of a class/struct/union are in file scope
302eb892c4cSMasatake YAMATO  only if declared in a .c or .cpp file
303eb892c4cSMasatake YAMATO
304eb892c4cSMasatake YAMATO- Typedefs are in file scope if appearing inside a .c or .cpp file
305eb892c4cSMasatake YAMATO
306eb892c4cSMasatake YAMATOMost of these rules are debatable in one way or the other. Just keep in mind
307c775c46fSSzymon Tomasz Stefanekthat this is not 100% reliable.
308eb892c4cSMasatake YAMATO
309eb892c4cSMasatake YAMATOInheritance information
310c775c46fSSzymon Tomasz Stefanek^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
311eb892c4cSMasatake YAMATO
312eb892c4cSMasatake YAMATOThe new parser does not strip template names from base classes.
313eb892c4cSMasatake YAMATOFor a declaration like
314eb892c4cSMasatake YAMATO
315c775c46fSSzymon Tomasz Stefanek.. code-block:: C
316c775c46fSSzymon Tomasz Stefanek
317eb892c4cSMasatake YAMATO	template<typename A> class B : public C<A>
318eb892c4cSMasatake YAMATO
319c775c46fSSzymon Tomasz Stefanekthe old parser reported ``C`` as base class while the new one reports
320c775c46fSSzymon Tomasz Stefanek``C<A>``.
321eb892c4cSMasatake YAMATO
322eb892c4cSMasatake YAMATOTyperef
323c775c46fSSzymon Tomasz Stefanek^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
324eb892c4cSMasatake YAMATO
325c775c46fSSzymon Tomasz StefanekThe syntax of the typeref field (``typeref:A:B``) was designed with only
326c775c46fSSzymon Tomasz Stefanekstruct/class/union/enum types in mind. Generic types don't have ``A``
327eb892c4cSMasatake YAMATOinformation and the keywords became entirely optional in C++:
328eb892c4cSMasatake YAMATOyou just can't tell. Furthermore, struct/class/union/enum types
329c775c46fSSzymon Tomasz Stefanekshare the same namespace and their names can't collide, so the ``A``
330eb892c4cSMasatake YAMATOinformation is redundant for most purposes.
331eb892c4cSMasatake YAMATO
332ef3f4dd3SDoug KearnsTo accommodate generic types and preserve some degree of backward
333eb892c4cSMasatake YAMATOcompatibility the new parser uses struct/class/union/enum in place
334c775c46fSSzymon Tomasz Stefanekof ``A`` where such keyword can be inferred. Where the information is
335eb892c4cSMasatake YAMATOnot available it uses the 'typename' keyword.
336eb892c4cSMasatake YAMATO
337c775c46fSSzymon Tomasz StefanekGenerally, you should ignore the information in field ``A`` and use
338c775c46fSSzymon Tomasz Stefanekonly information in field ``B``.
339