[cfe-dev] class template methods
Peter Stirling
peter at pjstirling.plus.com
Fri Apr 24 19:30:12 PDT 2015
Anyone?
On 16/04/15 06:25, Peter Stirling wrote:
> This does sound promising, but I'm not sure how to make use of it.
>
> At the moment my walker (which is based on clang::ASTConsumer) has a
> handler for class templates that looks like:
>
> void Walker::TraverseClassTemplate(clang::ClassTemplateDecl const* d) {
> TRACE(1, "walk template " + getDeclMetadataString(d));
>
> bool was = inInstantiation;
> inInstantiation = true;
>
> for(auto decl : d->specializations()) {
> visitor->RequestCompleteType(decl);
> TraverseCXXRecord(decl);
> }
>
> inInstantiation = was;
> }
>
> Visitor::RequestCompleteType() calls Sema::RequireCompleteType()
> (which IMO has the wrong name, it returns false on what I would
> consider, from the name, success).
>
> So, I don't construct the specializations for methods directly in my
> code, I assume that some of the instantiation is performed by
> RequireCompleteType(), but surely if I checked for SFINAE at that
> level then I would lose EVERY methods for std::pair<int const, int
> const> and not just the ones that involve mutation?
>
> On 14/04/15 18:26, Richard Smith wrote:
>> On Tue, Apr 14, 2015 at 8:38 AM, Reid Kleckner <rnk at google.com
>> <mailto:rnk at google.com>> wrote:
>>
>> Sounds a lot like a SFINAE test. Assuming you already have an AST
>> with the class template instantiation, then you'd attempt to
>> instantiate the assignment operator inside a SFINAETrap.
>> Instantiation will either pass or fail and you'll get your
>> answer, and you should be able to continue compilation or further
>> queries normally.
>>
>>
>> I think the above is about the best that you can do.
>>
>> One note: if an error occurs outside of the immediate context of the
>> substitution, a SFINAETrap will not suppress it (which is actually a
>> good thing in this case, because you cannot continue compilation
>> normally after such an error -- any part of the AST that failed may
>> be marked invalid, suppressing further errors in other contexts).
>>
>> On Mon, Apr 13, 2015 at 9:57 PM, Peter Stirling
>> <peter at pjstirling.plus.com <mailto:peter at pjstirling.plus.com>> wrote:
>>
>> Hi,
>>
>> Is there a way to ask clang whether a method for an
>> instantiation of a class template would be an error to call?
>> (I only need yes/no)
>>
>> For example:
>>
>> std::pair has assignment operators defined, but for the
>> instantiation std::pair<int const, int const> calling the
>> assignment operators is an error, because you can't assign to
>> int const.
>>
>> If clang can't tell me this, I'm looking at generating a
>> translation unit with a call to the method, and then checking
>> whether there was an error compiling it. Given that I will
>> need to do this once per method, per instantiation, per
>> template, (which looks to be in the thousands based on a test
>> I just did) what is the best way to do this?
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu <mailto:cfe-dev at cs.uiuc.edu>
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu <mailto:cfe-dev at cs.uiuc.edu>
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>>
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150425/af16f045/attachment.html>
More information about the cfe-dev
mailing list