More __comp_ctor () woes

Brendon Costa bcosta@avdat.com.au
Tue Oct 24 03:43:00 GMT 2006


Sorry that my previous email was unclear. I have tried to clarify what i 
meant in this email by answering your questions.


Andrew Pinski wrote:

>On Tue, 2006-10-24 at 02:30 +0000, Brendon Costa wrote:
>  
>
>>I am trying to find the corresponding constructor from the basic_string 
>>class that should be called in place of the __comp_ctor function. There 
>>seems to be no FUNCTION_DECL node for the constructor: 
>>
>>basic_string(::char const*, ::char const*, ::std::allocator<char> const&)
>>
>>which I would expect if there is a __comp_ctor () with those parameters.
>>    
>>
>
>Wait you say you have a function decl but cannot find the function decl
>for the constructor?  I don't understand what you are getting at here.
>Do you understand how templates work because that seems like where you
>are getting lost.  Templates are instantiated with different types, in
>this case, with _InputIterator being "const char*"
>
>  
>
If there is a simple class like:

class MyClass
{
    MyClass()
    {}
};

int main()
{
    MyClass c;
    return 0;
}

This will produce at least 3 FUNCTION_DECL nodes:
1) main()
2) MyClass::MyClass(MyClass* this)
3) MyClass::__comp_ctor (MyClass* this)

I call (2) a "User Constructor" for want of a better name. But note that 
BOTH (2) and (3) are considered "constructors" as returned by 
DECL_CONSTRUCTOR_P(fndecl)


I have the FUNCTION_DECL node for (3) and want to find (2) from it. 
Basically as i understand it, main() will call (3) using a CALL_EXPR 
when it constructs the instance of MyClass. This __comp_ctor (MyClass* 
this) function (Which does not have an implementation i can find with 
DECL_SAVED_TREE) should call (2)

I have noticed that all __comp_ctor () and __base_ctor () FUNCTION_DECL 
nodes seem to correspond to a "User Constructor" for the same class that 
the __comp_ctor () was found in with exactly the same parameter list as 
the __comp_ctor () has.

For example:
SomeClass::__comp_ctor (const SomeClass&)

will some-how call:
SomeClass::SomeClass(const SomeClass&)

and:
SomeClass::__comp_ctor (int)

will some-how call:
SomeClass::SomeClass(int)



So hopefully that helps to understand what i mean by the two 
FUNCTION_DECL nodes.

The problem is that with the code in the previous email, i cant seem to 
find the associated "User Constructor" FUNCTION_DECL node given the 
__comp_ctor constructor FUNCTION_DECL node. In particular:

std::basic_string::__comp_ctor (::char const*, ::char const*, ::std::allocator<char> const&)

exists, but i cant seem to find an associated:
std::basic_string::basic_string(::char const*, ::char const*, ::std::allocator<char> const&)

NOTE: I have left the template parameters out to make this easier to read.



>>My questions are:
>>
>>1) Which of the basic_string constructors would be being called in this 
>>situation?
>>    
>>
>
>
>template<class _InputIterator>
>basic_string(_InputIterator, _InputIterator, const _Alloc& );
>
>Instantiated with _InputIterator being "const char*".
>
>  
>
Ignore this question. I think i know the answer, and yes i do understand 
how template instanciation works. I just wanted someone to say yes or no 
as to wether the above constructor from std::basic_string is the one 
that is being used when compiling the code I provided.

In particular, is the code I provided calling a different constructor 
from within std::basic_string class or is it instanciating this 
templated cosntructor and using the instanciated constructor with "const 
char*" as the template parameter?

I think the answer is yes it is using an instanciation of this 
constructor, but I wanted clarification.

I was interested in the answer to this as i am trying to reproduce the 
problem with the __comp_ctor () FUNCTION_DECL in a small test case (Not 
using std::basic_string). I have tried but seem unable to reproduce the 
problem in a smaller test case currently. An answer to that question 
above might help me in finding what exactly is causing the problem i 
have encountered.


Thanks,
Brendon.



More information about the Gcc mailing list