diff options
| author | Jordan Rose <jordan_rose@apple.com> | 2013-04-11 00:58:58 +0000 |
|---|---|---|
| committer | Jordan Rose <jordan_rose@apple.com> | 2013-04-11 00:58:58 +0000 |
| commit | b1312a549567db37da26c19b53439b6b05b1e0e5 (patch) | |
| tree | 578aea6b8eb7db7798caaa0c8cac96d6b9fb9515 /llvm/lib/Object/COFFObjectFile.cpp | |
| parent | 9448e8594f3b2b5316d1253785dae0956f508cce (diff) | |
| download | llvm-b1312a549567db37da26c19b53439b6b05b1e0e5.zip llvm-b1312a549567db37da26c19b53439b6b05b1e0e5.tar.gz llvm-b1312a549567db37da26c19b53439b6b05b1e0e5.tar.bz2 | |
Force a load when creating a reference to a temporary copied from a bitfield.
For this source:
const int &ref = someStruct.bitfield;
We used to generate this AST:
DeclStmt [...]
`-VarDecl [...] ref 'const int &'
`-MaterializeTemporaryExpr [...] 'const int' lvalue
`-ImplicitCastExpr [...] 'const int' lvalue <NoOp>
`-MemberExpr [...] 'int' lvalue bitfield .bitfield [...]
`-DeclRefExpr [...] 'struct X' lvalue ParmVar [...] 'someStruct' 'struct X'
Notice the lvalue inside the MaterializeTemporaryExpr, which is very
confusing (and caused an assertion to fire in the analyzer - PR15694).
We now generate this:
DeclStmt [...]
`-VarDecl [...] ref 'const int &'
`-MaterializeTemporaryExpr [...] 'const int' lvalue
`-ImplicitCastExpr [...] 'int' <LValueToRValue>
`-MemberExpr [...] 'int' lvalue bitfield .bitfield [...]
`-DeclRefExpr [...] 'struct X' lvalue ParmVar [...] 'someStruct' 'struct X'
Which makes a lot more sense. This allows us to remove code in both
CodeGen and AST that hacked around this special case.
The commit also makes Clang accept this (legal) C++11 code:
int &&ref = std::move(someStruct).bitfield
PR15694 / <rdar://problem/13600396>
llvm-svn: 179250
Diffstat (limited to 'llvm/lib/Object/COFFObjectFile.cpp')
0 files changed, 0 insertions, 0 deletions
