<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">Hey!</p>
<p style="margin:0px 0px 1.2em!important">Suppose we have a rather trivial situation with a function prototype, a usage, and then later a definition:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-cpp" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;background:rgb(234,238,243) none repeat scroll 0% 0%;color:rgb(0,25,58)"><span class="hljs-keyword" style="font-weight:bold">int</span> foo(<span class="hljs-keyword" style="font-weight:bold">int</span> x);

<span class="hljs-keyword" style="font-weight:bold">void</span> bar() {
  foo(<span class="hljs-number">0</span>);
}

<span class="hljs-keyword" style="font-weight:bold">int</span> foo(<span class="hljs-keyword" style="font-weight:bold">int</span> x) { <span class="hljs-keyword" style="font-weight:bold">return</span> x * <span class="hljs-number">2</span>; }

<span class="hljs-keyword" style="font-weight:bold">void</span> baz() {
  foo(<span class="hljs-number">1</span>);
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">The following AST results:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important">|-FunctionDecl 0x55ae46421ca8 <a.cpp:1:1, col:14> col:5 used foo 'int (int)'
| `-ParmVarDecl 0x55ae46421bd0 <col:9, col:13> col:13 x 'int'
|-FunctionDecl 0x55ae46421df0 <line:2:1, col:23> col:6 bar 'void ()'
| `-CompoundStmt 0x55ae46421f90 <col:12, col:23>
|   `-CallExpr 0x55ae46421f68 <col:16, col:21> 'int'
|     |-ImplicitCastExpr 0x55ae46421f50 <col:16> 'int (*)(int)' <FunctionToPointerDecay>
|     | `-DeclRefExpr 0x55ae46421ef8 <col:16> 'int (int)' lvalue Function 0x55ae46421ca8 'foo' 'int (int)'
|     `-IntegerLiteral 0x55ae46421ed8 <col:20> 'int' 0
|-FunctionDecl 0x55ae46422058 prev 0x55ae46421ca8 <line:3:1, col:32> col:5 used foo 'int (int)'
| |-ParmVarDecl 0x55ae46421fc0 <col:9, col:13> col:13 used x 'int'
| `-CompoundStmt 0x55ae46422188 <col:16, col:32>
|   `-ReturnStmt 0x55ae46422178 <col:18, col:29>
|     `-BinaryOperator 0x55ae46422158 <col:25, col:29> 'int' '*'
|       |-ImplicitCastExpr 0x55ae46422140 <col:25> 'int' <LValueToRValue>
|       | `-DeclRefExpr 0x55ae46422100 <col:25> 'int' lvalue ParmVar 0x55ae46421fc0 'x' 'int'
|       `-IntegerLiteral 0x55ae46422120 <col:29> 'int' 2
`-FunctionDecl 0x55ae464221c0 <line:4:1, col:21> col:6 baz 'void ()'
  `-CompoundStmt 0x55ae46422328 <col:12, col:21>
    `-CallExpr 0x55ae46422300 <col:14, col:19> 'int'
      |-ImplicitCastExpr 0x55ae464222e8 <col:14> 'int (*)(int)' <FunctionToPointerDecay>
      | `-DeclRefExpr 0x55ae464222c8 <col:14> 'int (int)' lvalue Function 0x55ae46422058 'foo' 'int (int)'
      `-IntegerLiteral 0x55ae464222a8 <col:18> 'int' 1
</code></pre><p style="margin:0px 0px 1.2em!important">The <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">FunctionDecl</code> knows that it is a redeclaration of a previous Decl (namely, the prototype). However, the two <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ParmVarDecl</code>s for <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">int x</code> do not have this relationship: <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">PVD->getCanonicalDecl() == PVD</code> holds for both instances, with no connection between. <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">PVD->redecls() == {PVD}</code>, too.<br>What is more interesting, is that querying the parameter to which the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">CallExpr</code> gives the argument to, by iterating the number of arguments and doing <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">cast<FunctionDecl>(CE->getCalledDecl())->getParamDecl(0)</code>, we will get two separate <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ParmVarDecl</code> instances, due to how the call before the <em>definition</em> of <strong><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">foo()</code></strong> binds the prototype (and gives us the prototype’s <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ParmVarDecl</code>) but the call site <em>after</em> the called function has been defined bind the <em>definition</em>.</p>
<p style="margin:0px 0px 1.2em!important">Is this an intended behaviour?<br>Why isn’t the two <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ParmVarDecl</code>s not linked into a redecl chain, considering they should mean the “same entity”, as it is the same parameter of a redecl’d function?<br>I obviously mean once we are past overloads, past template instantiations, etc. No “magic” should be intervening.<br>Or is it me who’s not grasping something from the language correctly?</p>
<p style="margin:0px 0px 1.2em!important">Regards,<br>W.</p>
<div title="MDH:PGRpdj5IZXkhPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5TdXBwb3NlIHdlIGhhdmUgYSByYXRo
ZXIgdHJpdmlhbCBzaXR1YXRpb24gd2l0aCBhIGZ1bmN0aW9uIHByb3RvdHlwZSwgYSB1c2FnZSwg
YW5kIHRoZW4gbGF0ZXIgYSBkZWZpbml0aW9uOjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2
PmBgYGNwcDwvZGl2PjxkaXY+aW50IGZvbyhpbnQgeCk7PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp
dj52b2lkIGJhcigpIHs8L2Rpdj48ZGl2PiZuYnNwOyBmb28oMCk7PC9kaXY+PGRpdj59PC9kaXY+
PGRpdj48YnI+PC9kaXY+PGRpdj5pbnQgZm9vKGludCB4KSB7IHJldHVybiB4ICogMjsgfTwvZGl2
PjxkaXY+PGJyPjwvZGl2PjxkaXY+dm9pZCBiYXooKSB7PC9kaXY+PGRpdj4mbmJzcDsgZm9vKDEp
OzwvZGl2PjxkaXY+fTxicj48L2Rpdj48ZGl2PmBgYDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+
VGhlIGZvbGxvd2luZyBBU1QgcmVzdWx0czo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYDwv
ZGl2PjxkaXY+fC1GdW5jdGlvbkRlY2wgMHg1NWFlNDY0MjFjYTggJmx0O2EuY3BwOjE6MSwgY29s
OjE0Jmd0OyBjb2w6NSB1c2VkIGZvbyAnaW50IChpbnQpJzxicj58IGAtUGFybVZhckRlY2wgMHg1
NWFlNDY0MjFiZDAgJmx0O2NvbDo5LCBjb2w6MTMmZ3Q7IGNvbDoxMyB4ICdpbnQnPGJyPnwtRnVu
Y3Rpb25EZWNsIDB4NTVhZTQ2NDIxZGYwICZsdDtsaW5lOjI6MSwgY29sOjIzJmd0OyBjb2w6NiBi
YXIgJ3ZvaWQgKCknPGJyPnwgYC1Db21wb3VuZFN0bXQgMHg1NWFlNDY0MjFmOTAgJmx0O2NvbDox
MiwgY29sOjIzJmd0Ozxicj58ICZuYnNwOyBgLUNhbGxFeHByIDB4NTVhZTQ2NDIxZjY4ICZsdDtj
b2w6MTYsIGNvbDoyMSZndDsgJ2ludCc8YnI+fCAmbmJzcDsgJm5ic3A7IHwtSW1wbGljaXRDYXN0
RXhwciAweDU1YWU0NjQyMWY1MCAmbHQ7Y29sOjE2Jmd0OyAnaW50ICgqKShpbnQpJyAmbHQ7RnVu
Y3Rpb25Ub1BvaW50ZXJEZWNheSZndDs8YnI+fCAmbmJzcDsgJm5ic3A7IHwgYC1EZWNsUmVmRXhw
ciAweDU1YWU0NjQyMWVmOCAmbHQ7Y29sOjE2Jmd0OyAnaW50IChpbnQpJyBsdmFsdWUgRnVuY3Rp
b24gMHg1NWFlNDY0MjFjYTggJ2ZvbycgJ2ludCAoaW50KSc8YnI+fCAmbmJzcDsgJm5ic3A7IGAt
SW50ZWdlckxpdGVyYWwgMHg1NWFlNDY0MjFlZDggJmx0O2NvbDoyMCZndDsgJ2ludCcgMDxicj58
LUZ1bmN0aW9uRGVjbCAweDU1YWU0NjQyMjA1OCBwcmV2IDB4NTVhZTQ2NDIxY2E4ICZsdDtsaW5l
OjM6MSwgY29sOjMyJmd0OyBjb2w6NSB1c2VkIGZvbyAnaW50IChpbnQpJzxicj58IHwtUGFybVZh
ckRlY2wgMHg1NWFlNDY0MjFmYzAgJmx0O2NvbDo5LCBjb2w6MTMmZ3Q7IGNvbDoxMyB1c2VkIHgg
J2ludCc8YnI+fCBgLUNvbXBvdW5kU3RtdCAweDU1YWU0NjQyMjE4OCAmbHQ7Y29sOjE2LCBjb2w6
MzImZ3Q7PGJyPnwgJm5ic3A7IGAtUmV0dXJuU3RtdCAweDU1YWU0NjQyMjE3OCAmbHQ7Y29sOjE4
LCBjb2w6MjkmZ3Q7PGJyPnwgJm5ic3A7ICZuYnNwOyBgLUJpbmFyeU9wZXJhdG9yIDB4NTVhZTQ2
NDIyMTU4ICZsdDtjb2w6MjUsIGNvbDoyOSZndDsgJ2ludCcgJyonPGJyPnwgJm5ic3A7ICZuYnNw
OyAmbmJzcDsgfC1JbXBsaWNpdENhc3RFeHByIDB4NTVhZTQ2NDIyMTQwICZsdDtjb2w6MjUmZ3Q7
ICdpbnQnICZsdDtMVmFsdWVUb1JWYWx1ZSZndDs8YnI+fCAmbmJzcDsgJm5ic3A7ICZuYnNwOyB8
IGAtRGVjbFJlZkV4cHIgMHg1NWFlNDY0MjIxMDAgJmx0O2NvbDoyNSZndDsgJ2ludCcgbHZhbHVl
IFBhcm1WYXIgMHg1NWFlNDY0MjFmYzAgJ3gnICdpbnQnPGJyPnwgJm5ic3A7ICZuYnNwOyAmbmJz
cDsgYC1JbnRlZ2VyTGl0ZXJhbCAweDU1YWU0NjQyMjEyMCAmbHQ7Y29sOjI5Jmd0OyAnaW50JyAy
PGJyPmAtRnVuY3Rpb25EZWNsIDB4NTVhZTQ2NDIyMWMwICZsdDtsaW5lOjQ6MSwgY29sOjIxJmd0
OyBjb2w6NiBiYXogJ3ZvaWQgKCknPGJyPiZuYnNwOyBgLUNvbXBvdW5kU3RtdCAweDU1YWU0NjQy
MjMyOCAmbHQ7Y29sOjEyLCBjb2w6MjEmZ3Q7PGJyPiZuYnNwOyAmbmJzcDsgYC1DYWxsRXhwciAw
eDU1YWU0NjQyMjMwMCAmbHQ7Y29sOjE0LCBjb2w6MTkmZ3Q7ICdpbnQnPGJyPiZuYnNwOyAmbmJz
cDsgJm5ic3A7IHwtSW1wbGljaXRDYXN0RXhwciAweDU1YWU0NjQyMjJlOCAmbHQ7Y29sOjE0Jmd0
OyAnaW50ICgqKShpbnQpJyAmbHQ7RnVuY3Rpb25Ub1BvaW50ZXJEZWNheSZndDs8YnI+Jm5ic3A7
ICZuYnNwOyAmbmJzcDsgfCBgLURlY2xSZWZFeHByIDB4NTVhZTQ2NDIyMmM4ICZsdDtjb2w6MTQm
Z3Q7ICdpbnQgKGludCknIGx2YWx1ZSBGdW5jdGlvbiAweDU1YWU0NjQyMjA1OCAnZm9vJyAnaW50
IChpbnQpJzxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyBgLUludGVnZXJMaXRlcmFsIDB4NTVhZTQ2
NDIyMmE4ICZsdDtjb2w6MTgmZ3Q7ICdpbnQnIDE8L2Rpdj48ZGl2PmBgYDwvZGl2PjxkaXY+PGJy
PjwvZGl2PjxkaXY+VGhlIGBGdW5jdGlvbkRlY2xgIGtub3dzIHRoYXQgaXQgaXMgYSByZWRlY2xh
cmF0aW9uIG9mIGEgcHJldmlvdXMgPHNwYW4gemV1bTRjMj0iUFJfMjVfMCIgZGF0YS1kZG53YWI9
IlBSXzI1XzAiIGFyaWEtaW52YWxpZD0iZ3JhbW1hciIgY2xhc3M9IkxtIG5nIj5EZWNsPC9zcGFu
PiAobmFtZWx5LCB0aGUgcHJvdG90eXBlKS4gSG93ZXZlciwgdGhlIHR3byBgUGFybVZhckRlY2xg
cyBmb3IgYGludCB4YCBkbyBub3QgaGF2ZSB0aGlzIHJlbGF0aW9uc2hpcDogYFBWRC0mZ3Q7Z2V0
Q2Fub25pY2FsRGVjbCgpID09IFBWRGAgaG9sZHMgZm9yIGJvdGggaW5zdGFuY2VzLCB3aXRoIG5v
IGNvbm5lY3Rpb24gYmV0d2Vlbi4gYFBWRC0mZ3Q7cmVkZWNscygpID09IHtQVkR9YCwgdG9vLjwv
ZGl2PjxkaXY+V2hhdCBpcyBtb3JlIGludGVyZXN0aW5nLCBpcyB0aGF0IHF1ZXJ5aW5nIHRoZSBw
YXJhbWV0ZXIgdG8gd2hpY2ggdGhlIGBDYWxsRXhwcmAgZ2l2ZXMgdGhlIGFyZ3VtZW50IHRvLCBi
eSBpdGVyYXRpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgYW5kIGRvaW5nIGBjYXN0Jmx0O0Z1
bmN0aW9uRGVjbCZndDsoQ0UtJmd0O2dldENhbGxlZERlY2woKSktJmd0O2dldFBhcmFtRGVjbCgw
KWAsIHdlIHdpbGwgZ2V0IHR3byBzZXBhcmF0ZSBgUGFybVZhckRlY2xgIGluc3RhbmNlcywgZHVl
IHRvIGhvdyB0aGUgY2FsbCBiZWZvcmUgdGhlICpkZWZpbml0aW9uKiBvZiAqKmBmb28oKWAqKiBi
aW5kcyB0aGUgcHJvdG90eXBlIChhbmQgZ2l2ZXMgdXMgdGhlIHByb3RvdHlwZSdzIGBQYXJtVmFy
RGVjbGApIGJ1dCB0aGUgY2FsbCBzaXRlICphZnRlciogdGhlIGNhbGxlZCBmdW5jdGlvbiBoYXMg
YmVlbiBkZWZpbmVkIGJpbmQgdGhlICpkZWZpbml0aW9uKi48L2Rpdj48ZGl2Pjxicj48L2Rpdj48
ZGl2PklzIHRoaXMgYW4gaW50ZW5kZWQgYmVoYXZpb3VyPzwvZGl2PjxkaXY+V2h5IDxzcGFuIHpl
dW00YzI9IlBSXzI2XzAiIGRhdGEtZGRud2FiPSJQUl8yNl8wIiBhcmlhLWludmFsaWQ9ImdyYW1t
YXIiIGNsYXNzPSJMbSBuZyI+aXNuJ3Q8L3NwYW4+IHRoZSB0d28gYFBhcm1WYXJEZWNsYHMgbm90
IGxpbmtlZCBpbnRvIGEgcmVkZWNsIGNoYWluLCBjb25zaWRlcmluZyB0aGV5IHNob3VsZCBtZWFu
IHRoZSAic2FtZSBlbnRpdHkiLCBhcyBpdCBpcyB0aGUgc2FtZSBwYXJhbWV0ZXIgb2YgYSByZWRl
Y2wnZCBmdW5jdGlvbj88L2Rpdj48ZGl2Pkkgb2J2aW91c2x5IG1lYW4gb25jZSB3ZSBhcmUgcGFz
dCBvdmVybG9hZHMsIHBhc3QgdGVtcGxhdGUgaW5zdGFudGlhdGlvbnMsIGV0Yy4gTm8gIm1hZ2lj
IiBzaG91bGQgYmUgaW50ZXJ2ZW5pbmcuPGJyPjwvZGl2PjxkaXY+T3IgaXMgaXQgbWUgd2hvJ3Mg
bm90IGdyYXNwaW5nIHNvbWV0aGluZyBmcm9tIHRoZSBsYW5ndWFnZSBjb3JyZWN0bHk/PC9kaXY+
PGRpdj48YnI+PC9kaXY+PGRpdj5SZWdhcmRzLDwvZGl2PjxkaXY+Vy48YnI+PC9kaXY+PGRpdj48
YnI+PC9kaXY+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div></div>