Template instantiation for C++ "typeid" expressions.

llvm-svn: 72218
This commit is contained in:
Douglas Gregor 2009-05-21 18:34:44 +00:00
parent 728d41bbb9
commit aa85d8221c
2 changed files with 59 additions and 1 deletions

View File

@ -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);

View File

@ -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>;