blob: d8944efba3ab0c18e537eeab9caccdf7fa83fe3d [file] [log] [blame]
Sebastian Redl6df65482011-09-24 17:48:25 +00001//===--- MultiInitializer.cpp - Initializer expression group ----*- C++ -*-===//
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//
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
12// initializer.
13//
14//===----------------------------------------------------------------------===//
15
16#include "clang/Sema/MultiInitializer.h"
17#include "clang/Sema/Initialization.h"
18#include "clang/Sema/Sema.h"
19#include "clang/AST/Expr.h"
20
21using namespace clang;
22
23InitListExpr *MultiInitializer::getInitList() const {
24 return cast<InitListExpr>(InitListOrExpressions.get<Expr*>());
25}
26
27SourceLocation MultiInitializer::getStartLoc() const {
28 return isInitializerList() ? getInitList()->getLBraceLoc() : LParenLoc;
29}
30
31SourceLocation MultiInitializer::getEndLoc() const {
32 return isInitializerList() ? getInitList()->getRBraceLoc() : RParenLoc;
33}
34
35MultiInitializer::iterator MultiInitializer::begin() const {
36 return isInitializerList() ? getInitList()->getInits() : getExpressions();
37}
38
39MultiInitializer::iterator MultiInitializer::end() const {
40 if (isInitializerList()) {
41 InitListExpr *ILE = getInitList();
42 return ILE->getInits() + ILE->getNumInits();
43 }
44 return getExpressions() + NumInitializers;
45}
46
47bool MultiInitializer::isTypeDependent() const {
48 if (isInitializerList())
49 return getInitList()->isTypeDependent();
50 for (iterator I = begin(), E = end(); I != E; ++I) {
51 if ((*I)->isTypeDependent())
52 return true;
53 }
54 return false;
55}
56
57bool MultiInitializer::DiagnoseUnexpandedParameterPack(Sema &SemaRef) const {
58 if (isInitializerList())
Peter Collingbourne05b21272011-10-23 18:59:33 +000059 return SemaRef.DiagnoseUnexpandedParameterPack(getInitList(),
60 Sema::UPPC_Initializer);
Sebastian Redl6df65482011-09-24 17:48:25 +000061 for (iterator I = begin(), E = end(); I != E; ++I) {
Peter Collingbourne05b21272011-10-23 18:59:33 +000062 if (SemaRef.DiagnoseUnexpandedParameterPack(*I, Sema::UPPC_Initializer))
Sebastian Redl6df65482011-09-24 17:48:25 +000063 return true;
64 }
65 return false;
66}
67
68Expr *MultiInitializer::CreateInitExpr(ASTContext &Ctx, QualType T) const {
69 if (isInitializerList())
70 return InitListOrExpressions.get<Expr*>();
71
72 return new (Ctx) ParenListExpr(Ctx, LParenLoc, getExpressions(),
73 NumInitializers, RParenLoc, T);
74}
75
76ExprResult MultiInitializer::PerformInit(Sema &SemaRef,
77 InitializedEntity Entity,
78 InitializationKind Kind) const {
79 Expr *Single;
80 Expr **Args;
81 unsigned NumArgs;
82 if (isInitializerList()) {
83 Single = InitListOrExpressions.get<Expr*>();
84 Args = &Single;
85 NumArgs = 1;
86 } else {
87 Args = getExpressions();
88 NumArgs = NumInitializers;
89 }
90 InitializationSequence InitSeq(SemaRef, Entity, Kind, Args, NumArgs);
91 return InitSeq.Perform(SemaRef, Entity, Kind,
92 MultiExprArg(SemaRef, Args, NumArgs), 0);
93}