Template instantiation for C++ "typeid" expressions.
llvm-svn: 72218
This commit is contained in:
parent
728d41bbb9
commit
aa85d8221c
|
@ -82,7 +82,7 @@ namespace {
|
|||
OwningExprResult VisitCXXThisExpr(CXXThisExpr *E);
|
||||
OwningExprResult VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
|
||||
OwningExprResult VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
|
||||
// FIXME: CXXTypeIdExpr
|
||||
OwningExprResult VisitCXXTypeidExpr(CXXTypeidExpr *E);
|
||||
OwningExprResult VisitCXXThrowExpr(CXXThrowExpr *E);
|
||||
// FIXME: CXXDefaultArgExpr
|
||||
OwningExprResult VisitCXXConstructExpr(CXXConstructExpr *E);
|
||||
|
@ -812,6 +812,38 @@ TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
|
|||
return SemaRef.Owned(TE);
|
||||
}
|
||||
|
||||
Sema::OwningExprResult
|
||||
TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
|
||||
if (E->isTypeOperand()) {
|
||||
QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
|
||||
TemplateArgs,
|
||||
/*FIXME*/E->getSourceRange().getBegin(),
|
||||
DeclarationName());
|
||||
if (T.isNull())
|
||||
return SemaRef.ExprError();
|
||||
|
||||
return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
|
||||
/*FIXME*/E->getSourceRange().getBegin(),
|
||||
true, T.getAsOpaquePtr(),
|
||||
E->getSourceRange().getEnd());
|
||||
}
|
||||
|
||||
OwningExprResult Operand = Visit(E->getExprOperand());
|
||||
if (Operand.isInvalid())
|
||||
return SemaRef.ExprError();
|
||||
|
||||
OwningExprResult Result
|
||||
= SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
|
||||
/*FIXME*/E->getSourceRange().getBegin(),
|
||||
false, Operand.get(),
|
||||
E->getSourceRange().getEnd());
|
||||
if (Result.isInvalid())
|
||||
return SemaRef.ExprError();
|
||||
|
||||
Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
|
||||
return move(Result);
|
||||
}
|
||||
|
||||
Sema::OwningExprResult
|
||||
TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
|
||||
OwningExprResult SubExpr(SemaRef, (void *)0);
|
||||
|
|
|
@ -113,3 +113,29 @@ template struct Throw1<int>;
|
|||
template struct Throw1<int*>;
|
||||
template struct Throw1<Incomplete*>; // expected-note{{instantiation}}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// typeid expressions
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
// FIXME: This should really include <typeinfo>, but we don't have that yet.
|
||||
namespace std {
|
||||
class type_info;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
struct TypeId0 {
|
||||
const std::type_info &f(T* ptr) {
|
||||
if (ptr)
|
||||
return typeid(ptr);
|
||||
else
|
||||
return typeid(T);
|
||||
}
|
||||
};
|
||||
|
||||
struct Abstract {
|
||||
virtual void f() = 0;
|
||||
};
|
||||
|
||||
template struct TypeId0<int>;
|
||||
template struct TypeId0<Incomplete>;
|
||||
template struct TypeId0<Abstract>;
|
||||
|
|
Loading…
Reference in New Issue