ClassTemplateSpecializationTypes;
llvm::FoldingSet<ObjCQualifiedInterfaceType> ObjCQualifiedInterfaceTypes;
llvm::FoldingSet<ObjCQualifiedIdType> ObjCQualifiedIdTypes;
- llvm::FoldingSet<ObjCQualifiedClassType> ObjCQualifiedClassTypes;
/// ASTRecordLayouts - A cache mapping from RecordDecls to ASTRecordLayouts.
/// This is lazily created. This is intentionally not serialized.
llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*> ASTRecordLayouts;
QualType getObjCQualifiedIdType(ObjCProtocolDecl **ProtocolList,
unsigned NumProtocols);
- /// getObjCQualifiedClassType - Return an ObjCQualifiedClassType for a
- /// given 'Class' and conforming protocol list.
- QualType getObjCQualifiedClassType(ObjCProtocolDecl **ProtocolList,
- unsigned NumProtocols);
/// getTypeOfType - GCC extension.
QualType getTypeOfExpr(Expr *e);
class BuiltinType;
class ObjCInterfaceType;
class ObjCQualifiedIdType;
- class ObjCQualifiedClassType;
class ObjCQualifiedInterfaceType;
class StmtIteratorBase;
class ClassTemplateSpecializationType;
bool isObjCInterfaceType() const; // NSString or NSString<foo>
bool isObjCQualifiedInterfaceType() const; // NSString<foo>
bool isObjCQualifiedIdType() const; // id<foo>
- bool isObjCQualifiedClassType() const; // Class<foo>
bool isTemplateTypeParmType() const; // C++ template type parameter
/// isDependentType - Whether this type is a dependent type, meaning
const ObjCInterfaceType *getAsObjCInterfaceType() const;
const ObjCQualifiedInterfaceType *getAsObjCQualifiedInterfaceType() const;
const ObjCQualifiedIdType *getAsObjCQualifiedIdType() const;
- const ObjCQualifiedClassType *getAsObjCQualifiedClassType() const;
const TemplateTypeParmType *getAsTemplateTypeParmType() const;
const ClassTemplateSpecializationType *
inline bool Type::isObjCQualifiedIdType() const {
return isa<ObjCQualifiedIdType>(CanonicalType.getUnqualifiedType());
}
-inline bool Type::isObjCQualifiedClassType() const {
- return isa<ObjCQualifiedClassType>(CanonicalType.getUnqualifiedType());
-}
inline bool Type::isTemplateTypeParmType() const {
return isa<TemplateTypeParmType>(CanonicalType.getUnqualifiedType());
}
return QualType(QType, 0);
}
-/// getObjCQualifiedClassType - Return an ObjCQualifiedIdType for the 'Class'
-/// decl and the conforming protocol list.
-QualType ASTContext::getObjCQualifiedClassType(ObjCProtocolDecl **Protocols,
- unsigned NumProtocols) {
- // Sort the protocol list alphabetically to canonicalize it.
- SortAndUniqueProtocols(Protocols, NumProtocols);
-
- llvm::FoldingSetNodeID ID;
- ObjCQualifiedIdType::Profile(ID, Protocols, NumProtocols);
-
- void *InsertPos = 0;
- if (ObjCQualifiedClassType *QT =
- ObjCQualifiedClassTypes.FindNodeOrInsertPos(ID, InsertPos))
- return QualType(QT, 0);
-
- // No Match;
- ObjCQualifiedClassType *QType =
- new (*this,8) ObjCQualifiedClassType(Protocols, NumProtocols);
- Types.push_back(QType);
- ObjCQualifiedClassTypes.InsertNode(QType, InsertPos);
- return QualType(QType, 0);
-}
-
/// getTypeOfExpr - Unlike many "get<Type>" functions, we can't unique
/// TypeOfExpr AST's (since expression's are never shared). For example,
/// multiple declarations that refer to "typeof(x)" all contain different
/// to struct), Interface* (pointer to ObjCInterfaceType) and id<P> (qualified
/// ID type).
bool ASTContext::isObjCObjectPointerType(QualType Ty) const {
- if (Ty->isObjCQualifiedIdType() || Ty->isObjCQualifiedClassType())
+ if (Ty->isObjCQualifiedIdType())
return true;
// Blocks are objects.
static bool HasPointerEvalType(const Expr* E) {
return E->getType()->isPointerType()
|| E->getType()->isBlockPointerType()
- || E->getType()->isObjCQualifiedIdType()
- || E->getType()->isObjCQualifiedClassType();
+ || E->getType()->isObjCQualifiedIdType();
}
static bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) {
Profile(ID, &Protocols[0], getNumProtocols());
}
-void ObjCQualifiedClassType::Profile(llvm::FoldingSetNodeID &ID,
- ObjCProtocolDecl **protocols,
- unsigned NumProtocols) {
- for (unsigned i = 0; i != NumProtocols; i++)
- ID.AddPointer(protocols[i]);
-}
-
-void ObjCQualifiedClassType::Profile(llvm::FoldingSetNodeID &ID) {
- Profile(ID, &Protocols[0], getNumProtocols());
-}
-
/// LookThroughTypedefs - Return the ultimate type this typedef corresponds to
/// potentially looking through *all* consequtive typedefs. This returns the
/// sum of the type qualifiers, so if you have:
InnerString = ObjCQIString + InnerString;
}
-void ObjCQualifiedClassType::getAsStringInternal(std::string &InnerString) const
-{
- if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
- InnerString = ' ' + InnerString;
- std::string ObjCQIString = "Class";
- ObjCQIString += '<';
- int num = getNumProtocols();
- for (int i = 0; i < num; i++) {
- ObjCQIString += getProtocols(i)->getNameAsString();
- if (i < num-1)
- ObjCQIString += ',';
- }
- ObjCQIString += '>';
- InnerString = ObjCQIString + InnerString;
-}
-
void TagType::getAsStringInternal(std::string &InnerString) const {
if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
InnerString = ' ' + InnerString;
// a null pointer constant.
if ((lhsType->isPointerType() ||
lhsType->isObjCQualifiedIdType() ||
- lhsType->isObjCQualifiedClassType() ||
lhsType->isBlockPointerType())
&& rExpr->isNullPointerConstant(Context)) {
ImpCastExprToType(rExpr, lhsType);
// id<protocol-list>
Result = Context.getObjCQualifiedIdType((ObjCProtocolDecl**)PQ,
DS.getNumProtocolQualifiers());
- else if (Result == Context.getObjCClassType())
- // Support the following GCC extension: Class<protocol-list>
- Result = Context.getObjCQualifiedClassType((ObjCProtocolDecl**)PQ,
- DS.getNumProtocolQualifiers());
else
Diag(DS.getSourceRange().getBegin(),
diag::warn_ignoring_objc_qualifiers) << DS.getSourceRange();
// GCC doesn't diagnose this.
NotAnObjCObjectType <SomeProtocol> *obj; // expected-warning {{ignoring protocol qualifiers on non-ObjC type}}
-
-// GCC extension (sigh). Found while researching rdar://6497631
-typedef struct objc_class *Class;
-
-Class <SomeProtocol> UnfortunateGCCExtension;
__attribute ((unavailable))
@protocol FwProto; // expected-note{{marked unavailable}}
-Class <FwProto> cFw = 0; // expected-warning {{'FwProto' is unavailable}}
+Class <FwProto> cFw = 0; // expected-warning {{'FwProto' is unavailable}} expected-warning{{ignoring protocol qualifiers on non-ObjC type}}
__attribute ((deprecated)) @protocol MyProto1
-Class <MyProto1> clsP1 = 0; // expected-warning {{'MyProto1' is deprecated}}
+Class <MyProto1> clsP1 = 0; // expected-warning {{'MyProto1' is deprecated}} expected-warning{{ignoring protocol qualifiers on non-ObjC type}}
@protocol FwProto @end // expected-note{{marked unavailable}}