aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/TableGen/TGParser.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-08-08 00:10:39 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-08-08 00:10:39 +0000
commitd96b99740d1f2c47941e589d9719016388ee6453 (patch)
tree1948bfebd62c54547ae481c4ad1b81b622126bcc /llvm/lib/TableGen/TGParser.cpp
parent7d498629f1e038d2642116b40a04f4acf6532a26 (diff)
downloadllvm-d96b99740d1f2c47941e589d9719016388ee6453.zip
llvm-d96b99740d1f2c47941e589d9719016388ee6453.tar.gz
llvm-d96b99740d1f2c47941e589d9719016388ee6453.tar.bz2
MS ABI: Don't force bases to have an inheritance model
Previously, assigning an inheritance model to a derived class would trigger further assiginments to the various bases of the class. This was done to fix a bug where we couldn't handle an implicit base-to-derived conversion for pointers-to-members when the conversion was ambiguous at an earlier point. However, this is not how the MS scheme works. Instead, assign inheritance models to *just* the class which owns to declaration we ended up referencing. N.B. This result is surprising in many ways. It means that it is possible for a base to have a "larger" inheritance model than it's derived classes. It also means that bases in the conversion path do not get assigned a model. struct A { void f(); void f(int); }; struct B : A {}; struct C : B {}; void f() { void (C::*x)() = &A::f; } We can only begin to assign an inheritance model *after* we've seen the address-of but *before* we've done the implicit conversion the more derived pointer-to-member type. After that point, both 'A' and 'C' will have an inheritance model but 'B' will not. Surprising, right? llvm-svn: 215174
Diffstat (limited to 'llvm/lib/TableGen/TGParser.cpp')
0 files changed, 0 insertions, 0 deletions