clang API Documentation
00001 //===--- MultiInitializer.cpp - Initializer expression group ----*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file implements the MultiInitializer class, which can represent a list 00011 // initializer or a parentheses-wrapped group of expressions in a C++ member 00012 // initializer. 00013 // 00014 //===----------------------------------------------------------------------===// 00015 00016 #include "clang/Sema/MultiInitializer.h" 00017 #include "clang/Sema/Initialization.h" 00018 #include "clang/Sema/Sema.h" 00019 #include "clang/AST/Expr.h" 00020 00021 using namespace clang; 00022 00023 InitListExpr *MultiInitializer::getInitList() const { 00024 return cast<InitListExpr>(InitListOrExpressions.get<Expr*>()); 00025 } 00026 00027 SourceLocation MultiInitializer::getStartLoc() const { 00028 return isInitializerList() ? getInitList()->getLBraceLoc() : LParenLoc; 00029 } 00030 00031 SourceLocation MultiInitializer::getEndLoc() const { 00032 return isInitializerList() ? getInitList()->getRBraceLoc() : RParenLoc; 00033 } 00034 00035 MultiInitializer::iterator MultiInitializer::begin() const { 00036 return isInitializerList() ? getInitList()->getInits() : getExpressions(); 00037 } 00038 00039 MultiInitializer::iterator MultiInitializer::end() const { 00040 if (isInitializerList()) { 00041 InitListExpr *ILE = getInitList(); 00042 return ILE->getInits() + ILE->getNumInits(); 00043 } 00044 return getExpressions() + NumInitializers; 00045 } 00046 00047 bool MultiInitializer::isTypeDependent() const { 00048 if (isInitializerList()) 00049 return getInitList()->isTypeDependent(); 00050 for (iterator I = begin(), E = end(); I != E; ++I) { 00051 if ((*I)->isTypeDependent()) 00052 return true; 00053 } 00054 return false; 00055 } 00056 00057 bool MultiInitializer::DiagnoseUnexpandedParameterPack(Sema &SemaRef) const { 00058 if (isInitializerList()) 00059 return SemaRef.DiagnoseUnexpandedParameterPack(getInitList(), 00060 Sema::UPPC_Initializer); 00061 for (iterator I = begin(), E = end(); I != E; ++I) { 00062 if (SemaRef.DiagnoseUnexpandedParameterPack(*I, Sema::UPPC_Initializer)) 00063 return true; 00064 } 00065 return false; 00066 } 00067 00068 Expr *MultiInitializer::CreateInitExpr(ASTContext &Ctx, QualType T) const { 00069 if (isInitializerList()) 00070 return InitListOrExpressions.get<Expr*>(); 00071 00072 return new (Ctx) ParenListExpr(Ctx, LParenLoc, getExpressions(), 00073 NumInitializers, RParenLoc, T); 00074 } 00075 00076 ExprResult MultiInitializer::PerformInit(Sema &SemaRef, 00077 InitializedEntity Entity, 00078 InitializationKind Kind) const { 00079 Expr *Single; 00080 Expr **Args; 00081 unsigned NumArgs; 00082 if (isInitializerList()) { 00083 Single = InitListOrExpressions.get<Expr*>(); 00084 Args = &Single; 00085 NumArgs = 1; 00086 } else { 00087 Args = getExpressions(); 00088 NumArgs = NumInitializers; 00089 } 00090 InitializationSequence InitSeq(SemaRef, Entity, Kind, Args, NumArgs); 00091 return InitSeq.Perform(SemaRef, Entity, Kind, 00092 MultiExprArg(SemaRef, Args, NumArgs), 0); 00093 }