blob: 8bd2213b5705f47b2fc4f8e3d29d7c64f364d320 [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())
59 return SemaRef.DiagnoseUnexpandedParameterPack(getInitList());
60 for (iterator I = begin(), E = end(); I != E; ++I) {
61 if (SemaRef.DiagnoseUnexpandedParameterPack(*I))
62 return true;
63 }
64 return false;
65}
66
67Expr *MultiInitializer::CreateInitExpr(ASTContext &Ctx, QualType T) const {
68 if (isInitializerList())
69 return InitListOrExpressions.get<Expr*>();
70
71 return new (Ctx) ParenListExpr(Ctx, LParenLoc, getExpressions(),
72 NumInitializers, RParenLoc, T);
73}
74
75ExprResult MultiInitializer::PerformInit(Sema &SemaRef,
76 InitializedEntity Entity,
77 InitializationKind Kind) const {
78 Expr *Single;
79 Expr **Args;
80 unsigned NumArgs;
81 if (isInitializerList()) {
82 Single = InitListOrExpressions.get<Expr*>();
83 Args = &Single;
84 NumArgs = 1;
85 } else {
86 Args = getExpressions();
87 NumArgs = NumInitializers;
88 }
89 InitializationSequence InitSeq(SemaRef, Entity, Kind, Args, NumArgs);
90 return InitSeq.Perform(SemaRef, Entity, Kind,
91 MultiExprArg(SemaRef, Args, NumArgs), 0);
92}