forked from OSchip/llvm-project
[C++11 Compat] Fix breaking change in C++11 pair copyctor.
While this code is valid C++98, it is not valid C++11. The problem can be reduced to: class MDNode; class DIType { operator MDNode*() const {return 0;} }; class WeakVH { WeakVH(MDNode*) {} }; int main() { DIType di; std::pair<void*, WeakVH> p(std::make_pair((void*)0, di))); } This was not detected by any of the bots we have because they either compile C++98 with libstdc++ (which allows it), or C++11 with libc++ (which incorrectly allows it). I ran into the problem when compiling with VS 2012 RC. Thanks to Richard for explaining the issue. llvm-svn: 158245
This commit is contained in:
parent
1224312f5b
commit
d1e09a4282
|
@ -1700,7 +1700,8 @@ llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile Unit) {
|
|||
|
||||
llvm::DIType TC = getTypeOrNull(Ty);
|
||||
if (TC.Verify() && TC.isForwardDecl())
|
||||
ReplaceMap.push_back(std::make_pair(Ty.getAsOpaquePtr(), TC));
|
||||
ReplaceMap.push_back(std::make_pair(Ty.getAsOpaquePtr(),
|
||||
static_cast<llvm::Value*>(TC)));
|
||||
|
||||
// And update the type cache.
|
||||
TypeCache[Ty.getAsOpaquePtr()] = Res;
|
||||
|
@ -1811,7 +1812,8 @@ llvm::DIType CGDebugInfo::getOrCreateLimitedType(QualType Ty,
|
|||
llvm::DIType Res = CreateLimitedTypeNode(Ty, Unit);
|
||||
|
||||
if (T.Verify() && T.isForwardDecl())
|
||||
ReplaceMap.push_back(std::make_pair(Ty.getAsOpaquePtr(), T));
|
||||
ReplaceMap.push_back(std::make_pair(Ty.getAsOpaquePtr(),
|
||||
static_cast<llvm::Value*>(T)));
|
||||
|
||||
// And update the type cache.
|
||||
TypeCache[Ty.getAsOpaquePtr()] = Res;
|
||||
|
|
Loading…
Reference in New Issue