1 //===--- MultiInitializer.cpp - Initializer expression group ----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the MultiInitializer class, which can represent a list
11 // initializer or a parentheses-wrapped group of expressions in a C++ member
14 //===----------------------------------------------------------------------===//
16 #include "clang/Sema/MultiInitializer.h"
17 #include "clang/Sema/Initialization.h"
18 #include "clang/Sema/Sema.h"
19 #include "clang/AST/Expr.h"
21 using namespace clang;
23 InitListExpr *MultiInitializer::getInitList() const {
24 return cast<InitListExpr>(InitListOrExpressions.get<Expr*>());
27 SourceLocation MultiInitializer::getStartLoc() const {
28 return isInitializerList() ? getInitList()->getLBraceLoc() : LParenLoc;
31 SourceLocation MultiInitializer::getEndLoc() const {
32 return isInitializerList() ? getInitList()->getRBraceLoc() : RParenLoc;
35 MultiInitializer::iterator MultiInitializer::begin() const {
36 return isInitializerList() ? getInitList()->getInits() : getExpressions();
39 MultiInitializer::iterator MultiInitializer::end() const {
40 if (isInitializerList()) {
41 InitListExpr *ILE = getInitList();
42 return ILE->getInits() + ILE->getNumInits();
44 return getExpressions() + NumInitializers;
47 bool MultiInitializer::isTypeDependent() const {
48 if (isInitializerList())
49 return getInitList()->isTypeDependent();
50 for (iterator I = begin(), E = end(); I != E; ++I) {
51 if ((*I)->isTypeDependent())
57 bool MultiInitializer::DiagnoseUnexpandedParameterPack(Sema &SemaRef) const {
58 if (isInitializerList())
59 return SemaRef.DiagnoseUnexpandedParameterPack(getInitList());
60 for (iterator I = begin(), E = end(); I != E; ++I) {
61 if (SemaRef.DiagnoseUnexpandedParameterPack(*I))
67 Expr *MultiInitializer::CreateInitExpr(ASTContext &Ctx, QualType T) const {
68 if (isInitializerList())
69 return InitListOrExpressions.get<Expr*>();
71 return new (Ctx) ParenListExpr(Ctx, LParenLoc, getExpressions(),
72 NumInitializers, RParenLoc, T);
75 ExprResult MultiInitializer::PerformInit(Sema &SemaRef,
76 InitializedEntity Entity,
77 InitializationKind Kind) const {
81 if (isInitializerList()) {
82 Single = InitListOrExpressions.get<Expr*>();
86 Args = getExpressions();
87 NumArgs = NumInitializers;
89 InitializationSequence InitSeq(SemaRef, Entity, Kind, Args, NumArgs);
90 return InitSeq.Perform(SemaRef, Entity, Kind,
91 MultiExprArg(SemaRef, Args, NumArgs), 0);