Implement checking for template literal operator functions. This

code won't actually get used yet because we don't handle non-type
parameter packs, but when we do, this code should jump in and work.

llvm-svn: 100716
This commit is contained in:
Alexis Hunt 2010-04-07 23:11:06 +00:00
parent 4b1b4205ed
commit 7dd2617e9c
1 changed files with 20 additions and 3 deletions

View File

@ -5044,11 +5044,28 @@ bool Sema::CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl) {
bool Valid = false;
// FIXME: Check for the one valid template signature
// template <char...> type operator "" name();
// template <char...> type operator "" name() is the only valid template
// signature, and the only valid signature with no parameters.
if (FnDecl->param_size() == 0) {
if (FunctionTemplateDecl *TpDecl = FnDecl->getDescribedFunctionTemplate()) {
// Must have only one template parameter
TemplateParameterList *Params = TpDecl->getTemplateParameters();
if (Params->size() == 1) {
NonTypeTemplateParmDecl *PmDecl =
cast<NonTypeTemplateParmDecl>(Params->getParam(0));
if (FunctionDecl::param_iterator Param = FnDecl->param_begin()) {
// The template parameter must be a char parameter pack.
// FIXME: This test will always fail because non-type parameter packs
// have not been implemented.
if (PmDecl && PmDecl->isTemplateParameterPack() &&
Context.hasSameType(PmDecl->getType(), Context.CharTy))
Valid = true;
}
}
} else {
// Check the first parameter
FunctionDecl::param_iterator Param = FnDecl->param_begin();
QualType T = (*Param)->getType();
// unsigned long long int, long double, and any character type are allowed