clang API Documentation

MultiInitializer.cpp
Go to the documentation of this file.
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 }