[clang] 65a961f - [Sema][ObjC] Fix assertion failure in getCommonNonSugarTypeNode
Akira Hatanaka via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 5 10:39:43 PDT 2022
Author: Akira Hatanaka
Date: 2022-10-05T10:38:25-07:00
New Revision: 65a961f719a7ad6db9b608c323a21ed50b4e36ed
URL: https://github.com/llvm/llvm-project/commit/65a961f719a7ad6db9b608c323a21ed50b4e36ed
DIFF: https://github.com/llvm/llvm-project/commit/65a961f719a7ad6db9b608c323a21ed50b4e36ed.diff
LOG: [Sema][ObjC] Fix assertion failure in getCommonNonSugarTypeNode
Instead of checking that the protocols of both types are all equal,
check that the canonical decls are equal.
Added:
Modified:
clang/lib/AST/ASTContext.cpp
clang/test/SemaObjCXX/crash.mm
Removed:
################################################################################
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 461a108915c3a..b9d12e203feef 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -12672,7 +12672,13 @@ static QualType getCommonNonSugarTypeNode(ASTContext &Ctx, const Type *X,
}
case Type::ObjCObject: {
const auto *OX = cast<ObjCObjectType>(X), *OY = cast<ObjCObjectType>(Y);
- assert(llvm::equal(OX->getProtocols(), OY->getProtocols()));
+ assert(
+ std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),
+ OY->getProtocols().begin(), OY->getProtocols().end(),
+ [](const ObjCProtocolDecl *P0, const ObjCProtocolDecl *P1) {
+ return P0->getCanonicalDecl() == P1->getCanonicalDecl();
+ }) &&
+ "protocol lists must be the same");
auto TAs = getCommonTypes(Ctx, OX->getTypeArgsAsWritten(),
OY->getTypeArgsAsWritten());
return Ctx.getObjCObjectType(
diff --git a/clang/test/SemaObjCXX/crash.mm b/clang/test/SemaObjCXX/crash.mm
index 6a7f0fbfc6600..cf55b5733a7bd 100644
--- a/clang/test/SemaObjCXX/crash.mm
+++ b/clang/test/SemaObjCXX/crash.mm
@@ -60,3 +60,11 @@ @protocol InvalidProperties
// expected-error at -3 {{cannot declare variable inside @interface or @protocol}}
@end
+
+// This used to crash.
+ at protocol Property0;
+ at protocol Property0;
+id<Property0> x;
+ at protocol Property0;
+id<Property0> y;
+id<Property0> z = true ? x : y;
More information about the cfe-commits
mailing list