Home | History | Annotate | Download | only in Sema
      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