//===--- MultiInitializer.cpp - Initializer expression group ----*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file implements the MultiInitializer class, which can represent a list // initializer or a parentheses-wrapped group of expressions in a C++ member // initializer. // //===----------------------------------------------------------------------===// #include "clang/Sema/MultiInitializer.h" #include "clang/Sema/Initialization.h" #include "clang/Sema/Sema.h" #include "clang/AST/Expr.h" using namespace clang; InitListExpr *MultiInitializer::getInitList() const { return cast(InitListOrExpressions.get()); } SourceLocation MultiInitializer::getStartLoc() const { return isInitializerList() ? getInitList()->getLBraceLoc() : LParenLoc; } SourceLocation MultiInitializer::getEndLoc() const { return isInitializerList() ? getInitList()->getRBraceLoc() : RParenLoc; } MultiInitializer::iterator MultiInitializer::begin() const { return isInitializerList() ? getInitList()->getInits() : getExpressions(); } MultiInitializer::iterator MultiInitializer::end() const { if (isInitializerList()) { InitListExpr *ILE = getInitList(); return ILE->getInits() + ILE->getNumInits(); } return getExpressions() + NumInitializers; } bool MultiInitializer::isTypeDependent() const { if (isInitializerList()) return getInitList()->isTypeDependent(); for (iterator I = begin(), E = end(); I != E; ++I) { if ((*I)->isTypeDependent()) return true; } return false; } bool MultiInitializer::DiagnoseUnexpandedParameterPack(Sema &SemaRef) const { if (isInitializerList()) return SemaRef.DiagnoseUnexpandedParameterPack(getInitList()); for (iterator I = begin(), E = end(); I != E; ++I) { if (SemaRef.DiagnoseUnexpandedParameterPack(*I)) return true; } return false; } Expr *MultiInitializer::CreateInitExpr(ASTContext &Ctx, QualType T) const { if (isInitializerList()) return InitListOrExpressions.get(); return new (Ctx) ParenListExpr(Ctx, LParenLoc, getExpressions(), NumInitializers, RParenLoc, T); } ExprResult MultiInitializer::PerformInit(Sema &SemaRef, InitializedEntity Entity, InitializationKind Kind) const { Expr *Single; Expr **Args; unsigned NumArgs; if (isInitializerList()) { Single = InitListOrExpressions.get(); Args = &Single; NumArgs = 1; } else { Args = getExpressions(); NumArgs = NumInitializers; } InitializationSequence InitSeq(SemaRef, Entity, Kind, Args, NumArgs); return InitSeq.Perform(SemaRef, Entity, Kind, MultiExprArg(SemaRef, Args, NumArgs), 0); }