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