]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - contrib/llvm/tools/clang/lib/Sema/MultiInitializer.cpp
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / contrib / llvm / tools / clang / lib / Sema / MultiInitializer.cpp
1 //===--- 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
21 using namespace clang;
22
23 InitListExpr *MultiInitializer::getInitList() const {
24   return cast<InitListExpr>(InitListOrExpressions.get<Expr*>());
25 }
26
27 SourceLocation MultiInitializer::getStartLoc() const {
28   return isInitializerList() ? getInitList()->getLBraceLoc() : LParenLoc;
29 }
30
31 SourceLocation MultiInitializer::getEndLoc() const {
32   return isInitializerList() ? getInitList()->getRBraceLoc() : RParenLoc;
33 }
34
35 MultiInitializer::iterator MultiInitializer::begin() const {
36   return isInitializerList() ? getInitList()->getInits() : getExpressions();
37 }
38
39 MultiInitializer::iterator MultiInitializer::end() const {
40   if (isInitializerList()) {
41     InitListExpr *ILE = getInitList();
42     return ILE->getInits() + ILE->getNumInits();
43   }
44   return getExpressions() + NumInitializers;
45 }
46
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())
52       return true;
53   }
54   return false;
55 }
56
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))
62       return true;
63   }
64   return false;
65 }
66
67 Expr *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
75 ExprResult 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 }