<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p style="margin-top:0;margin-bottom:0">Hi John,</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">Thank you very much, that was exactly what I was looking for!</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">Best Regards,</p>
<p style="margin-top:0;margin-bottom:0">Andrew<br>
</p>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> rjmccall@apple.com <rjmccall@apple.com> on behalf of John McCall <rjmccall@apple.com><br>
<b>Sent:</b> 15 August 2018 09:27:39<br>
<b>To:</b> Andrew Gozillon<br>
<b>Cc:</b> cfe-dev@lists.llvm.org<br>
<b>Subject:</b> Re: [cfe-dev] Template Qualifier Removal Question</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">> On Aug 13, 2018, at 2:36 AM, Andrew Gozillon via cfe-dev <cfe-dev@lists.llvm.org> wrote:<br>
> <br>
> Hi,<br>
> <br>
> I have a question relating to template metafunctions like remove_const that split a type from its qualifiers.<br>
> <br>
> I was wondering where in Clang the decision to remove const (or another qualifier or pointer) from a type is made when using templates and then where it's performed (the new type generated)? I originally thought the conversion might be in TreeTransform.h
 in a function like TransformQualifiedType but it doesn't appear to be the case (I could be missing something however).<br>
> <br>
> Sorry if the question is not entirely clear and thank you very much for your time and help!<br>
<br>
The C++ specification gives rules for deducing template arguments from an "argument" type and a "parameter" type, where the argument type is (typically) a concrete type and the parameter type is specified in terms of some number of template parameters.  You
 can find these rules in the section labeled [temp.deduct], but the basic idea is that you look for types that, if substituted for the template parameters, give exactly the argument type.  So, e.g., if you have a parameter type `const T` and an argument type
 `const int`, the substitution `T = int` is the best match; but if the parameter type were `U`, the best substitution would be `U = const int`.<br>
<br>
In clang, this rule is implemented in SemaTemplateDeduction.cpp.  For the specific part about qualifiers, search that file for the use of `removeCVRQualifiers`.<br>
<br>
John.<br>
</div>
</span></font></div>
</body>
</html>