ahatanak created this revision. ahatanak added a reviewer: doug.gregor. ahatanak added a subscriber: cfe-commits.
The assert is triggered when there is a template function whose return type is a protocol without an object type (e.g., "<P1>"). clang treats such a protocol as a synonym for "id<P1>" and sets ObjCObjectTypeLocInfo::HasBaseTypeAsWritten to false in Sema::actOnObjCProtocolQualifierType, which later causes an assert in TreeTransform<Derived>::TransformObjCObjectType. assert(TL.hasBaseTypeAsWritten() && "Can't be dependent"); I'm not sure what hasBaseTypeAsWritten is used for. But it seemed to me that it doesn't necessarily indicate whether the type is a dependent type, so I've removed the assert. http://reviews.llvm.org/D17355 Files: lib/Sema/TreeTransform.h test/SemaObjCXX/base-type-as-written.mm Index: test/SemaObjCXX/base-type-as-written.mm =================================================================== --- /dev/null +++ test/SemaObjCXX/base-type-as-written.mm @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// Make sure we don't crash in TreeTransform<Derived>::TransformObjCObjectType. + +@protocol P1 +@end + +template <class T1><P1> foo1(T1) { // expected-warning {{protocol has no object type specified; defaults to qualified 'id'}} + foo1(0); +} Index: lib/Sema/TreeTransform.h =================================================================== --- lib/Sema/TreeTransform.h +++ lib/Sema/TreeTransform.h @@ -5932,7 +5932,6 @@ } ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); - assert(TL.hasBaseTypeAsWritten() && "Can't be dependent"); NewT.setHasBaseTypeAsWritten(true); NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
Index: test/SemaObjCXX/base-type-as-written.mm =================================================================== --- /dev/null +++ test/SemaObjCXX/base-type-as-written.mm @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// Make sure we don't crash in TreeTransform<Derived>::TransformObjCObjectType. + +@protocol P1 +@end + +template <class T1><P1> foo1(T1) { // expected-warning {{protocol has no object type specified; defaults to qualified 'id'}} + foo1(0); +} Index: lib/Sema/TreeTransform.h =================================================================== --- lib/Sema/TreeTransform.h +++ lib/Sema/TreeTransform.h @@ -5932,7 +5932,6 @@ } ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); - assert(TL.hasBaseTypeAsWritten() && "Can't be dependent"); NewT.setHasBaseTypeAsWritten(true); NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits