<html>
<head></head>
<body>
<blockquote class="replyBlock" style="border-left: 2px solid #000083; margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><p>That seems like an approach that works. I don't know that there's a different common property. Why's the default constructor different from the copy constructor here?</p>
</blockquote><p>First of all, sorry but I made a mistake in the example:</p>
<p>class A{<br />1.    A(){...}<br />2.    A(int a){...}<br />3.    <strong>A(const A& a){... ...}</strong><br />};</p>
<p>What I mean is that I need to find if there is at least one constructor that explicitly overloads the default constructor so that if I delete the default constructor the compiler won't provide the default constructor. So, my question was totally erroneous as the copy constructor does overload the default constructor if provided, but I don't want to take it into account if it wasn't explicitly provided.</p>
<p>A better question is: which are the kind of constructors that the compiler provides if no constructors are explicitly supplied? Only the default and the copy constructor (in some situations)?</p>
<p>If "unless(allOf(... ...))" is the best solution, could someone enumerate the kind of constructors I must to indicate in that matcher?</p>
<blockquote class="replyBlock" style="border-left: 2px solid #000083; margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><p>I'd suggest to not use ast-dump-xml any more. It's basically deprecated, and hopefully it'll be removed soon. -ast-dump gives you all the information (and more).</p>
</blockquote><p>Ok, I didn't know it.</p>
<blockquote class="replyBlock" style="border-left: 2px solid #000083; margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><p>... you can see that one is the default constructor and the other one is the copy constructor. If you just put "G g;" into the code instead of the second class, you'll also see that a simple use of G already triggers the copy constructor to appear. Others are probably better able to explain exactly when a copy constructor is created.</p>
</blockquote><p>Further information will be well received.</p>
<p>Regards,</p>
<p>Pedro.</p>
<div><em>El dia 27 may 2013 12:24, Manuel Klimek <klimek@google.com> escribió:</em></div><blockquote class="replyBlock" style="border-left: 2px solid #000083; margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div dir="ltr">Hi Pedro,<div>first, please always send those mails also to cfe-dev. There are people who are much more knowledgable about the AST on that list, and you'll often get better answers faster that way :)</div><div class="gmail_extra">On Mon, May 27, 2013 at 10:00 AM, Pedro Delgado Perez <span dir="ltr"><<a href="mailto:pedro.delgado@uca.es" target="_blank">pedro.delgado@uca.es</a>></span> wrote:<br /><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: #cccccc; border-left-style: solid; padding-left: 1ex;"><div><p>Sorry Manuel, but I prefer to ask you all the things I don't know before you reply me:</p>
<p>How do I know that a CXXConstructorDecl is a "simple" constructor of a class. I mean, I want to find all the constructors in a class, but not the copy, the move or things like this constructors. I'm not able to find this in the documentation. To clarify this, I'm going to put an example:</p>
<p>class A{<br />1.    A(){...}<br />2.    A(int a){...}<br />3.    A(const &a){... ...}<br />};</p>
<p>I want to look only for 1 and 2 and not for 3 when I ask:<br />recordDecl(hasMethod(constructDecl(...)));</p>
<p>What can I do? Do I have to write "unless(allOf(isCopyConstructor(), isMoveConstructor()...))" for each type of existing constructors?</p>
</div></blockquote><div>That seems like an approach that works. I don't know that there's a different common property. Why's the default constructor different from the copy constructor here?</div><div> </div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: #cccccc; border-left-style: solid; padding-left: 1ex;"><div><p>Thanks,</p>
<p>Pedro.</p>
<br/>
<br/>
<br/>
<blockquote style="border-left-width: 2px; border-left-style: solid; border-left-color: #000083; margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><p>Hi Manuel,</p>
<p>I would like to ask you something about the AST built by Clang if you don't mind.  I've just have a look at your video  of introduction to Clang AST (By the way, nice tutorial!) and I think that you may have an answer for my trouble.</p>
<p>Look, I was trying to look for classes that had only the default constructor through ASTMatchers. Well, I tested my matcher with the next classes:</p>
<p>class G{<br />public:<br />        G():a(1){}<br />        int a;<br />        virtual int ma(int arg);<br />};</p>
<p>class L: <strong>public G</strong>{<br />        public:<br />                L(){v = 1;}<br />                int b;<br />                int h;<br />                virtual int ma(int arg);<br />        private:<br />                int v;<br />                int f();<br />};</p>
<p>My matcher only retrieved the class 'L' and not the 'G'. I was wondering what would be the problem when I had a look to the ast-dump-xml option:</p>
</blockquote></div></blockquote><div>I'd suggest to not use ast-dump-xml any more. It's basically deprecated, and hopefully it'll be removed soon. -ast-dump gives you all the information (and more).</div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: #cccccc; border-left-style: solid; padding-left: 1ex;"><div><blockquote style="border-left-width: 2px; border-left-style: solid; border-left-color: #000083; margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><p> <CXXRecord ptr="0xd695f30" name="G" typeptr="0xd695f80"><br />  <CXXRecord ptr="0xd695fd0" name="G" typeptr="0xd695f80"/><br />  <AccessSpec ptr="0xd696020" access="public"/><br />  <strong><CXXConstructor</strong> used="1" ptr="0xd696080" name="G" prototype="true"><br />   <FunctionProtoType ptr="0xd696050" canonical="0xd696050"><br />    <BuiltinType ptr="0xd695c40" canonical="0xd695c40"/><br />    <parameters/><br />   </FunctionProtoType><br />   <Stmt><br />CompoundStmt 0xd696450 <tst.cpp:7:10, col:11><br />   </Stmt><br />  </CXXConstructor></p>
<p>....</p>
<p><strong><CXXConstructor</strong> ptr="0xd6aefc0" name="G" prototype="true" inline="true"><br />   <FunctionProtoType ptr="0xd6af050" canonical="0xd6af030" exception_spec="unevaluated"><br />    <BuiltinType ptr="0xd695c40" canonical="0xd695c40"/><br />    <parameters><br />     <LValueReferenceType ptr="0xd696240" canonical="0xd696240"><br />      <QualType const="true"><br />       <RecordType ptr="0xd695f80" canonical="0xd695f80"><br />        <CXXRecord ref="0xd695f30"/><br />       </RecordType><br />      </QualType><br />     </LValueReferenceType><br />    </parameters><br />   </FunctionProtoType><br />   <ParmVar ptr="0xd6af070" name="" initstyle="c"><br />    <LValueReferenceType ptr="0xd696240" canonical="0xd696240"><br />     <QualType const="true"><br />      <RecordType ptr="0xd695f80" canonical="0xd695f80"><br />       <CXXRecord ref="0xd695f30"/><br />      </RecordType><br />     </QualType><br />    </LValueReferenceType><br />   </ParmVar><br />  </CXXConstructor><br /> </CXXRecord></p>
<br/>
<p>Why class 'G' has two constructors? If I change the test program in order that class 'L' doesn't inherits from class 'G', this doesn't happen (class 'G' only has one constructor in the ast-dump-xml) Could you lend me a hand?</p>
</blockquote></div></blockquote><div>If you look at -ast-dump:</div><div><div>$ clang -cc1 -ast-dump t4.cc</div><div><snip></div><div>|-CXXRecordDecl 0x37faf80 <t4.cc:1:1, line:6:1> class G</div><div><snip></div><div>| |-CXXConstructorDecl 0x37fb1c0 <line:3:3, col:15> G 'void (void)'</div><div>| | |-CXXCtorInitializer Field 0x37fb290 'a' 'int'</div><div>| | | |-IntegerLiteral 0x382d018 <col:11> 'int' 1</div><div>| | `-CompoundStmt 0x382d0a0 <col:14, col:15></div><div><snip></div><div>| `-CXXConstructorDecl 0x382da70 <col:7> G 'void (const class G &)' inline</div><div>|   `-ParmVarDecl 0x382f820 <col:7> 'const class G &'</div><div><snip></div><div>... you can see that one is the default constructor and the other one is the copy constructor. If you just put "G g;" into the code instead of the second class, you'll also see that a simple use of G already triggers the copy constructor to appear. Others are probably better able to explain exactly when a copy constructor is created.</div><div>cheers,</div><div>/Manuel</div></div></div></div></div></blockquote>
</body>
</html>