summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-06-29 20:13:23 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-06-29 20:13:23 +0000
commit5682efd28c745d1eeef33c376cdcf5fca670d60e (patch)
tree8c4334cbf84aafab5d4aaab0d1a57a5fba452705 /clang/lib
parent2e59d4fffeeb0aeaf2acfd9f79acec21690a7fee (diff)
downloadbcm5719-llvm-5682efd28c745d1eeef33c376cdcf5fca670d60e.tar.gz
bcm5719-llvm-5682efd28c745d1eeef33c376cdcf5fca670d60e.zip
[CodeGen] Remove atomic sugar from record types in isSafeToConvert
We failed to see that we should have deferred the creation of a type which references a type currently under construction because of atomic sugar. This fixes PR23985. llvm-svn: 240989
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CodeGenTypes.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp
index e0f926cabd7..a4a8654eb36 100644
--- a/clang/lib/CodeGen/CodeGenTypes.cpp
+++ b/clang/lib/CodeGen/CodeGenTypes.cpp
@@ -154,14 +154,16 @@ isSafeToConvert(const RecordDecl *RD, CodeGenTypes &CGT,
static bool
isSafeToConvert(QualType T, CodeGenTypes &CGT,
llvm::SmallPtrSet<const RecordDecl*, 16> &AlreadyChecked) {
- T = T.getCanonicalType();
-
+ // Strip off atomic type sugar.
+ if (const auto *AT = T->getAs<AtomicType>())
+ T = AT->getValueType();
+
// If this is a record, check it.
- if (const RecordType *RT = dyn_cast<RecordType>(T))
+ if (const auto *RT = T->getAs<RecordType>())
return isSafeToConvert(RT->getDecl(), CGT, AlreadyChecked);
-
+
// If this is an array, check the elements, which are embedded inline.
- if (const ArrayType *AT = dyn_cast<ArrayType>(T))
+ if (const auto *AT = CGT.getContext().getAsArrayType(T))
return isSafeToConvert(AT->getElementType(), CGT, AlreadyChecked);
// Otherwise, there is no concern about transforming this. We only care about
OpenPOWER on IntegriCloud