Skip to content
Snippets Groups Projects
Commit 0880e9f5 authored by Anders Carlsson's avatar Anders Carlsson
Browse files

Instantiation support for more Obj-C expressions, string literals, @selector...

Instantiation support for more Obj-C expressions, string literals, @selector and @protocol expressions.

llvm-svn: 73036
parent 315d2294
No related branches found
No related tags found
No related merge requests found
...@@ -34,6 +34,8 @@ public: ...@@ -34,6 +34,8 @@ public:
explicit ObjCStringLiteral(EmptyShell Empty) explicit ObjCStringLiteral(EmptyShell Empty)
: Expr(ObjCStringLiteralClass, Empty) {} : Expr(ObjCStringLiteralClass, Empty) {}
ObjCStringLiteral* Clone(ASTContext &C) const;
StringLiteral *getString() { return cast<StringLiteral>(String); } StringLiteral *getString() { return cast<StringLiteral>(String); }
const StringLiteral *getString() const { return cast<StringLiteral>(String); } const StringLiteral *getString() const { return cast<StringLiteral>(String); }
void setString(StringLiteral *S) { String = S; } void setString(StringLiteral *S) { String = S; }
...@@ -104,6 +106,8 @@ public: ...@@ -104,6 +106,8 @@ public:
explicit ObjCSelectorExpr(EmptyShell Empty) explicit ObjCSelectorExpr(EmptyShell Empty)
: Expr(ObjCSelectorExprClass, Empty) {} : Expr(ObjCSelectorExprClass, Empty) {}
ObjCSelectorExpr *Clone(ASTContext &C) const;
Selector getSelector() const { return SelName; } Selector getSelector() const { return SelName; }
void setSelector(Selector S) { SelName = S; } void setSelector(Selector S) { SelName = S; }
...@@ -144,6 +148,8 @@ public: ...@@ -144,6 +148,8 @@ public:
explicit ObjCProtocolExpr(EmptyShell Empty) explicit ObjCProtocolExpr(EmptyShell Empty)
: Expr(ObjCProtocolExprClass, Empty) {} : Expr(ObjCProtocolExprClass, Empty) {}
ObjCProtocolExpr *Clone(ASTContext &C) const;
ObjCProtocolDecl *getProtocol() const { return Protocol; } ObjCProtocolDecl *getProtocol() const { return Protocol; }
void setProtocol(ObjCProtocolDecl *P) { Protocol = P; } void setProtocol(ObjCProtocolDecl *P) { Protocol = P; }
......
...@@ -1556,6 +1556,22 @@ ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo, ...@@ -1556,6 +1556,22 @@ ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo,
RBracloc = RBrac; RBracloc = RBrac;
} }
ObjCStringLiteral* ObjCStringLiteral::Clone(ASTContext &C) const {
// Clone the string literal.
StringLiteral *NewString =
String ? cast<StringLiteral>(String)->Clone(C) : 0;
return new (C) ObjCStringLiteral(NewString, getType(), AtLoc);
}
ObjCSelectorExpr *ObjCSelectorExpr::Clone(ASTContext &C) const {
return new (C) ObjCSelectorExpr(getType(), SelName, AtLoc, RParenLoc);
}
ObjCProtocolExpr *ObjCProtocolExpr::Clone(ASTContext &C) const {
return new (C) ObjCProtocolExpr(getType(), Protocol, AtLoc, RParenLoc);
}
// constructor for class messages. // constructor for class messages.
// FIXME: clsName should be typed to ObjCInterfaceType // FIXME: clsName should be typed to ObjCInterfaceType
ObjCMessageExpr::ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo, ObjCMessageExpr::ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo,
......
...@@ -1216,9 +1216,8 @@ TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr( ...@@ -1216,9 +1216,8 @@ TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
// Objective-C Expressions // Objective-C Expressions
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
Sema::OwningExprResult Sema::OwningExprResult
TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) { TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
assert(false && "FIXME: Template instantiations for ObjC expressions"); return SemaRef.Owned(E->Clone(SemaRef.Context));
return SemaRef.ExprError();
} }
Sema::OwningExprResult Sema::OwningExprResult
...@@ -1243,14 +1242,12 @@ TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) { ...@@ -1243,14 +1242,12 @@ TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
Sema::OwningExprResult Sema::OwningExprResult
TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
assert(false && "FIXME: Template instantiations for ObjC expressions"); return SemaRef.Owned(E->Clone(SemaRef.Context));
return SemaRef.ExprError();
} }
Sema::OwningExprResult Sema::OwningExprResult
TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
assert(false && "FIXME: Template instantiations for ObjC expressions"); return SemaRef.Owned(E->Clone(SemaRef.Context));
return SemaRef.ExprError();
} }
Sema::OwningExprResult Sema::OwningExprResult
......
// RUN: clang-cc -fsyntax-only -verify %s // RUN: clang-cc -fsyntax-only -verify %s
// @encode expressions // Obj-C string literal expressions
template <typename T> struct StringTest {
void f() {
(void)@"Hello";
}
};
template struct StringTest<int>;
template struct StringTest<double>;
// @selector expressions
template <typename T> struct SelectorTest {
SEL f() {
return @selector(multiple:arguments:);
}
SEL f2() {
return @selector(multiple:arguments:);
}
};
template <typename T> struct Encode { template struct SelectorTest<int>;
template struct SelectorTest<double>;
// @protocol expressions
@protocol P
@end
template <typename T> struct ProtocolTest {
void f() {
(void)@protocol(P);
}
};
template struct ProtocolTest<int>;
template struct ProtocolTest<double>;
// @encode expressions
template <typename T> struct EncodeTest {
static const char *encode(T t) { static const char *encode(T t) {
return @encode(T); return @encode(T);
} }
}; };
template struct Encode<int>; template struct EncodeTest<int>;
template struct Encode<double>; template struct EncodeTest<double>;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment