SemaTemplateVariadic.cpp revision c46333550f5787b6d48ca3043e14ba9594cb632d
1//===------- SemaTemplateVariadic.cpp - C++ Variadic Templates ------------===/
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//===----------------------------------------------------------------------===/
8//
9//  This file implements semantic analysis for C++0x variadic templates.
10//===----------------------------------------------------------------------===/
11
12#include "clang/Sema/Sema.h"
13#include "clang/Sema/SemaInternal.h"
14#include "clang/AST/Expr.h"
15#include "clang/AST/TypeLoc.h"
16
17using namespace clang;
18
19bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc,
20                                           TypeSourceInfo *T,
21                                         UnexpandedParameterPackContext UPPC) {
22  // C++0x [temp.variadic]p5:
23  //   An appearance of a name of a parameter pack that is not expanded is
24  //   ill-formed.
25  if (!T->getType()->containsUnexpandedParameterPack())
26    return false;
27
28  // FIXME: Provide the names and locations of the unexpanded parameter packs.
29  Diag(Loc, diag::err_unexpanded_parameter_pack)
30    << (int)UPPC << T->getTypeLoc().getSourceRange();
31  return true;
32}
33
34bool Sema::DiagnoseUnexpandedParameterPack(Expr *E,
35                                           UnexpandedParameterPackContext UPPC) {
36  // C++0x [temp.variadic]p5:
37  //   An appearance of a name of a parameter pack that is not expanded is
38  //   ill-formed.
39  if (!E->containsUnexpandedParameterPack())
40    return false;
41
42  // FIXME: Provide the names and locations of the unexpanded parameter packs.
43  Diag(E->getSourceRange().getBegin(), diag::err_unexpanded_parameter_pack)
44    << (int)UPPC << E->getSourceRange();
45  return true;
46}
47