[cfe-dev] Criticism over a clang tool to reorder fields on constructor declarations

James Dennett james.dennett at gmail.com
Sun Aug 19 09:10:50 PDT 2012


On Sun, Aug 19, 2012 at 12:15 AM, Philip Craig <philipjcraig at gmail.com> wrote:
> On Sun, Aug 19, 2012 at 1:52 PM, Victor Vicente de Carvalho
> <victor.v.carvalho at gmail.com> wrote:
>> Hi Manuel,
>>
>> my rewrite basing only in source replacements is complete, but now I'm
>> facing some strange side effects on some files. Consider the example:
>>
>> header ----------
>>
>> #include <B.h> // B defines a simple class named B
>>
>> class A {
>> public:
>>   A();
>>
>>   float x;
>>   B b;
>> };
>>
>> source ---------------
>>
>> A::A() : x(0) {
>> }
>>
>>
>> the strange behavior that I'm having is that if in the header file "x" is
>> declared before "b", when processing the source location for the initializer
>> list on CXXConstructorDecl*, the source location for it get's completely
>> wrong pointing to right before the constructor name: "A::". If i declare "b"
>> before "x" then the source location points to "A::A() : " which was
>> expected. Also, the method getNumCtorInitializers on this declaration is
>> returning to me 2 ( should be 1 as only x is being initialized ), but if
>> decide to initialize b I'm __still__ getting 2. Also, node that the class
>> I'm parsing does not have a base class, and I'm providing the correct
>> includes as the tool run fine and exits returning 0. I'm a bit lost here,
>> any comments are welcome. I could upload on gist the current tool source,
>> cmake and sample code I'm using to test it if someone is willing to try.
>>
>> I've also tried to dump the ast and verify it but the initalizer list is not
>> showing up so I don't know what might be happening.
>
> The AST for the constructor looks like this:
>
>   CXXConstructorDecl <A.cc:2:1-3:1>
>     NestedNameSpecifier <2:1-2> A::
>       RecordType <2:1>
>     DeclarationName <2:4> A
>     FunctionProtoType <-6>
>       BuiltinType void <>
>     CXXCtorInitializer  <2:10-13>
>       FieldDeclRef <2:10> A::x
>       ImplicitCastExpr <2:12>
>         IntegerLiteral <2:12> 0
>     CXXCtorInitializer  <2:4>
>       FieldDeclRef <2:4> A::b
>     CompoundStmt <2:15-3:1>
>
> Reversing the order of x and b just reverses the order of the two
> CXXCtorInitializer in the AST.
>
> So it looks like clang always creates implicit initializers for
> members that aren't explicitly initialized, but it has no way of
> flagging them as implicit. I don't know the expected way of
> determining which are implicit, maybe checking for a NULL getInit().

CXXCtorInitializer::isWritten "Returns true if this initializer is
explicitly written in the source code."

-- James



More information about the cfe-dev mailing list