diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-11 01:22:35 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-11 01:22:35 +0000 |
commit | 0b209a863208b4a0002f48fc82e514a3012e0593 (patch) | |
tree | 08e0557ab443fe203df15626c6dda00ed20e4a84 /clang/lib/Sema/SemaTemplateInstantiate.cpp | |
parent | 33a004e9eb63929791923b1f96720171f769af87 (diff) | |
download | bcm5719-llvm-0b209a863208b4a0002f48fc82e514a3012e0593.tar.gz bcm5719-llvm-0b209a863208b4a0002f48fc82e514a3012e0593.zip |
Instantiate PredefinedExprs correctly. Patch by Sam Weinig!
llvm-svn: 81498
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 912b965507e..651d4a50dc8 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -391,6 +391,7 @@ namespace { IdentifierInfo *Name, SourceLocation Loc, SourceRange TypeRange); + Sema::OwningExprResult TransformPredefinedExpr(PredefinedExpr *E); Sema::OwningExprResult TransformDeclRefExpr(DeclRefExpr *E); /// \brief Transforms a template type parameter type by performing @@ -451,6 +452,29 @@ TemplateInstantiator::RebuildExceptionDecl(VarDecl *ExceptionDecl, } Sema::OwningExprResult +TemplateInstantiator::TransformPredefinedExpr(PredefinedExpr *E) { + if (!E->isTypeDependent()) + return SemaRef.Owned(E->Retain()); + + FunctionDecl *currentDecl = getSema().getCurFunctionDecl(); + assert(currentDecl && "Must have current function declaration when " + "instantiating."); + + PredefinedExpr::IdentType IT = E->getIdentType(); + + unsigned Length = + PredefinedExpr::ComputeName(getSema().Context, IT, currentDecl).length(); + + llvm::APInt LengthI(32, Length + 1); + QualType ResTy = getSema().Context.CharTy.getQualifiedType(QualType::Const); + ResTy = getSema().Context.getConstantArrayType(ResTy, LengthI, + ArrayType::Normal, 0); + PredefinedExpr *PE = + new (getSema().Context) PredefinedExpr(E->getLocation(), ResTy, IT); + return getSema().Owned(PE); +} + +Sema::OwningExprResult TemplateInstantiator::TransformDeclRefExpr(DeclRefExpr *E) { // FIXME: Clean this up a bit NamedDecl *D = E->getDecl(); |