<html>
    <head>
      <base href="http://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - [-cxx-abi microsoft] Mangle TemplateArgument::Declaration correctly for member pointers and references"
   href="http://llvm.org/bugs/show_bug.cgi?id=16835">16835</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[-cxx-abi microsoft] Mangle TemplateArgument::Declaration correctly for member pointers and references
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>LLVM Codegen
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>david.majnemer@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Member pointers currently show up as FieldDecls which, as far as we know,
aren't mangled.

Instead, the proper way to mangle these when they show up as template arguments
is to turn them into their field offset in byte units and encode that as a
literal.

Incidentally, we also failed to properly mangle declarations that are template
parameters.  We would mangle them the same as non-type, non-reference
declarations. Fun-fact: undname cannot handle these!

struct record {
  int first;
  int second;
};
template <const record &>
struct type1 {
};
extern const record inst;
type1<inst> x;

template <int record::*>
struct type2 {
};
type2<&record::first> memptr1;
type2<&record::second> memptr2;

Should be mangled as:
?memptr1@@3U?$type2@$0A@@@A
?memptr2@@3U?$type2@$03@@A
?x@@3U?$type1@$E?inst@@3Urecord@@B@@A</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>