Thanks. That was a lot helpful. However, I do have another question. Consider the following two case scenari: <br><br>Case 1:<br>------------<br>The previous one, with<br>(1) f() defined as a concept member, and<br>(2) func() a restricted template<br>
<br><br>Case 2:<br>------------<br>(1) f() is a global function, and<br>(2) func() is a simple template, as in<br><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">void f() { }<br>
<br>template<typename T></span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">void func(T a) {</span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    f(0);</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">}</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">int main(int argc, char **argv) </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">{ </span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    int i=0;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    func<int>(i); </span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">}</span><br><br><br>Observation:<br>----------------------<br>In both cases, f() never seems to be "marked for instantiation", at least not through Sema::<div>MarkDeclarationReferenced. However, f() does seem to eventually get instantiated in the "Case 2" somehow, whereas it never does in "Case 1". Any idea?<br>
<br>1) When does f() get instantiated in "Case 2"?<br>2) is this connected to lookup somehow?<br>     I have made some very minor changes in Sema::CppLookupName(), and I'm not sure how this could affect instantiation...<br>
</div><br>Thanks,<br><br>-- Larisse.<br><br><br><br><br><br><div class="gmail_quote">On Mon, Jan 31, 2011 at 11:42 AM, Douglas Gregor <span dir="ltr"><<a href="mailto:dgregor@apple.com">dgregor@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div style="word-wrap: break-word;"><br><div><div><div></div><div class="h5"><div>On Jan 31, 2011, at 8:12 AM, Larisse Voufo wrote:</div>
<br><blockquote type="cite"><br>Folks --<br><br>This has had me puzzled for a while, and I could use an answer asap.<br>I am implementing concepts in Clang and seem to be missing a crucial piece of understanding, either of C++, or of Clang. <br>
Basically, I have gotten mostly everything else implemented and working fine to the extend that I want them to, except for concept members instantiation (?).<br>
<br>Basic Example:  instantiation.cpp<br>----------------------<br><br><span style="font-family: courier new,monospace;">concept B<typename T> {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  void f(int) { }</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">}</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">concept_map B<int> {</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  void f(int) { }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">}</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">template<typename T></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">requires (B<T>) </span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">void func(T a) {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">//    f(a);</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    f(0);</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">}</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">int main(int argc, char **argv) </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">{ </span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    int i=0;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    func<int>(i); </span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">}</span><br><br>Compilation:  clang++ instantiation.cpp -o example<br>
----------------------<br>It seems to be failing at link time, with the following error message:<br><br><span style="font-family: courier new,monospace;">Undefined symbols:</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  "__ZN1B1fEi", referenced from:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      __Z4funcIiEvT_ in cc-MXLAc6.o</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">ld: symbol(s) not found</span><br><br><br>Any idea? Anyone? <br>1) At which point are functions marked for instantiation?<br></blockquote><div><br></div></div></div><div>
Look for calls to Sema::MarkDeclarationReferenced throughout Sema.</div><div class="im"><br><blockquote type="cite">2 ) At which point are they instantiated ?<br></blockquote><div><br></div></div><div>At the end of the translation unit.</div>
<div class="im"><br><blockquote type="cite">
3) If instantiated, why would they not be visible by the linker? <br></blockquote><div><br></div></div>Probably because the template instantiation mechanism couldn't find the definition of B<int>::f(int).</div>
<div><br></div><div><span style="white-space: pre-wrap;">       </span>- Doug</div></div></blockquote></div><br>