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 } 93