SemaInit.cpp revision 9aa472c45d2bd81b7b52c225e8acc560d716db97
10cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===--- SemaInit.cpp - Semantic Analysis for Initializers ----------------===// 20cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 30cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// The LLVM Compiler Infrastructure 40cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 50cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// This file is distributed under the University of Illinois Open Source 60cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// License. See LICENSE.TXT for details. 70cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 80cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===----------------------------------------------------------------------===// 90cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 10dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// This file implements semantic analysis for initializers. The main entry 11dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// point is Sema::CheckInitList(), but all of the work is performed 12dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// within the InitListChecker class. 13dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// 148b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattner// This file also implements Sema::CheckInitializerTypes. 150cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff// 160cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===----------------------------------------------------------------------===// 170cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1820093b4bf698f292c664676987541d5103b65b15Douglas Gregor#include "SemaInit.h" 19c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor#include "Lookup.h" 200cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff#include "Sema.h" 211e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner#include "clang/Lex/Preprocessor.h" 2205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor#include "clang/Parse/Designator.h" 230cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff#include "clang/AST/ASTContext.h" 242078bb9c9336da56ea521e98e718556b227541f6Anders Carlsson#include "clang/AST/ExprCXX.h" 2579e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner#include "clang/AST/ExprObjC.h" 26d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor#include "clang/AST/TypeLoc.h" 2720093b4bf698f292c664676987541d5103b65b15Douglas Gregor#include "llvm/Support/ErrorHandling.h" 28c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor#include <map> 2905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorusing namespace clang; 300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 31dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 32dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Sema Initialization Checking 33dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 34dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 3579e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattnerstatic Expr *IsStringInit(Expr *Init, QualType DeclType, ASTContext &Context) { 368879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner const ArrayType *AT = Context.getAsArrayType(DeclType); 378879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (!AT) return 0; 388879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 398718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT)) 408718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman return 0; 418718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman 428879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // See if this is a string literal or @encode. 438879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner Init = Init->IgnoreParens(); 441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 458879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Handle @encode, which is a narrow string. 468879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType()) 478879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 488879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 498879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Otherwise we can only handle string literals. 508879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner StringLiteral *SL = dyn_cast<StringLiteral>(Init); 51220b6369d7717bfe6894b46cef055d3e763827f2Chris Lattner if (SL == 0) return 0; 52bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman 53bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman QualType ElemTy = Context.getCanonicalType(AT->getElementType()); 548879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // char array can be initialized with a narrow string. 558879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Only allow char x[] = "foo"; not char x[] = L"foo"; 568879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (!SL->isWide()) 57bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman return ElemTy->isCharType() ? Init : 0; 588879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 59bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // wchar_t array can be initialized with a wide string: C99 6.7.8p15 (with 60bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // correction from DR343): "An array with element type compatible with a 61bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // qualified or unqualified version of wchar_t may be initialized by a wide 62bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // string literal, optionally enclosed in braces." 63bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman if (Context.typesAreCompatible(Context.getWCharType(), 64bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman ElemTy.getUnqualifiedType())) 658879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner return 0; 68dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 69dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 7079e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattnerstatic void CheckStringInit(Expr *Str, QualType &DeclT, Sema &S) { 7179e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner // Get the length of the string as parsed. 7279e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner uint64_t StrLength = 7379e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner cast<ConstantArrayType>(Str->getType())->getSize().getZExtValue(); 7479e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner 751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7679e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner const ArrayType *AT = S.Context.getAsArrayType(DeclT); 77dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p14. We have an array of character type with unknown size 79dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // being initialized to a string literal. 80dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner llvm::APSInt ConstVal(32); 8119da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner ConstVal = StrLength; 82dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // Return a new array type (C99 6.7.8p22). 8346a617a792bfab0d9b1e057371ea3b9540802226John McCall DeclT = S.Context.getConstantArrayType(IAT->getElementType(), 8446a617a792bfab0d9b1e057371ea3b9540802226John McCall ConstVal, 8546a617a792bfab0d9b1e057371ea3b9540802226John McCall ArrayType::Normal, 0); 8619da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner return; 87dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner } 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 898718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman const ConstantArrayType *CAT = cast<ConstantArrayType>(AT); 901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 918718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // C99 6.7.8p14. We have an array of character type with known size. However, 928718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // the size may be smaller or larger than the string we are initializing. 938718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // FIXME: Avoid truncation for 64-bit length strings. 948718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (StrLength-1 > CAT->getSize().getZExtValue()) 958718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman S.Diag(Str->getSourceRange().getBegin(), 968718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman diag::warn_initializer_string_for_char_array_too_long) 978718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman << Str->getSourceRange(); 981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 998718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // Set the type to the actual size that we are initializing. If we have 1008718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // something like: 1018718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // char x[1] = "foo"; 1028718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // then this will set the string literal's type to char[1]. 1038718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman Str->setType(DeclT); 104dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 105dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 106dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 107dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Semantic checking for initializer lists. 108dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 109dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 1109e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// @brief Semantic checking for initializer lists. 1119e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1129e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// The InitListChecker class contains a set of routines that each 1139e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// handle the initialization of a certain kind of entity, e.g., 1149e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arrays, vectors, struct/union types, scalars, etc. The 1159e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// InitListChecker itself performs a recursive walk of the subobject 1169e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure of the type to be initialized, while stepping through 1179e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// the initializer list one element at a time. The IList and Index 1189e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// parameters to each of the Check* routines contain the active 1199e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// (syntactic) initializer list and the index into that initializer 1209e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list that represents the current initializer. Each routine is 1219e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// responsible for moving that Index forward as it consumes elements. 1229e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1239e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// Each Check* routine also has a StructuredList/StructuredIndex 1249e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arguments, which contains the current the "structured" (semantic) 1259e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initializer list and the index into that initializer list where we 1269e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// are copying initializers as we map them over to the semantic 1279e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. Once we have completed our recursive walk of the subobject 1289e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure, we will have constructed a full semantic initializer 1299e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. 1309e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1319e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// C99 designators cause changes in the initializer list traversal, 1329e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// because they make the initialization "jump" into a specific 1339e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// subobject and then continue the initialization from that 1349e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// point. CheckDesignatedInitializer() recursively steps into the 1359e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// designated subobject and manages backing out the recursion to 1369e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initialize the subobjects after the one designated. 1378b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattnernamespace { 138c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorclass InitListChecker { 1390820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner Sema &SemaRef; 140c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool hadError; 141c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor std::map<InitListExpr *, InitListExpr *> SyntacticToSemantic; 142c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *FullyStructuredList; 1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1448ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckImplicitInitList(const InitializedEntity &Entity, 145987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, QualType T, 1469e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 147eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 148eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1498ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckExplicitInitList(const InitializedEntity &Entity, 15046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 1519e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 152eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 153eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1548ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckListElementTypes(const InitializedEntity &Entity, 15546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &DeclType, 1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 157c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1589e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 159eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 160eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1618ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckSubElementType(const InitializedEntity &Entity, 16246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType ElemType, 163c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1649e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1659e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckScalarType(const InitializedEntity &Entity, 16746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 168c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1699e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1709e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1718ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckReferenceType(const InitializedEntity &Entity, 1728ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 173930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 174930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 175930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex); 1768ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckVectorType(const InitializedEntity &Entity, 17746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, unsigned &Index, 1789e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1799e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1808ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckStructUnionTypes(const InitializedEntity &Entity, 1812bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, QualType DeclType, 1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator Field, 183c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 1849e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 185eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 186eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1878ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckArrayType(const InitializedEntity &Entity, 188784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 1891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::APSInt elementIndex, 190c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 1919e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1929e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1938ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson bool CheckDesignatedInitializer(const InitializedEntity &Entity, 1949a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, DesignatedInitExpr *DIE, 195711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 1961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &CurrentObjectType, 197c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor RecordDecl::field_iterator *NextField, 198c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor llvm::APSInt *NextElementIndex, 199c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 200c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 201c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &StructuredIndex, 202eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 203eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject); 204c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 205c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor QualType CurrentObjectType, 206c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 207c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned StructuredIndex, 208c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor SourceRange InitRange); 2099e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor void UpdateStructuredListElement(InitListExpr *StructuredList, 2109e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex, 211c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor Expr *expr); 212c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numArrayElements(QualType DeclType); 213c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numStructUnionElements(QualType DeclType); 214930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 215d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor void FillInValueInitForField(unsigned Init, FieldDecl *Field, 216d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 217d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 218cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor void FillInValueInitializations(const InitializedEntity &Entity, 219cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 220c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorpublic: 221cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker(Sema &S, const InitializedEntity &Entity, 222cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *IL, QualType &T); 223c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool HadError() { return hadError; } 224c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 225c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // @brief Retrieves the fully-structured initializer list used for 226c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // semantic analysis and code generation. 227c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } 228c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor}; 2298b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattner} // end anonymous namespace 23068355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 231d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregorvoid InitListChecker::FillInValueInitForField(unsigned Init, FieldDecl *Field, 232d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 233d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, 234d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor bool &RequiresSecondPass) { 235d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 236d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned NumInits = ILE->getNumInits(); 237d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializedEntity MemberEntity 238d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitializedEntity::InitializeMember(Field, &ParentEntity); 239d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 240d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // FIXME: We probably don't need to handle references 241d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // specially here, since value-initialization of references is 242d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // handled in InitializationSequence. 243d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->getType()->isReferenceType()) { 244d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // C++ [dcl.init.aggr]p9: 245d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // If an incomplete or empty initializer-list leaves a 246d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // member of reference type uninitialized, the program is 247d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // ill-formed. 248d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized) 249d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << Field->getType() 250d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << ILE->getSyntacticForm()->getSourceRange(); 251d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Field->getLocation(), 252d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor diag::note_uninit_reference_member); 253d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 254d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 255d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 256d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 257d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 258d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor true); 259d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationSequence InitSeq(SemaRef, MemberEntity, Kind, 0, 0); 260d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (!InitSeq) { 261d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitSeq.Diagnose(SemaRef, MemberEntity, Kind, 0, 0); 262d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 263d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 264d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 265d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 266d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Sema::OwningExprResult MemberInit 267d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitSeq.Perform(SemaRef, MemberEntity, Kind, 268d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Sema::MultiExprArg(SemaRef, 0, 0)); 269d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (MemberInit.isInvalid()) { 270d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 271d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 272d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 273d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 274d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) { 275d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Do nothing 276d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (Init < NumInits) { 277d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->setInit(Init, MemberInit.takeAs<Expr>()); 278d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitSeq.getKind() 279d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor == InitializationSequence::ConstructorInitialization) { 280d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Value-initialization requires a constructor call, so 281d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // extend the initializer list to include the constructor 282d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // call and make a note that we'll need to take another pass 283d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // through the initializer list. 284ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek ILE->updateInit(Init, MemberInit.takeAs<Expr>()); 285d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass = true; 286d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 287d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitListExpr *InnerILE 288d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 289d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitializations(MemberEntity, InnerILE, 290d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass); 291d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor} 292d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 2934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Recursively replaces NULL values within the given initializer list 2944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// with expressions that perform value-initialization of the 2954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// appropriate type. 296cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregorvoid 297cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::FillInValueInitializations(const InitializedEntity &Entity, 298cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, 299cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool &RequiresSecondPass) { 3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((ILE->getType() != SemaRef.Context.VoidTy) && 301930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor "Should not have void type"); 30287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 30387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (ILE->getSyntacticForm()) 30487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor Loc = ILE->getSyntacticForm()->getSourceRange().getBegin(); 3051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3066217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) { 307d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion() && 308d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->getInitializedFieldInUnion()) 309d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(0, ILE->getInitializedFieldInUnion(), 310d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Entity, ILE, RequiresSecondPass); 311d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor else { 312d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned Init = 0; 313d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor for (RecordDecl::field_iterator 314d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field = RType->getDecl()->field_begin(), 315d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FieldEnd = RType->getDecl()->field_end(); 316d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field != FieldEnd; ++Field) { 317d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->isUnnamedBitfield()) 318d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor continue; 319d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 320d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 32187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 32287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 323d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(Init, *Field, Entity, ILE, RequiresSecondPass); 324d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 325cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 326cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 327d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ++Init; 328d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 329d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Only look at the first initialization of a union. 330d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion()) 331d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor break; 332d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 3334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 3344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 3361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType ElementType; 3391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 340cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializedEntity ElementEntity = Entity; 34187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumInits = ILE->getNumInits(); 34287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumElements = NumInits; 3430820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) { 3444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = AType->getElementType(); 34587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) 34687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = CAType->getSize().getZExtValue(); 347cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 348cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 349183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) { 3504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = VType->getElementType(); 35187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = VType->getNumElements(); 352cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 353cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 3541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else 3554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = ILE->getType(); 3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 357cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 35887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor for (unsigned Init = 0; Init != NumElements; ++Init) { 35916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (hadError) 36016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return; 36116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 362d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement || 363d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson ElementEntity.getKind() == InitializedEntity::EK_VectorElement) 364cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity.setElementIndex(Init); 365cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 36687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 367cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 368cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor true); 369cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationSequence InitSeq(SemaRef, ElementEntity, Kind, 0, 0); 370cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!InitSeq) { 371cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitSeq.Diagnose(SemaRef, ElementEntity, Kind, 0, 0); 37287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor hadError = true; 37387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 37487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 37587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 376cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor Sema::OwningExprResult ElementInit 377cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor = InitSeq.Perform(SemaRef, ElementEntity, Kind, 378cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor Sema::MultiExprArg(SemaRef, 0, 0)); 379cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (ElementInit.isInvalid()) { 38016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor hadError = true; 381cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 382cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 383cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 384cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (hadError) { 385cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Do nothing 386cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (Init < NumInits) { 387cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ILE->setInit(Init, ElementInit.takeAs<Expr>()); 388cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (InitSeq.getKind() 389cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor == InitializationSequence::ConstructorInitialization) { 390cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Value-initialization requires a constructor call, so 391cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // extend the initializer list to include the constructor 392cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // call and make a note that we'll need to take another pass 393cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // through the initializer list. 394ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek ILE->updateInit(Init, ElementInit.takeAs<Expr>()); 395cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass = true; 396cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 397ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else if (InitListExpr *InnerILE 398cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 399cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(ElementEntity, InnerILE, RequiresSecondPass); 4004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 4014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 4024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 40368355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 404cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity, 405cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *IL, QualType &T) 4060820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner : SemaRef(S) { 4070cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff hadError = false; 408c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 409b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman unsigned newIndex = 0; 4104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FullyStructuredList 412ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor = getStructuredSubobjectInit(IL, newIndex, T, 0, 0, IL->getSourceRange()); 4138ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckExplicitInitList(Entity, IL, T, newIndex, 41446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson FullyStructuredList, newStructuredIndex, 415eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor /*TopLevelObject=*/true); 416c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 417cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!hadError) { 418cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool RequiresSecondPass = false; 419cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, RequiresSecondPass); 42016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (RequiresSecondPass && !hadError) 421cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, 422cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass); 423cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 4240cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4250cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4260cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numArrayElements(QualType DeclType) { 427638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // FIXME: use a proper constant 428638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman int maxElements = 0x7FFFFFFF; 429c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = 4300820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 4310cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = static_cast<int>(CAT->getSize().getZExtValue()); 4320cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 4330cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return maxElements; 4340cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4350cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4360cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numStructUnionElements(QualType DeclType) { 4376217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl(); 4384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor int InitializableMembers = 0; 4391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (RecordDecl::field_iterator 44017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = structDecl->field_begin(), 44117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = structDecl->field_end(); 4424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Field != FieldEnd; ++Field) { 4434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if ((*Field)->getIdentifier() || !(*Field)->isBitField()) 4444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++InitializableMembers; 4454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 44639ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (structDecl->isUnion()) 447f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return std::min(InitializableMembers, 1); 448f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return InitializableMembers - structDecl->hasFlexibleArrayMember(); 4490cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4500cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4518ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity, 452987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, 4534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType T, unsigned &Index, 4544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 455eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 456eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 4570cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff int maxElements = 0; 4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4590cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (T->isArrayType()) 4600cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numArrayElements(T); 4610cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else if (T->isStructureType() || T->isUnionType()) 4620cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numStructUnionElements(T); 463b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman else if (T->isVectorType()) 464183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall maxElements = T->getAs<VectorType>()->getNumElements(); 4650cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else 4660cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff assert(0 && "CheckImplicitInitList(): Illegal type"); 467b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 468402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman if (maxElements == 0) { 4690820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(ParentIList->getInit(Index)->getLocStart(), 470402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman diag::err_implicit_empty_initializer); 4714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 472402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman hadError = true; 473402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman return; 474402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman } 475402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman 4764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Build a structured initializer list corresponding to this subobject. 4774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredSubobjectInitList 4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList, 4791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredIndex, 480ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor SourceRange(ParentIList->getInit(Index)->getSourceRange().getBegin(), 481ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor ParentIList->getSourceRange().getEnd())); 4824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredSubobjectInitIndex = 0; 4834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 4844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Check the element types and build the structural subobject. 48587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned StartIndex = Index; 486987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson CheckListElementTypes(Entity, ParentIList, T, 487987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredSubobjectInitList, 489eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredSubobjectInitIndex, 490eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 49187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1); 492a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor StructuredSubobjectInitList->setType(T); 493a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor 494ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor // Update the structured sub-object initializer so that it's ending 49587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor // range corresponds with the end of the last initializer it used. 49687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (EndIndex < ParentIList->getNumInits()) { 4971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation EndLoc 49887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor = ParentIList->getInit(EndIndex)->getSourceRange().getEnd(); 49987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor StructuredSubobjectInitList->setRBraceLoc(EndLoc); 50087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 5011e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner 5021e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner // Warn about missing braces. 5031e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner if (T->isArrayType() || T->isRecordType()) { 50447f164e15b9358b51ae65f8249d56842f8750767Tanya Lattner SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), 50547f164e15b9358b51ae65f8249d56842f8750767Tanya Lattner diag::warn_missing_braces) 5061e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner << StructuredSubobjectInitList->getSourceRange() 5071e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner << CodeModificationHint::CreateInsertion( 5081e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner StructuredSubobjectInitList->getLocStart(), 50947f164e15b9358b51ae65f8249d56842f8750767Tanya Lattner "{") 5101e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner << CodeModificationHint::CreateInsertion( 5111e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner SemaRef.PP.getLocForEndOfToken( 5121dcd061f7209f227d785043bd4a75e427d851abeTanya Lattner StructuredSubobjectInitList->getLocEnd()), 5131dcd061f7209f227d785043bd4a75e427d851abeTanya Lattner "}"); 5141e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner } 5150cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5160cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5178ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, 51846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 5194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 521eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 522eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 523c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman assert(IList->isExplicit() && "Illegal Implicit InitListExpr"); 5244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = StructuredList; 5254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList->setSyntacticForm(IList); 52646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true, 52746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson Index, StructuredList, StructuredIndex, TopLevelObject); 5282c79281ef66cb5001f0ebadf6b317250c21a1c01Douglas Gregor IList->setType(T.getNonReferenceType()); 5292c79281ef66cb5001f0ebadf6b317250c21a1c01Douglas Gregor StructuredList->setType(T.getNonReferenceType()); 530638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (hadError) 531638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 532c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 533638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (Index < IList->getNumInits()) { 534c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman // We have leftover initializers 535e540858b289b23653bcb23646f135729203635cbEli Friedman if (StructuredIndex == 1 && 536e540858b289b23653bcb23646f135729203635cbEli Friedman IsStringInit(StructuredList->getInit(0), T, SemaRef.Context)) { 5377c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers_in_char_array_initializer; 538e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 5397c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor DK = diag::err_excess_initializers_in_char_array_initializer; 540e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 541e540858b289b23653bcb23646f135729203635cbEli Friedman } 542bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman // Special-case 5430820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 544dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getInit(Index)->getSourceRange(); 545d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman } else if (!T->isIncompleteType()) { 546b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // Don't complain for incomplete types, since we'll get an error 547b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // elsewhere 548eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType CurrentObjectType = StructuredList->getType(); 5491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int initKind = 550eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isArrayType()? 0 : 551eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isVectorType()? 1 : 552eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isScalarType()? 2 : 553eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isUnionType()? 3 : 554eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 4; 5557c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 5567c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers; 557e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 558e540858b289b23653bcb23646f135729203635cbEli Friedman DK = diag::err_excess_initializers; 5590863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman hadError = true; 5600863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman } 5610863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman if (SemaRef.getLangOptions().OpenCL && initKind == 1) { 5620863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman DK = diag::err_excess_initializers; 563e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 564e540858b289b23653bcb23646f135729203635cbEli Friedman } 5657c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 5660820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 567eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << initKind << IList->getInit(Index)->getSourceRange(); 568c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 569c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 570cda25a977e4b7fe4e080b87586410eaeab7b62f6Eli Friedman 571759f25237864f3a3cc23eb01f0c0ce6edcc9342dEli Friedman if (T->isScalarType() && !TopLevelObject) 5720820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::warn_braces_around_scalar_init) 573a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor << IList->getSourceRange() 57429d9c1adfadf65e2d847d44bec37746844b9e0e3Chris Lattner << CodeModificationHint::CreateRemoval(IList->getLocStart()) 57529d9c1adfadf65e2d847d44bec37746844b9e0e3Chris Lattner << CodeModificationHint::CreateRemoval(IList->getLocEnd()); 5760cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5770cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5788ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckListElementTypes(const InitializedEntity &Entity, 57946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 5801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &DeclType, 58187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool SubobjectIsDesignatorContext, 5824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 584eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 585eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 586c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (DeclType->isScalarType()) { 58746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, DeclType, Index, 58846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 589c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (DeclType->isVectorType()) { 59046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckVectorType(Entity, IList, DeclType, Index, 59146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 592d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor } else if (DeclType->isAggregateType()) { 593d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor if (DeclType->isRecordType()) { 5946217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 5952bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson CheckStructUnionTypes(Entity, IList, DeclType, RD->field_begin(), 5964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubobjectIsDesignatorContext, Index, 597eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 598eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 59987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } else if (DeclType->isArrayType()) { 600f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor llvm::APSInt Zero( 6010820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()), 602f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor false); 603784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson CheckArrayType(Entity, IList, DeclType, Zero, 604784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson SubobjectIsDesignatorContext, Index, 6054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 606ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else 6074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor assert(0 && "Aggregate that isn't a structure or array?!"); 608613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff } else if (DeclType->isVoidType() || DeclType->isFunctionType()) { 609613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff // This type is invalid, issue a diagnostic. 6104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 6110820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 612d162584991885ab004a02573a73ce06422b921fcChris Lattner << DeclType; 613d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman hadError = true; 614930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isRecordType()) { 615930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init]p14: 616930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] If the class is an aggregate (8.5.1), and the initializer 617930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // is a brace-enclosed list, see 8.5.1. 618930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 619930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Note: 8.5.1 is handled below; here, we diagnose the case where 620930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // we have an initializer list and a destination type that is not 621930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an aggregate. 622930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // FIXME: In C++0x, this is yet another form of initialization. 6230820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 624930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType << IList->getSourceRange(); 625930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 626930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isReferenceType()) { 6278ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, DeclType, Index, 6288ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 6290cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } else { 6300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // In C, all types are either scalars or aggregates, but 6311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // additional handling is needed here for C++ (and possibly others?). 6320cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff assert(0 && "Unsupported initializer type"); 6330cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 6340cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6350cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6368ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckSubElementType(const InitializedEntity &Entity, 63746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 6381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElemType, 6394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 6404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 6414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 6426fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 643c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) { 644c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman unsigned newIndex = 0; 6454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 6461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *newStructuredList 6474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor = getStructuredSubobjectInit(IList, Index, ElemType, 6484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex, 6494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubInitList->getSourceRange()); 65046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckExplicitInitList(Entity, SubInitList, ElemType, newIndex, 6514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor newStructuredList, newStructuredIndex); 6524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 6534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 65479e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner } else if (Expr *Str = IsStringInit(expr, ElemType, SemaRef.Context)) { 65579e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner CheckStringInit(Str, ElemType, SemaRef); 656f71ae8d8024561f92dd7916363e7a791684563ccChris Lattner UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 6574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 658c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (ElemType->isScalarType()) { 65946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, ElemType, Index, 66046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 661930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (ElemType->isReferenceType()) { 6628ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, ElemType, Index, 6638ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 664b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman } else { 6650820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (SemaRef.getLangOptions().CPlusPlus) { 666930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 667930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // All implicit type conversions (clause 4) are considered when 668930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // initializing the aggregate member with an ini- tializer from 669930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an initializer-list. If the initializer can initialize a 670930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // member, the member is initialized. [...] 6711b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 6721b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson // FIXME: Better EqualLoc? 6731b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationKind Kind = 6741b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationKind::CreateCopy(expr->getLocStart(), SourceLocation()); 6751b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationSequence Seq(SemaRef, Entity, Kind, &expr, 1); 6761b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 6771b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson if (Seq) { 6781b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Sema::OwningExprResult Result = 6791b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Seq.Perform(SemaRef, Entity, Kind, 6801b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Sema::MultiExprArg(SemaRef, (void **)&expr, 1)); 6811b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson if (Result.isInvalid()) 682930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 6831b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 6841b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson UpdateStructuredListElement(StructuredList, StructuredIndex, 6851b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Result.takeAs<Expr>()); 686930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 687930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 688930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 689930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 690930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Fall through for subaggregate initialization 691930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p13: 693930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 694930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // The initializer for a structure or union object that has 695930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // automatic storage duration shall be either an initializer 696930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // list as described below, or a single expression that has 697930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // compatible structure or union type. In the latter case, the 698930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // initial value of the object, including unnamed members, is 699930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // that of the expression. 7006b5374f837f925d99b1a76bc2fe8c98c1698df7fEli Friedman if ((ElemType->isRecordType() || ElemType->isVectorType()) && 7018718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman SemaRef.Context.hasSameUnqualifiedType(expr->getType(), ElemType)) { 702930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 703930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 704930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 705930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 706930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 707930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Fall through for subaggregate initialization 708930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 709930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 710930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 7111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 712930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] Otherwise, if the member is itself a non-empty 713930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // subaggregate, brace elision is assumed and the initializer is 714930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // considered for the initialization of the first member of 715930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // the subaggregate. 716930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (ElemType->isAggregateType() || ElemType->isVectorType()) { 717987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList, 718930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor StructuredIndex); 719930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 720930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 721930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // We cannot initialize this element, so let 722930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // PerformCopyInitialization produce the appropriate diagnostic. 723ca755fe38f00d63363b3a3ac2a1ae6c1eb2957f9Anders Carlsson SemaRef.PerformCopyInitialization(Entity, SourceLocation(), 724ca755fe38f00d63363b3a3ac2a1ae6c1eb2957f9Anders Carlsson SemaRef.Owned(expr)); 725ca755fe38f00d63363b3a3ac2a1ae6c1eb2957f9Anders Carlsson IList->setInit(Index, 0); 726930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 727930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 728930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 729930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 730930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 731b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman} 732b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 7338ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckScalarType(const InitializedEntity &Entity, 73446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 7356fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned &Index, 7364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 7374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 7380cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 7396fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 740c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (isa<InitListExpr>(expr)) { 7410820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 742dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner diag::err_many_braces_around_scalar_init) 743dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getSourceRange(); 744bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman hadError = true; 745bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman ++Index; 7464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 747bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 74805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } else if (isa<DesignatedInitExpr>(expr)) { 7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(expr->getSourceRange().getBegin(), 75005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor diag::err_designator_for_scalar_init) 75105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << DeclType << expr->getSourceRange(); 75205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 75305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Index; 7544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 75505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return; 7560cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 75705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 758c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson Sema::OwningExprResult Result = 759a1635d9b468709d47b6c533cc82bdabf34f560b8Eli Friedman SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 760a1635d9b468709d47b6c533cc82bdabf34f560b8Eli Friedman SemaRef.Owned(expr)); 761c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson 762b571924f32590f026889f227f03570e59e5c29b7Chandler Carruth Expr *ResultExpr = 0; 763c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson 764c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson if (Result.isInvalid()) 765bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman hadError = true; // types weren't compatible. 766c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson else { 767c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson ResultExpr = Result.takeAs<Expr>(); 768c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson 769c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson if (ResultExpr != expr) { 770c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson // The type was promoted, update initializer list. 771c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson IList->setInit(Index, ResultExpr); 772c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson } 77305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 7744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (hadError) 7754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 7764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 777c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 7780cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 779bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman } else { 7800820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_empty_scalar_initializer) 781dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getSourceRange(); 782bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman hadError = true; 7834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 7844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 785bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 7860cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 7870cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 7880cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 7898ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckReferenceType(const InitializedEntity &Entity, 7908ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 791930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 792930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 793930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex) { 794930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (Index < IList->getNumInits()) { 795930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor Expr *expr = IList->getInit(Index); 796930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (isa<InitListExpr>(expr)) { 7970820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 798930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType << IList->getSourceRange(); 799930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 800930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 801930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 802930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 8031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 804930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 805a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson Sema::OwningExprResult Result = 806a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 807a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson SemaRef.Owned(expr)); 808a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 809a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson if (Result.isInvalid()) 810930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 811a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 812a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson expr = Result.takeAs<Expr>(); 813a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson IList->setInit(Index, expr); 814a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 815930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (hadError) 816930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 817930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor else 818930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 819930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 820930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 821390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: It would be wonderful if we could point at the actual member. In 822390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // general, it would be useful to pass location information down the stack, 823390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // so that we know the location (or decl) of the "current object" being 824390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // initialized. 8251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getLocStart(), 826930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor diag::err_init_reference_member_uninitialized) 827930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType 828930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << IList->getSourceRange(); 829930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 830930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 831930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 832930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 833930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 834930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor} 835930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 8368ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckVectorType(const InitializedEntity &Entity, 83746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 8384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 8394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 8404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 8410cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 842183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VT = DeclType->getAs<VectorType>(); 8432ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned maxElements = VT->getNumElements(); 8442ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned numEltsInit = 0; 8450cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff QualType elementType = VT->getElementType(); 8461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8472ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (!SemaRef.getLangOptions().OpenCL) { 8488ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 8498ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 8508ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8518ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { 8528ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Don't attempt to go past the end of the init list 8538ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (Index >= IList->getNumInits()) 8548ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson break; 85546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson 8568ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson ElementEntity.setElementIndex(Index); 8578ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 8588ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 8598ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson } 8602ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } else { 8618ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 8628ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 8638ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8642ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman // OpenCL initializers allows vectors to be constructed from vectors. 8652ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman for (unsigned i = 0; i < maxElements; ++i) { 8662ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman // Don't attempt to go past the end of the init list 8672ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (Index >= IList->getNumInits()) 8682ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman break; 8698ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8708ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson ElementEntity.setElementIndex(Index); 8718ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8722ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman QualType IType = IList->getInit(Index)->getType(); 8732ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (!IType->isVectorType()) { 8748ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 8752ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman StructuredList, StructuredIndex); 8762ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman ++numEltsInit; 8772ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } else { 878183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *IVT = IType->getAs<VectorType>(); 8792ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned numIElts = IVT->getNumElements(); 8802ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman QualType VecType = SemaRef.Context.getExtVectorType(elementType, 8812ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman numIElts); 8828ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, VecType, Index, 8832ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman StructuredList, StructuredIndex); 8842ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman numEltsInit += numIElts; 8852ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 8862ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 8870cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 8881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8892ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman // OpenCL & AltiVec require all elements to be initialized. 8902ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (numEltsInit != maxElements) 8912ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (SemaRef.getLangOptions().OpenCL || SemaRef.getLangOptions().AltiVec) 8922ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SemaRef.Diag(IList->getSourceRange().getBegin(), 8932ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman diag::err_vector_incorrect_num_initializers) 8942ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman << (numEltsInit < maxElements) << maxElements << numEltsInit; 8950cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 8960cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 8970cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 8988ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckArrayType(const InitializedEntity &Entity, 899784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 90087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt elementIndex, 9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 9024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 9034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 9044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 9050cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // Check for the special-case of initializing an array with a string. 9060cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 90779e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner if (Expr *Str = IsStringInit(IList->getInit(Index), DeclType, 90879e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner SemaRef.Context)) { 90979e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner CheckStringInit(Str, DeclType, SemaRef); 9104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We place the string literal directly into the resulting 9114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initializer list. This is the only place where the structure 9124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // of the structured initializer list doesn't match exactly, 9134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // because doing so would involve allocating one character 9144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // constant for each string. 915f71ae8d8024561f92dd7916363e7a791684563ccChris Lattner UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 9160820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner StructuredList->resizeInits(SemaRef.Context, StructuredIndex); 9170cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 9180cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return; 9190cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 9200cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 921c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const VariableArrayType *VAT = 9220820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsVariableArrayType(DeclType)) { 923638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // Check for VLAs; in standard C it would be possible to check this 924638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // earlier, but I don't know where clang accepts VLAs (gcc accepts 925638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // them in all sorts of strange places). 9260820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(VAT->getSizeExpr()->getLocStart(), 927dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner diag::err_variable_object_no_init) 928dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << VAT->getSizeExpr()->getSourceRange(); 929638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman hadError = true; 9304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 9314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 932638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 933638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman } 934638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman 93505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We might know the maximum number of elements in advance. 9364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor llvm::APSInt maxElements(elementIndex.getBitWidth(), 9374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor elementIndex.isUnsigned()); 93805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool maxElementsKnown = false; 93905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (const ConstantArrayType *CAT = 9400820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 94105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = CAT->getSize(); 942f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor elementIndex.extOrTrunc(maxElements.getBitWidth()); 943e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 94405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElementsKnown = true; 94505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 94605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 9470820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner QualType elementType = SemaRef.Context.getAsArrayType(DeclType) 948c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner ->getElementType(); 94905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 95005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 95105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 95287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 95387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 95487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 95587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 95687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 95787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 95887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. elementIndex will be 95987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // updated to be the next array element we'll initialize. 9609a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 9614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, 0, &elementIndex, Index, 962eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, true, 963eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) { 96405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 96587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor continue; 96687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 96787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 968f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor if (elementIndex.getBitWidth() > maxElements.getBitWidth()) 969f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor maxElements.extend(elementIndex.getBitWidth()); 970f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor else if (elementIndex.getBitWidth() < maxElements.getBitWidth()) 971f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor elementIndex.extend(maxElements.getBitWidth()); 972e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 973f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor 97487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If the array is of incomplete type, keep track of the number of 97587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // elements in the initializer. 97687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 97787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor maxElements = elementIndex; 97805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 97905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 98005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 98105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 98205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we know the maximum number of elements, and we've already 98305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // hit it, stop consuming elements in the initializer list. 98405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElementsKnown && elementIndex == maxElements) 9850cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff break; 98605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 9878ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 988784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex, 9898ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson Entity); 9908ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Check this element. 9918ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 9928ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 99305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++elementIndex; 99405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 99505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If the array is of incomplete type, keep track of the number of 99605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // elements in the initializer. 99705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 99805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = elementIndex; 9990cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1000587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman if (!hadError && DeclType->isIncompleteArrayType()) { 10010cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // If this is an incomplete array type, the actual type needs to 1002396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // be calculated here. 1003e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned()); 100405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElements == Zero) { 1005396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // Sizing an array implicitly to zero is not allowed by ISO C, 1006396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // but is supported by GNU. 10070820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 1008396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar diag::ext_typecheck_zero_array_size); 10090cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1010396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar 10111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements, 1012396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar ArrayType::Normal, 0); 10130cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 10140cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 10150cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 10168ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, 10172bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, 10181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType DeclType, 101987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator Field, 10201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 10214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 10224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 1023eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 1024eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 10256217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl* structDecl = DeclType->getAs<RecordType>()->getDecl(); 10261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1027b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // If the record is invalid, some of it's members are invalid. To avoid 1028b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // confusion, we forgo checking the intializer for the entire record. 1029b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman if (structDecl->isInvalidDecl()) { 1030b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman hadError = true; 1031b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman return; 10321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 10333498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 10343498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (DeclType->isUnionType() && IList->getNumInits() == 0) { 10353498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor // Value-initialize the first named member of the union. 10366217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 103717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator FieldEnd = RD->field_end(); 10383498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor Field != FieldEnd; ++Field) { 10393498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (Field->getDeclName()) { 10403498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 10413498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor break; 10423498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10433498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10443498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return; 10453498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10463498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 104705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If structDecl is a forward declaration, this loop won't do 104805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // anything except look at designated initializers; That's okay, 104905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // because an error should get printed out elsewhere. It might be 105005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // worthwhile to skip over the rest of the initializer, though. 10516217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 105217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RecordDecl::field_iterator FieldEnd = RD->field_end(); 1053dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor bool InitializedSomething = false; 105480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall bool CheckForMissingFields = true; 105505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 105605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 105705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 105805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 105987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 106087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 106187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 106287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 106387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 106487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 106587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. Field will be updated to 106687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the next field that we'll be initializing. 10679a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 10684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, &Field, 0, Index, 1069eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 1070eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, TopLevelObject)) 107105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 107205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1073dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 107480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 107580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Disable check for missing fields when designators are used. 107680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // This matches gcc behaviour. 107780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall CheckForMissingFields = false; 107805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 107905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 108005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 108105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field == FieldEnd) { 108205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We've run out of fields. We're done. 108344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor break; 108405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 108544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1086dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor // We've already initialized a member of a union. We're done. 1087dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor if (InitializedSomething && DeclType->isUnionType()) 1088dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor break; 1089dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor 109005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we've hit the flexible array member at the end, we're done. 109105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field->getType()->isIncompleteArrayType()) 1092b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman break; 109344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 10940bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (Field->isUnnamedBitfield()) { 10954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Don't initialize unnamed bitfields, e.g. "int : 20;" 109605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 1097b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman continue; 10980cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 109944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 11008ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 11018ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 11028ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 11038ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 1104dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 11050bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 11060bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (DeclType->isUnionType()) { 11070bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor // Initialize the first field within the union. 11080bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 11090bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 111005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 111105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 11120cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 111344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 111480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Emit warnings for missing struct field initializers. 111580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall if (CheckForMissingFields && Field != FieldEnd && 111680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall !Field->getType()->isIncompleteArrayType() && !DeclType->isUnionType()) { 111780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // It is possible we have one or more unnamed bitfields remaining. 111880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Find first (if any) named field and emit warning. 111980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall for (RecordDecl::field_iterator it = Field, end = RD->field_end(); 112080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall it != end; ++it) { 112180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall if (!it->isUnnamedBitfield()) { 112280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall SemaRef.Diag(IList->getSourceRange().getEnd(), 112380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall diag::warn_missing_field_initializers) << it->getName(); 112480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall break; 112580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 112680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 112780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 112880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 11291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() || 1130a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor Index >= IList->getNumInits()) 1131eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return; 1132eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1133eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Handle GNU flexible array initializers. 11341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!TopLevelObject && 1135a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor (!isa<InitListExpr>(IList->getInit(Index)) || 1136a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor cast<InitListExpr>(IList->getInit(Index))->getNumInits() > 0)) { 11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getInit(Index)->getSourceRange().getBegin(), 1138eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_nonempty) 1139eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << IList->getInit(Index)->getSourceRange().getBegin(); 11400820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1141eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1142eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor hadError = true; 1143a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor ++Index; 1144a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor return; 1145a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor } else { 11461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getInit(Index)->getSourceRange().getBegin(), 1147a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor diag::ext_flexible_array_init) 1148a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor << IList->getInit(Index)->getSourceRange().getBegin(); 1149a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1150a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor << *Field; 1151eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1152eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 11538ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 11548ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1155987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson 11568ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (isa<InitListExpr>(IList->getInit(Index))) 11578ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 11588ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 11598ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson else 11608ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index, 1161987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson StructuredList, StructuredIndex); 11620cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 11630cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1164ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Expand a field designator that refers to a member of an 1165ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// anonymous struct or union into a series of field designators that 1166ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// refers to the field within the appropriate subobject. 1167ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// 1168ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// Field/FieldIndex will be updated to point to the (new) 1169ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// currently-designated field. 1170ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorstatic void ExpandAnonymousFieldDesignator(Sema &SemaRef, 11711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned DesigIdx, 1173ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *Field, 1174ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor RecordDecl::field_iterator &FieldIter, 1175ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor unsigned &FieldIndex) { 1176ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor typedef DesignatedInitExpr::Designator Designator; 1177ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1178ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the path from the current object to the member of the 1179ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // anonymous struct/union (backwards). 1180ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor llvm::SmallVector<FieldDecl *, 4> Path; 1181ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SemaRef.BuildAnonymousStructUnionMemberPath(Field, Path); 11821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1183ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the replacement designators. 1184ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor llvm::SmallVector<Designator, 4> Replacements; 1185ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor for (llvm::SmallVector<FieldDecl *, 4>::reverse_iterator 1186ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FI = Path.rbegin(), FIEnd = Path.rend(); 1187ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FI != FIEnd; ++FI) { 1188ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (FI + 1 == FIEnd) 11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Replacements.push_back(Designator((IdentifierInfo *)0, 1190ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getDotLoc(), 1191ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getFieldLoc())); 1192ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor else 1193ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.push_back(Designator((IdentifierInfo *)0, SourceLocation(), 1194ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SourceLocation())); 1195ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.back().setField(*FI); 1196ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1197ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1198ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Expand the current designator into the set of replacement 1199ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // designators, so we have a full subobject path down to where the 1200ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // member of the anonymous struct/union is actually stored. 1201319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0], 1202ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor &Replacements[0] + Replacements.size()); 12031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1204ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Update FieldIter/FieldIndex; 1205ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor RecordDecl *Record = cast<RecordDecl>(Path.back()->getDeclContext()); 120617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldIter = Record->field_begin(); 1207ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldIndex = 0; 120817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator FEnd = Record->field_end(); 1209ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldIter != FEnd; ++FieldIter) { 1210ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (FieldIter->isUnnamedBitfield()) 1211ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor continue; 1212ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1213ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (*FieldIter == Path.back()) 1214ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return; 1215ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1216ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor ++FieldIndex; 1217ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1218ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1219ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor assert(false && "Unable to find anonymous struct/union field"); 1220ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 1221ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 122205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Check the well-formedness of a C99 designated initializer. 122305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 122405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Determines whether the designated initializer @p DIE, which 122505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// resides at the given @p Index within the initializer list @p 122605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// IList, is well-formed for a current object of type @p DeclType 122705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// (C99 6.7.8). The actual subobject that this designator refers to 12281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// within the current subobject is returned in either 12294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @p NextField or @p NextElementIndex (whichever is appropriate). 123005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 123105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param IList The initializer list in which this designated 123205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// initializer occurs. 123305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 1234711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DIE The designated initializer expression. 1235711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// 1236711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DesigIdx The index of the current designator. 123705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 123805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param DeclType The type of the "current object" (C99 6.7.8p17), 123905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// into which the designation in @p DIE should refer. 124005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 124187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextField If non-NULL and the first designator in @p DIE is 124287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// a field, this will be set to the field declaration corresponding 124387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// to the field named by the designator. 124405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 124587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextElementIndex If non-NULL and the first designator in @p 124687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// DIE is an array designator or GNU array-range designator, this 124787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// will be set to the last index initialized by this designator. 124805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 124905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param Index Index into @p IList where the designated initializer 125005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @p DIE occurs. 125105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 12524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @param StructuredList The initializer list expression that 12534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// describes all of the subobject initializers in the order they'll 12544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// actually be initialized. 12554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 125605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @returns true if there was an error, false otherwise. 12571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 12588ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders CarlssonInitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 12599a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, 12601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 1261711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 126287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor QualType &CurrentObjectType, 126387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator *NextField, 126487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt *NextElementIndex, 12654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 12664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 126734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned &StructuredIndex, 1268eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 1269eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 1270711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if (DesigIdx == DIE->size()) { 127187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the actual initialization for the designated object type. 127287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 12736fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 12746fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Temporarily remove the designator expression from the 12756fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // initializer list that the child calls see, so that we don't try 12766fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // to re-process the designator. 12776fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned OldIndex = Index; 12786fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE->getInit()); 12796fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 12809a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson CheckSubElementType(Entity, IList, CurrentObjectType, Index, 12814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 12826fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 12836fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Restore the designated initializer expression in the syntactic 12846fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // form of the initializer list. 12856fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor if (IList->getInit(OldIndex) != DIE->getInit()) 12866fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor DIE->setInit(IList->getInit(OldIndex)); 12876fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE); 12886fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 128987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 129087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 129105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1292711997184366d584c9c437102cae1e9d9927b986Douglas Gregor bool IsFirstDesignator = (DesigIdx == 0); 12931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((IsFirstDesignator || StructuredList) && 12944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor "Need a non-designated initializer list to start from"); 12954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1296711997184366d584c9c437102cae1e9d9927b986Douglas Gregor DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx); 12974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Determine the structural initializer list that corresponds to the 12984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // current subobject. 12994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList = IsFirstDesignator? SyntacticToSemantic[IList] 13001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : getStructuredSubobjectInit(IList, Index, CurrentObjectType, 1301ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor StructuredList, StructuredIndex, 13024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange(D->getStartLocation(), 13034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DIE->getSourceRange().getEnd())); 13044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor assert(StructuredList && "Expected a structured initializer list"); 13054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 130687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (D->isFieldDesignator()) { 130787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p7: 130887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 130987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 131087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 131187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // . identifier 131287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 131387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have 131487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // structure or union type and the identifier shall be the 13151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // name of a member of that type. 13166217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = CurrentObjectType->getAs<RecordType>(); 131787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!RT) { 131887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation Loc = D->getDotLoc(); 131987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (Loc.isInvalid()) 132087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Loc = D->getFieldLoc(); 13210820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Loc, diag::err_field_designator_non_aggr) 13220820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner << SemaRef.getLangOptions().CPlusPlus << CurrentObjectType; 132387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 132487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 132587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 132687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 13274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Note: we perform a linear search of the fields here, despite 13284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the fact that we have a faster lookup method, because we always 13294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // need to compute the field's index. 1330ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *KnownField = D->getField(); 133187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IdentifierInfo *FieldName = D->getFieldName(); 13324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned FieldIndex = 0; 13331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator 133417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = RT->getDecl()->field_begin(), 133517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RT->getDecl()->field_end(); 13364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (; Field != FieldEnd; ++Field) { 13374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field->isUnnamedBitfield()) 13384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor continue; 13394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1340ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (KnownField == *Field || Field->getIdentifier() == FieldName) 13414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor break; 13424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 13434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 134487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 134587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 13464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field == FieldEnd) { 1347ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // There was no normal field in the struct with the designated 1348ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // name. Perform another lookup for this name, which may find 1349ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // something that we can't designate (e.g., a member function), 1350ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // may find nothing, or may find a member of an anonymous 13511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // struct/union. 135217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName); 1353c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldDecl *ReplacementField = 0; 13544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Lookup.first == Lookup.second) { 1355c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Name lookup didn't find anything. Determine whether this 1356c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // was a typo for another field name. 1357c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor LookupResult R(SemaRef, FieldName, D->getFieldLoc(), 1358c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Sema::LookupMemberName); 1359c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (SemaRef.CorrectTypo(R, /*Scope=*/0, /*SS=*/0, RT->getDecl()) && 1360c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor (ReplacementField = R.getAsSingle<FieldDecl>()) && 1361c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ReplacementField->getDeclContext()->getLookupContext() 1362c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ->Equals(RT->getDecl())) { 1363c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), 1364c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor diag::err_field_designator_unknown_suggest) 1365c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType << R.getLookupName() 1366c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << CodeModificationHint::CreateReplacement(D->getFieldLoc(), 1367c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor R.getLookupName().getAsString()); 136867dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor SemaRef.Diag(ReplacementField->getLocation(), 136967dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor diag::note_previous_decl) 137067dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor << ReplacementField->getDeclName(); 1371c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else { 1372c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown) 1373c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType; 1374c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++Index; 1375c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor return true; 1376c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1377c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else if (!KnownField) { 1378c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Determine whether we found a field at all. 1379c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ReplacementField = dyn_cast<FieldDecl>(*Lookup.first); 1380c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1381c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1382c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!ReplacementField) { 13834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Name lookup found something, but it wasn't a field. 13840820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield) 13854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << FieldName; 13861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag((*Lookup.first)->getLocation(), 13874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_field_designator_found); 1388ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman ++Index; 1389ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman return true; 1390ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1391c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1392c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!KnownField && 1393c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor cast<RecordDecl>((ReplacementField)->getDeclContext()) 1394c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ->isAnonymousStructOrUnion()) { 1395c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Handle an field designator that refers to a member of an 1396c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // anonymous struct or union. 1397c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, 1398c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ReplacementField, 1399c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field, FieldIndex); 1400c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor D = DIE->getDesignator(DesigIdx); 1401c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else if (!KnownField) { 1402c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // The replacement field comes from typo correction; find it 1403c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // in the list of fields. 1404c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldIndex = 0; 1405c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field = RT->getDecl()->field_begin(); 1406c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor for (; Field != FieldEnd; ++Field) { 1407c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (Field->isUnnamedBitfield()) 1408c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor continue; 1409c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1410c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (ReplacementField == *Field || 1411c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field->getIdentifier() == ReplacementField->getIdentifier()) 1412c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor break; 1413c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1414c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++FieldIndex; 1415c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1416c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1417ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } else if (!KnownField && 1418ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor cast<RecordDecl>((*Field)->getDeclContext()) 14194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ->isAnonymousStructOrUnion()) { 1420ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, *Field, 1421ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Field, FieldIndex); 1422ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor D = DIE->getDesignator(DesigIdx); 142387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 14244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 14254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // All of the fields of a union are located at the same place in 14264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the initializer list. 14270bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (RT->getDecl()->isUnion()) { 14284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor FieldIndex = 0; 14290bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 14300bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 14314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 143287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Update the designator with the field declaration. 14334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor D->setField(*Field); 14341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 14364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this field. 14374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (FieldIndex >= StructuredList->getNumInits()) 14380820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1); 14394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1440eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // This designator names a flexible array member. 1441eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Field->getType()->isIncompleteArrayType()) { 1442eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool Invalid = false; 1443711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if ((DesigIdx + 1) != DIE->size()) { 1444eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // We can't designate an object within the flexible array 1445eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // member (because GCC doesn't allow it). 14461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr::Designator *NextD 1447711997184366d584c9c437102cae1e9d9927b986Douglas Gregor = DIE->getDesignator(DesigIdx + 1); 14481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(NextD->getStartLocation(), 1449eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_designator_into_flexible_array_member) 14501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << SourceRange(NextD->getStartLocation(), 1451eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor DIE->getSourceRange().getEnd()); 14520820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1453eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1454eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1455eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1456eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1457eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (!hadError && !isa<InitListExpr>(DIE->getInit())) { 1458eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // The initializer is not an initializer list. 14590820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(DIE->getInit()->getSourceRange().getBegin(), 1460eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_needs_braces) 1461eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << DIE->getInit()->getSourceRange(); 14620820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1463eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1464eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1465eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1466eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1467eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Handle GNU flexible array initializers. 14681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Invalid && !TopLevelObject && 1469eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor cast<InitListExpr>(DIE->getInit())->getNumInits() > 0) { 14701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(DIE->getSourceRange().getBegin(), 1471eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_nonempty) 1472eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << DIE->getSourceRange().getBegin(); 14730820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1474eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1475eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1476eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1477eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1478eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Invalid) { 1479eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Index; 1480eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1481eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1482eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1483eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Initialize the array. 1484eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool prevHadError = hadError; 1485eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1486eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned OldIndex = Index; 1487eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(Index, DIE->getInit()); 14888ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 14898ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 14908ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 14918ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 1492eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, newStructuredIndex); 14938ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 1494eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(OldIndex, DIE); 1495eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (hadError && !prevHadError) { 1496eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Field; 1497eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++FieldIndex; 1498eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (NextField) 1499eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor *NextField = Field; 1500eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredIndex = FieldIndex; 1501eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1502eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1503eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } else { 1504eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Recurse to check later designated subobjects. 1505eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType FieldType = (*Field)->getType(); 1506eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 15079a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 15089a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity MemberEntity = 15098ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 15108ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1, 15119a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson FieldType, 0, 0, Index, 15129a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, newStructuredIndex, 1513eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, false)) 1514eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1515eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 151687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 151787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Find the position of the next field to be initialized in this 151887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // subobject. 151987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Field; 15204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 152105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 152287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 152387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this struct/class/union subobject. 152487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 152587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextField) 152687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor *NextField = Field; 15274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = FieldIndex; 152887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 152987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 153005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 153134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 153234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 153334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1534ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // We've already initialized something in the union; we're done. 1535ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (RT->getDecl()->isUnion()) 1536ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return hadError; 1537ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 153887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining fields within this class/struct/union subobject. 153987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 15402bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson 15418ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckStructUnionTypes(Entity, IList, CurrentObjectType, Field, false, Index, 15424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, FieldIndex); 154387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 154487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 154505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 154687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p6: 154787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 154887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 154987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 155087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ] 155187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 155287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have array 155387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // type and the expression shall be an integer constant 155487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // expression. If the array is of unknown size, any 155587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // nonnegative value is valid. 155687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 155787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Additionally, cope with the GNU extension that permits 155887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designators of the form 155987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 156087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ... constant-expression ] 15610820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType); 156287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!AT) { 15630820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array) 156487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor << CurrentObjectType; 156587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 156687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 156787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 156805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 156987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Expr *IndexExpr = 0; 157034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor llvm::APSInt DesignatedStartIndex, DesignatedEndIndex; 157134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (D->isArrayDesignator()) { 157287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayIndex(*D); 15733bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedStartIndex = IndexExpr->EvaluateAsInt(SemaRef.Context); 157434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex = DesignatedStartIndex; 157534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 157687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(D->isArrayRangeDesignator() && "Need array-range designator"); 15773bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 15781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedStartIndex = 15803bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DIE->getArrayRangeStart(*D)->EvaluateAsInt(SemaRef.Context); 15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedEndIndex = 15823bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DIE->getArrayRangeEnd(*D)->EvaluateAsInt(SemaRef.Context); 158387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayRangeEnd(*D); 158434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 15853bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (DesignatedStartIndex.getZExtValue() !=DesignatedEndIndex.getZExtValue()) 1586a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor FullyStructuredList->sawArrayRangeDesignator(); 158787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 158805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 158987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (isa<ConstantArrayType>(AT)) { 159087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false); 159134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth()); 159234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned()); 159334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth()); 159434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned()); 159534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex >= MaxElements) { 15960820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IndexExpr->getSourceRange().getBegin(), 159787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor diag::err_array_designator_too_large) 159834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor << DesignatedEndIndex.toString(10) << MaxElements.toString(10) 159987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor << IndexExpr->getSourceRange(); 160087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 160187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 160205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 160334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 160434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Make sure the bit-widths and signedness match. 160534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedStartIndex.getBitWidth() > DesignatedEndIndex.getBitWidth()) 160634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.extend(DesignatedStartIndex.getBitWidth()); 16073bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner else if (DesignatedStartIndex.getBitWidth() < 16083bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedEndIndex.getBitWidth()) 160934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.extend(DesignatedEndIndex.getBitWidth()); 161034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(true); 161134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(true); 161205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 16131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 16154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this array element. 161634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits()) 16171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredList->resizeInits(SemaRef.Context, 161834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.getZExtValue() + 1); 161934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 162034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Repeatedly perform subobject initializations in the range 162134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // [DesignatedStartIndex, DesignatedEndIndex]. 162234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 162334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next designator 162434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned ElementIndex = DesignatedStartIndex.getZExtValue(); 162534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned OldIndex = Index; 16269a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 16279a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity ElementEntity = 16288ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 16299a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 163034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor while (DesignatedStartIndex <= DesignatedEndIndex) { 163134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Recurse to check later designated subobjects. 163234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor QualType ElementType = AT->getElementType(); 163334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor Index = OldIndex; 16349a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 16359a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementEntity.setElementIndex(ElementIndex); 16368ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (CheckDesignatedInitializer(ElementEntity, IList, DIE, DesigIdx + 1, 16379a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementType, 0, 0, Index, 16389a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, ElementIndex, 1639eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor (DesignatedStartIndex == DesignatedEndIndex), 1640eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) 164134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return true; 164287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 164334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next index in the array that we'll be initializing. 164434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ++DesignatedStartIndex; 164534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ElementIndex = DesignatedStartIndex.getZExtValue(); 164634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } 164787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 164887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 164987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this array subobject. 165087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 165187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextElementIndex) 165234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor *NextElementIndex = DesignatedStartIndex; 16534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = ElementIndex; 165487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 165587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 16561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 165734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 165834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 165934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 166087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining elements within this array subobject. 166105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool prevHadError = hadError; 16628ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex, 1663784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 16644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, ElementIndex); 16651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return hadError && !prevHadError; 166605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 166705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 16684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// Get the structured initializer list for a subobject of type 16694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// @p CurrentObjectType. 16704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListExpr * 16714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 16724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType CurrentObjectType, 16734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 16744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredIndex, 16754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange InitRange) { 16764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *ExistingInit = 0; 16774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 16784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = SyntacticToSemantic[IList]; 16794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else if (StructuredIndex < StructuredList->getNumInits()) 16804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = StructuredList->getInit(StructuredIndex); 16811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit)) 16834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 16844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 16854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (ExistingInit) { 16864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We are creating an initializer list that initializes the 16874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobjects of the current object, but there was already an 16884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initialization that completely initialized the current 16894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject, e.g., by a compound literal: 16901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 16914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X { int a, b; }; 16924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 }; 16931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 16944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Here, xs[0].a == 0 and xs[0].b == 3, since the second, 16954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // designated initializer re-initializes the whole 16964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject [0], overwriting previous initializers. 16971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(InitRange.getBegin(), 1698ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor diag::warn_subobject_initializer_overrides) 16994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << InitRange; 17001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(ExistingInit->getSourceRange().getBegin(), 17014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 170254f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 17034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << ExistingInit->getSourceRange(); 17044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 17054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *Result 1707ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek = new (SemaRef.Context) InitListExpr(InitRange.getBegin(), 0, 0, 1708ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek InitRange.getEnd()); 1709ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor 17102c79281ef66cb5001f0ebadf6b317250c21a1c01Douglas Gregor Result->setType(CurrentObjectType.getNonReferenceType()); 17114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1712fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Pre-allocate storage for the structured initializer list. 1713fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor unsigned NumElements = 0; 171408457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor unsigned NumInits = 0; 171508457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (!StructuredList) 171608457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = IList->getNumInits(); 171708457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor else if (Index < IList->getNumInits()) { 171808457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) 171908457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = SubList->getNumInits(); 172008457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor } 172108457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor 17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ArrayType *AType 1723fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor = SemaRef.Context.getAsArrayType(CurrentObjectType)) { 1724fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) { 1725fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = CAType->getSize().getZExtValue(); 1726fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Simple heuristic so that we don't allocate a very large 1727fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // initializer with many empty entries at the end. 172808457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (NumInits && NumElements > NumInits) 1729fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 0; 1730fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 1731183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) 1732fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = VType->getNumElements(); 17336217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const RecordType *RType = CurrentObjectType->getAs<RecordType>()) { 1734fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor RecordDecl *RDecl = RType->getDecl(); 1735fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (RDecl->isUnion()) 1736fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 1; 1737fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor else 17381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumElements = std::distance(RDecl->field_begin(), 173917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RDecl->field_end()); 1740fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 1741fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 174208457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (NumElements < NumInits) 1743fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = IList->getNumInits(); 1744fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 1745ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek Result->reserveInits(NumElements); 1746fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 17474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Link this new initializer list into the structured initializer 17484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // lists. 17494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (StructuredList) 1750ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek StructuredList->updateInit(StructuredIndex, Result); 17514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else { 17524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Result->setSyntacticForm(IList); 17534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = Result; 17544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 17554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 17574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 17584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Update the initializer at index @p StructuredIndex within the 17604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// structured initializer list to the value @p expr. 17614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregorvoid InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, 17624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex, 17634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *expr) { 17644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // No structured initializer list to update 17654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 17664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 17674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1768ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek if (Expr *PrevInit = StructuredList->updateInit(StructuredIndex, expr)) { 17694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // This initializer overwrites a previous initializer. Warn. 17701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(expr->getSourceRange().getBegin(), 17714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::warn_initializer_overrides) 17724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << expr->getSourceRange(); 17731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(PrevInit->getSourceRange().getBegin(), 17744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 177554f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 17764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << PrevInit->getSourceRange(); 17774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 17781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 17804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 17814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 178205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Check that the given Index expression is a valid array designator 178305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// value. This is essentailly just a wrapper around 17843bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner/// VerifyIntegerConstantExpression that also checks for negative values 178505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// and produces a reasonable diagnostic if there is a 178605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// failure. Returns true if there was an error, false otherwise. If 178705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// everything went okay, Value will receive the value of the constant 178805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// expression. 17891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool 17903bf6893b77c30cb774100e0fa7ae029331675ec1Chris LattnerCheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) { 179105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation Loc = Index->getSourceRange().getBegin(); 179205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 179305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Make sure this is an integer constant expression. 17943bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (S.VerifyIntegerConstantExpression(Index, &Value)) 17953bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return true; 17963bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 17973bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (Value.isSigned() && Value.isNegative()) 17983bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return S.Diag(Loc, diag::err_array_designator_negative) 179905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << Value.toString(10) << Index->getSourceRange(); 180005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 180153d3d8e0662197f7245d8f5ff697a72a2b4b3f54Douglas Gregor Value.setIsUnsigned(true); 180205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return false; 180305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 180405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 180505c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorSema::OwningExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, 180605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation Loc, 1807eeae8f072748affce25ab4064982626361293390Douglas Gregor bool GNUSyntax, 180805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor OwningExprResult Init) { 180905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef DesignatedInitExpr::Designator ASTDesignator; 181005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 181105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool Invalid = false; 181205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::SmallVector<ASTDesignator, 32> Designators; 181305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::SmallVector<Expr *, 32> InitExpressions; 181405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 181505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Build designators and check array designator expressions. 181605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) { 181705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor const Designator &D = Desig.getDesignator(Idx); 181805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor switch (D.getKind()) { 181905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::FieldDesignator: 18201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(), 182105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getFieldLoc())); 182205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 182305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 182405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayDesignator: { 182505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Index = static_cast<Expr *>(D.getArrayIndex()); 182605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt IndexValue; 18279ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (!Index->isTypeDependent() && 18289ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor !Index->isValueDependent() && 18299ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, Index, IndexValue)) 183005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 183105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else { 183205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 18331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 183405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getRBracketLoc())); 183505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor InitExpressions.push_back(Index); 183605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 183705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 183805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 183905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 184005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayRangeDesignator: { 184105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart()); 184205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd()); 184305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt StartValue; 184405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt EndValue; 18459ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool StartDependent = StartIndex->isTypeDependent() || 18469ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor StartIndex->isValueDependent(); 18479ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool EndDependent = EndIndex->isTypeDependent() || 18489ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor EndIndex->isValueDependent(); 18499ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if ((!StartDependent && 18509ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, StartIndex, StartValue)) || 18519ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor (!EndDependent && 18529ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, EndIndex, EndValue))) 185305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 1854d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else { 1855d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor // Make sure we're comparing values with the same bit width. 18569ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (StartDependent || EndDependent) { 18579ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Nothing to compute. 18589ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (StartValue.getBitWidth() > EndValue.getBitWidth()) 1859d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor EndValue.extend(StartValue.getBitWidth()); 1860d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else if (StartValue.getBitWidth() < EndValue.getBitWidth()) 1861d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor StartValue.extend(EndValue.getBitWidth()); 1862d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor 1863c4bb7bfe8328f79004517dd268f6146c8066c205Douglas Gregor if (!StartDependent && !EndDependent && EndValue < StartValue) { 1864d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range) 18651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << StartValue.toString(10) << EndValue.toString(10) 1866d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor << StartIndex->getSourceRange() << EndIndex->getSourceRange(); 1867d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Invalid = true; 1868d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } else { 1869d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 18701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 1871d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getEllipsisLoc(), 1872d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getRBracketLoc())); 1873d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(StartIndex); 1874d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(EndIndex); 1875d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } 187605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 187705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 187805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 187905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 188005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 188105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 188205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Invalid || Init.isInvalid()) 188305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return ExprError(); 188405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 188505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Clear out the expressions within the designation. 188605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Desig.ClearExprs(*this); 188705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 188805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor DesignatedInitExpr *DIE 1889beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad = DesignatedInitExpr::Create(Context, 1890beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Designators.data(), Designators.size(), 1891beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad InitExpressions.data(), InitExpressions.size(), 1892e9146f2e9f1c4e281544e8c080934c72d41012caAnders Carlsson Loc, GNUSyntax, Init.takeAs<Expr>()); 189305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return Owned(DIE); 189405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 1895c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 1896cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregorbool Sema::CheckInitList(const InitializedEntity &Entity, 1897cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *&InitList, QualType &DeclType) { 1898cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker CheckInitList(*this, Entity, InitList, DeclType); 1899c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor if (!CheckInitList.HadError()) 1900c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitList = CheckInitList.getFullyStructuredList(); 1901c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 1902c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor return CheckInitList.HadError(); 1903c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor} 190487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 1905cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 1906cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor// Initialization entity 1907cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 190839da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor 1909cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index, 1910cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor const InitializedEntity &Parent) 1911d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson : Parent(&Parent), Index(Index) 1912cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor{ 1913d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) { 1914d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_ArrayElement; 1915d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = AT->getElementType(); 1916d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } else { 1917d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_VectorElement; 1918d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = Parent.getType()->getAs<VectorType>()->getElementType(); 1919d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } 192020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 192120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 192220093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializedEntity InitializedEntity::InitializeBase(ASTContext &Context, 192320093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXBaseSpecifier *Base) 192420093b4bf698f292c664676987541d5103b65b15Douglas Gregor{ 192520093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializedEntity Result; 192620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Kind = EK_Base; 192720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Base = Base; 1928d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Result.Type = Base->getType(); 192920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 193020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 193120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 193299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas GregorDeclarationName InitializedEntity::getName() const { 193399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (getKind()) { 193499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Parameter: 1935a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor if (!VariableOrMember) 1936a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor return DeclarationName(); 1937a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor // Fall through 1938a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor 1939a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor case EK_Variable: 194099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Member: 194199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return VariableOrMember->getDeclName(); 194299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 194399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Result: 194499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Exception: 194518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case EK_New: 194699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Temporary: 194799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Base: 1948d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 1949d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 195099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 195199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 195299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 195399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Silence GCC warning 195499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 195599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 195699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 19577abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas GregorDeclaratorDecl *InitializedEntity::getDecl() const { 19587abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor switch (getKind()) { 19597abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Variable: 19607abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Parameter: 19617abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Member: 19627abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return VariableOrMember; 19637abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 19647abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Result: 19657abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Exception: 19667abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_New: 19677abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Temporary: 19687abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Base: 1969d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 1970d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 19717abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 19727abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor } 19737abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 19747abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor // Silence GCC warning 19757abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 19767abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor} 19777abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 197820093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 197920093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Initialization sequence 198020093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 198120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 198220093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::Step::Destroy() { 198320093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Kind) { 198420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 198520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 198620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: 198720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 198820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 198920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: 199020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 199120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 1992d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: 199351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: 199471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: 199518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 1996cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 199720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 199820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 199920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 200020093b4bf698f292c664676987541d5103b65b15Douglas Gregor delete ICS; 200120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 200220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 200320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 200420093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddAddressOverloadResolutionStep( 200520093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function) { 200620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 200720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ResolveAddressOfOverloadedFunction; 200820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Function->getType(); 2009b13b737a2450167c82e148590e8019b839ce6b98John McCall // Access is currently ignored for these. 20109aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 20119aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = DeclAccessPair::make(Function, AS_none); 201220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 201320093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 201420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 201520093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType, 201620093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IsLValue) { 201720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 201820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = IsLValue? SK_CastDerivedToBaseLValue : SK_CastDerivedToBaseRValue; 201920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = BaseType; 202020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 202120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 202220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 202320093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddReferenceBindingStep(QualType T, 202420093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool BindingTemporary) { 202520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 202620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference; 202720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 202820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 202920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 203020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 203103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedmanvoid InitializationSequence::AddUserConversionStep(FunctionDecl *Function, 20329aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl, 203303981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman QualType T) { 203420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 203520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_UserConversion; 203603981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman S.Type = T; 20379aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 20389aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = FoundDecl; 203920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 204020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 204120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 204220093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddQualificationConversionStep(QualType Ty, 204320093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IsLValue) { 204420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 204520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = IsLValue? SK_QualificationConversionLValue 204620093b4bf698f292c664676987541d5103b65b15Douglas Gregor : SK_QualificationConversionRValue; 204720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Ty; 204820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 204920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 205020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 205120093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddConversionSequenceStep( 205220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const ImplicitConversionSequence &ICS, 205320093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T) { 205420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 205520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ConversionSequence; 205620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 205720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ICS = new ImplicitConversionSequence(ICS); 205820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 205920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 206020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2061d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorvoid InitializationSequence::AddListInitializationStep(QualType T) { 2062d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Step S; 2063d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Kind = SK_ListInitialization; 2064d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Type = T; 2065d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Steps.push_back(S); 2066d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor} 2067d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 206851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregorvoid 206951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas GregorInitializationSequence::AddConstructorInitializationStep( 207051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor, 2071b13b737a2450167c82e148590e8019b839ce6b98John McCall AccessSpecifier Access, 207251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor QualType T) { 207351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Step S; 207451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Kind = SK_ConstructorInitialization; 207551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Type = T; 20769aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Constructor; 20779aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = DeclAccessPair::make(Constructor, Access); 207851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Steps.push_back(S); 207951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor} 208051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 208171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorvoid InitializationSequence::AddZeroInitializationStep(QualType T) { 208271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Step S; 208371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Kind = SK_ZeroInitialization; 208471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Type = T; 208571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Steps.push_back(S); 208671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 208771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 208818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorvoid InitializationSequence::AddCAssignmentStep(QualType T) { 208918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step S; 209018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Kind = SK_CAssignment; 209118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Type = T; 209218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Steps.push_back(S); 209318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 209418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 2095cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedmanvoid InitializationSequence::AddStringInitStep(QualType T) { 2096cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Step S; 2097cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Kind = SK_StringInit; 2098cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Type = T; 2099cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Steps.push_back(S); 2100cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman} 2101cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 210220093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::SetOverloadFailure(FailureKind Failure, 210320093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Result) { 210420093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = FailedSequence; 210520093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->Failure = Failure; 210620093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->FailedOverloadResult = Result; 210720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 210820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 210920093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 211020093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Attempt initialization 211120093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 211220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 211320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt list initialization (C++0x [dcl.init.list]) 2114d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorstatic void TryListInitialization(Sema &S, 211520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 211620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 211720093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitListExpr *InitList, 211820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2119d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We only perform rudimentary checking of list 2120d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // initializations at this point, then assume that any list 2121d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // initialization of an array, aggregate, or scalar will be 2122d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // well-formed. We we actually "perform" list initialization, we'll 2123d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // do all of the necessary checking. C++0x initializer lists will 2124d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // force us to perform more checking here. 2125d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ListInitialization); 2126d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2127d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 2128d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2129d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // C++ [dcl.init]p13: 2130d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If T is a scalar type, then a declaration of the form 2131d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2132d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // T x = { a }; 2133d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2134d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // is equivalent to 2135d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2136d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // T x = a; 2137d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (DestType->isScalarType()) { 2138d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (InitList->getNumInits() > 1 && S.getLangOptions().CPlusPlus) { 2139d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar); 2140d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 2141d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 2142d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2143d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume scalar initialization from a single value works. 2144d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isAggregateType()) { 2145d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume aggregate initialization works. 2146d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isVectorType()) { 2147d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume vector initialization works. 2148d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isReferenceType()) { 2149d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: C++0x defines behavior for this. 2150d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList); 2151d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 2152d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isRecordType()) { 2153d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: C++0x defines behavior for this 2154d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType); 2155d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 2156d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2157d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Add a general "list initialization" step. 2158d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.AddListInitializationStep(DestType); 215920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 216020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 216120093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Try a reference initialization that involves calling a conversion 216220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// function. 216320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// 216420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// FIXME: look intos DRs 656, 896 216520093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic OverloadingResult TryRefInitWithConversionFunction(Sema &S, 216620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 216720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 216820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 216920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowRValues, 217020093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2171d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 217220093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 217320093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T1 = cv1T1.getUnqualifiedType(); 217420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 217520093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T2 = cv2T2.getUnqualifiedType(); 217620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 217720093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase; 217820093b4bf698f292c664676987541d5103b65b15Douglas Gregor assert(!S.CompareReferenceRelationship(Initializer->getLocStart(), 217920093b4bf698f292c664676987541d5103b65b15Douglas Gregor T1, T2, DerivedToBase) && 218020093b4bf698f292c664676987541d5103b65b15Douglas Gregor "Must have incompatible references when binding via conversion"); 218160cfcecaf48e4310339dcfbdb0e3f0e6d2853855Chandler Carruth (void)DerivedToBase; 218220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 218320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the candidate set directly in the initialization sequence 218420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // structure, so that it will persist if we fail. 218520093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 218620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CandidateSet.clear(); 218720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 218820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 218920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 219020093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 219120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 219220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const RecordType *T1RecordType = 0; 219320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (AllowRValues && (T1RecordType = T1->getAs<RecordType>())) { 219420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 219520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to see if there is a suitable conversion. 219620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl()); 219720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 219820093b4bf698f292c664676987541d5103b65b15Douglas Gregor DeclarationName ConstructorName 219920093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.Context.DeclarationNames.getCXXConstructorName( 220020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getCanonicalType(T1).getUnqualifiedType()); 220120093b4bf698f292c664676987541d5103b65b15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 220220093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (llvm::tie(Con, ConEnd) = T1RecordDecl->lookup(ConstructorName); 220320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Con != ConEnd; ++Con) { 22049aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 22059aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 22069aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 220720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Find the constructor (which may be a template). 220820093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConstructorDecl *Constructor = 0; 22099aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 221020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 221120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 221220093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 221320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 22149aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 221520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 221620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Constructor->isInvalidDecl() && 221720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 221820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 22199aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 222086820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 222120093b4bf698f292c664676987541d5103b65b15Douglas Gregor &Initializer, 1, CandidateSet); 222220093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 22239aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 222486820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall &Initializer, 1, CandidateSet); 222520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 222620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 222720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 222820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 222920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (const RecordType *T2RecordType = T2->getAs<RecordType>()) { 223020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting from is a class type, enumerate its conversion 223120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions. 223220093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl()); 223320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 223420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the type we are converting to. If we are allowed to 223520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // convert to an rvalue, take the type that the destination type 223620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // refers to. 223720093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType ToType = AllowRValues? cv1T1 : DestType; 223820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2239eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 224020093b4bf698f292c664676987541d5103b65b15Douglas Gregor = T2RecordDecl->getVisibleConversionFunctions(); 2241eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 2242eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall E = Conversions->end(); I != E; ++I) { 224320093b4bf698f292c664676987541d5103b65b15Douglas Gregor NamedDecl *D = *I; 224420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 224520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<UsingShadowDecl>(D)) 224620093b4bf698f292c664676987541d5103b65b15Douglas Gregor D = cast<UsingShadowDecl>(D)->getTargetDecl(); 224720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 224820093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 224920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConversionDecl *Conv; 225020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 225120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 225220093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 225320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(*I); 225420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 225520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the conversion function doesn't return a reference type, 225620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // it can't be considered for this conversion unless we're allowed to 225720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // consider rvalues. 225820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Do we need to make sure that we only consider conversion 225920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // candidates with reference-compatible results? That might be needed to 226020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // break recursion. 226120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if ((AllowExplicit || !Conv->isExplicit()) && 226220093b4bf698f292c664676987541d5103b65b15Douglas Gregor (AllowRValues || Conv->getConversionType()->isLValueReferenceType())){ 226320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 22649aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 226586820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, 226620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ToType, CandidateSet); 226720093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 22689aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 2269692f85c1d217c8c3cdc06d884ad61b101c75c856Douglas Gregor Initializer, ToType, CandidateSet); 227020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 227120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 227220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 227320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 227420093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 227520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 227620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform overload resolution. If it fails, return the failed result. 227720093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 227820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (OverloadingResult Result 227920093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.BestViableFunction(CandidateSet, DeclLoc, Best)) 228020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 228103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 228220093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function = Best->Function; 228303981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 228403981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Compute the returned type of the conversion. 228520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<CXXConversionDecl>(Function)) 228620093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = Function->getResultType(); 228720093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 228820093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv1T1; 228903981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 229003981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Add the user-defined conversion step. 22919aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, 2292b13b737a2450167c82e148590e8019b839ce6b98John McCall T2.getNonReferenceType()); 229303981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 229403981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Determine whether we need to perform derived-to-base or 229503981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // cv-qualification adjustments. 229620093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool NewDerivedToBase = false; 229720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult NewRefRelationship 229820093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.CompareReferenceRelationship(DeclLoc, T1, T2.getNonReferenceType(), 229920093b4bf698f292c664676987541d5103b65b15Douglas Gregor NewDerivedToBase); 2300a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor if (NewRefRelationship == Sema::Ref_Incompatible) { 2301a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // If the type we've converted to is not reference-related to the 2302a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // type we're looking for, then there is another conversion step 2303a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // we need to perform to produce a temporary of the right type 2304a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // that we'll be binding to. 2305a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ImplicitConversionSequence ICS; 2306a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.setStandard(); 2307a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.Standard = Best->FinalConversion; 2308a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor T2 = ICS.Standard.getToType(2); 2309a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor Sequence.AddConversionSequenceStep(ICS, T2); 2310a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor } else if (NewDerivedToBase) 231120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 231220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getQualifiedType(T1, 231320093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2.getNonReferenceType().getQualifiers()), 231420093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*isLValue=*/true); 231520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 231620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (cv1T1.getQualifiers() != T2.getNonReferenceType().getQualifiers()) 231720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddQualificationConversionStep(cv1T1, T2->isReferenceType()); 231820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 231920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, !T2->isReferenceType()); 232020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return OR_Success; 232120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 232220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 232320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt reference initialization (C++0x [dcl.init.list]) 232420093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryReferenceInitialization(Sema &S, 232520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 232620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 232720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 232820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 232920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ReferenceBinding); 233020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2331d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 233220093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 23335535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T1Quals; 23345535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 233520093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 23365535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T2Quals; 23375535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 233820093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 233920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 234020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the initializer is the address of an overloaded function, try 234120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to resolve the overloaded function. If all goes well, T2 is the 234220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type of the resulting function. 234320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) { 234420093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Fn = S.ResolveAddressOfOverloadedFunction(Initializer, 234520093b4bf698f292c664676987541d5103b65b15Douglas Gregor T1, 234620093b4bf698f292c664676987541d5103b65b15Douglas Gregor false); 234720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Fn) { 234820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 234920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 235020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 235120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 235220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddAddressOverloadResolutionStep(Fn); 235320093b4bf698f292c664676987541d5103b65b15Douglas Gregor cv2T2 = Fn->getType(); 235420093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv2T2.getUnqualifiedType(); 235520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 235620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 235720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Rvalue references 235820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool ForceRValue = false; 235920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 236020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Compute some basic properties of the types and the initializer. 236120093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isLValueRef = DestType->isLValueReferenceType(); 236220093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isRValueRef = !isLValueRef; 236320093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase = false; 236420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr::isLvalueResult InitLvalue = ForceRValue ? Expr::LV_InvalidExpression : 236520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer->isLvalue(S.Context); 236620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult RefRelationship 236720093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase); 236820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 236920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p5: 237020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A reference to type "cv1 T1" is initialized by an expression of type 237120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // "cv2 T2" as follows: 237220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 237320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the reference is an lvalue reference and the initializer 237420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // expression 237520093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult ConvOvlResult = OR_Success; 237620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isLValueRef) { 237720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (InitLvalue == Expr::LV_Valid && 237820093b4bf698f292c664676987541d5103b65b15Douglas Gregor RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification) { 237920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - is an lvalue (but is not a bit-field), and "cv1 T1" is 238020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2," or 238120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 2382de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // Per C++ [over.best.ics]p2, we don't diagnose whether the lvalue is a 238320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // bit-field when we're determining whether the reference initialization 2384de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // can occur. However, we do pay attention to whether it is a bit-field 2385de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // to decide whether we're actually binding to a temporary created from 2386de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // the bit-field. 238720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 238820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 23895535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth S.Context.getQualifiedType(T1, T2Quals), 239020093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*isLValue=*/true); 23915535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 239220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddQualificationConversionStep(cv1T1, /*IsLValue=*/true); 2393de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor bool BindingTemporary = T1Quals.hasConst() && !T1Quals.hasVolatile() && 2394093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson (Initializer->getBitField() || Initializer->refersToVectorElement()); 2395de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, BindingTemporary); 239620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 239720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 239820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 239920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - has a class type (i.e., T2 is a class type), where T1 is not 240020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-related to T2, and can be implicitly converted to an 240120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible 240220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // with "cv3 T3" (this conversion is selected by enumerating the 240320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // applicable conversion functions (13.3.1.6) and choosing the best 240420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // one through overload resolution (13.3)), 240520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType()) { 240620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, Kind, 240720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer, 240820093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowRValues=*/false, 240920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 241020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult == OR_Success) 241120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 24121d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ConvOvlResult != OR_No_Viable_Function) { 24131d31833450e6d2947a33cb0840d87661d92eec07John McCall Sequence.SetOverloadFailure( 24141d31833450e6d2947a33cb0840d87661d92eec07John McCall InitializationSequence::FK_ReferenceInitOverloadFailed, 24151d31833450e6d2947a33cb0840d87661d92eec07John McCall ConvOvlResult); 24161d31833450e6d2947a33cb0840d87661d92eec07John McCall } 241720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 241820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 241920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 242020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the reference shall be an lvalue reference to a 242120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // non-volatile const type (i.e., cv1 shall be const), or the reference 242220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // shall be an rvalue reference and the initializer expression shall 242320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // be an rvalue. 2424ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor if (!((isLValueRef && T1Quals.hasConst() && !T1Quals.hasVolatile()) || 242520093b4bf698f292c664676987541d5103b65b15Douglas Gregor (isRValueRef && InitLvalue != Expr::LV_Valid))) { 242620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 242720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 242820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 242920093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 243020093b4bf698f292c664676987541d5103b65b15Douglas Gregor else if (isLValueRef) 243120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitLvalue == Expr::LV_Valid 243220093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? (RefRelationship == Sema::Ref_Related 243320093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? InitializationSequence::FK_ReferenceInitDropsQualifiers 243420093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToUnrelated) 243520093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 243620093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 243720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed( 243820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_RValueReferenceBindingToLValue); 243920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 244020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 244120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 244220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 244320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If T1 and T2 are class types and 244420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (T1->isRecordType() && T2->isRecordType()) { 244520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - the initializer expression is an rvalue and "cv1 T1" is 244620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2", or 244720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (InitLvalue != Expr::LV_Valid && 244820093b4bf698f292c664676987541d5103b65b15Douglas Gregor RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification) { 244920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 245020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 24515535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth S.Context.getQualifiedType(T1, T2Quals), 245220093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*isLValue=*/false); 24535535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 245420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddQualificationConversionStep(cv1T1, /*IsLValue=*/false); 245520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 245620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 245720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 245820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 245920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - T1 is not reference-related to T2 and the initializer expression 246020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // can be implicitly converted to an rvalue of type "cv3 T3" (this 246120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversion is selected by enumerating the applicable conversion 246220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions (13.3.1.6) and choosing the best one through overload 246320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // resolution (13.3)), 246420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible) { 246520093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, 246620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind, Initializer, 246720093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowRValues=*/true, 246820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 246920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult) 247020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 247120093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 247220093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 247320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 247420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 247520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 247620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 247720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 247820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 247920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 248020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 248120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer expression is an rvalue, with T2 an array type, 248220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // and "cv1 T1" is reference-compatible with "cv2 T2," the reference 248320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // is bound to the object represented by the rvalue (see 3.10). 248420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: How can an array type be reference-compatible with anything? 248520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Don't we mean the element types of T1 and T2? 248620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 248720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, a temporary of type “cv1 T1” is created and initialized 248820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // from the initializer expression using the rules for a non-reference 248920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // copy initialization (8.5). The reference is then bound to the 249020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // temporary. [...] 249120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 249220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 249320093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct); 249420093b4bf698f292c664676987541d5103b65b15Douglas Gregor ImplicitConversionSequence ICS 249520093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.TryImplicitConversion(Initializer, cv1T1, 249620093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*SuppressUserConversions=*/false, AllowExplicit, 249720093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*ForceRValue=*/false, 249820093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*FIXME:InOverloadResolution=*/false, 249920093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*UserCast=*/Kind.isExplicitCast()); 250020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 25011d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ICS.isBad()) { 250220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Use the conversion function set stored in ICS to turn 250320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // this into an overloading ambiguity diagnostic. However, we need 250420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to keep that set as an OverloadCandidateSet rather than as some 250520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // other kind of set. 250618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 250718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetOverloadFailure( 250818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 250918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor ConvOvlResult); 251018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 251118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed); 251220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 251320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 251420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 251520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // [...] If T1 is reference-related to T2, cv1 must be the 251620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // same cv-qualification as, or greater cv-qualification 251720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // than, cv2; otherwise, the program is ill-formed. 25185535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T1CVRQuals = T1Quals.getCVRQualifiers(); 25195535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T2CVRQuals = T2Quals.getCVRQualifiers(); 252020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Related && 25215535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth (T1CVRQuals | T2CVRQuals) != T1CVRQuals) { 252220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 252320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 252420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 252520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 252620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform the actual conversion. 252720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddConversionSequenceStep(ICS, cv1T1); 252820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 252920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 253020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 253120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 253220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt character array initialization from a string literal 253320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// (C++ [dcl.init.string], C99 6.7.8). 253420093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryStringLiteralInitialization(Sema &S, 253520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 253620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 253720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 253820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2539cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Sequence.setSequenceKind(InitializationSequence::StringInit); 2540d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddStringInitStep(Entity.getType()); 254120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 254220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 254320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt initialization by constructor (C++ [dcl.init]), which 254420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// enumerates the constructors of the initialized entity and performs overload 254520093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// resolution to select the best. 254620093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryConstructorInitialization(Sema &S, 254720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 254820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 254920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs, 255071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor QualType DestType, 255120093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 255218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Copy) 255318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.setSequenceKind(InitializationSequence::UserDefinedConversion); 255418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 255518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.setSequenceKind(InitializationSequence::ConstructorInitialization); 255651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 255751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build the candidate set directly in the initialization sequence 255851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // structure, so that it will persist if we fail. 255951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 256051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CandidateSet.clear(); 256151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 256251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 256351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // explicit conversion operators. 256451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct || 256551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getKind() == InitializationKind::IK_Value || 256651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getKind() == InitializationKind::IK_Default); 256751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 256851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 256951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // to see if one is suitable. 257051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor const RecordType *DestRecordType = DestType->getAs<RecordType>(); 257151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor assert(DestRecordType && "Constructor initialization requires record type"); 257251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXRecordDecl *DestRecordDecl 257351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 257451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 257551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor DeclarationName ConstructorName 257651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = S.Context.DeclarationNames.getCXXConstructorName( 257751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Context.getCanonicalType(DestType).getUnqualifiedType()); 257851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 257951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor for (llvm::tie(Con, ConEnd) = DestRecordDecl->lookup(ConstructorName); 258051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Con != ConEnd; ++Con) { 25819aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 25829aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 25839aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 258451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Find the constructor (which may be a template). 258551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor = 0; 25869aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 258751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 258851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 258951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 259051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor else 25919aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 259251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 259351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (!Constructor->isInvalidDecl() && 259499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (AllowExplicit || !Constructor->isExplicit())) { 259551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 25969aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 259786820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 259851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Args, NumArgs, CandidateSet); 259951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor else 26009aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 260186820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Args, NumArgs, CandidateSet); 260251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 260351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 260451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 260551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceLocation DeclLoc = Kind.getLocation(); 260651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 260751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Perform overload resolution. If it fails, return the failed result. 260851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 260951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (OverloadingResult Result 261051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = S.BestViableFunction(CandidateSet, DeclLoc, Best)) { 261151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Sequence.SetOverloadFailure( 261251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor InitializationSequence::FK_ConstructorOverloadFailed, 261351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Result); 261451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return; 261551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 26169db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 26179db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // C++0x [dcl.init]p6: 26189db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // If a program calls for the default initialization of an object 26199db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // of a const-qualified type T, T shall be a class type with a 26209db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // user-provided default constructor. 26219db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 26229db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getType().isConstQualified() && 26239db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor cast<CXXConstructorDecl>(Best->Function)->isImplicit()) { 26249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 26259db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor return; 26269db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 26279db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 262851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Add the constructor initialization step. Any cv-qualification conversion is 262951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // subsumed by the initialization. 263018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Copy) { 26319aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Best->Function, Best->FoundDecl, DestType); 263218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } else { 263318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.AddConstructorInitializationStep( 263451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor cast<CXXConstructorDecl>(Best->Function), 26359aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Best->FoundDecl.getAccess(), 263618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DestType); 263718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 263820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 263920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 264071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor/// \brief Attempt value initialization (C++ [dcl.init]p7). 264171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorstatic void TryValueInitialization(Sema &S, 264271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializedEntity &Entity, 264371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializationKind &Kind, 264471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor InitializationSequence &Sequence) { 264571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // C++ [dcl.init]p5: 264671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 264771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // To value-initialize an object of type T means: 2648d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType T = Entity.getType(); 264971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 265071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is an array type, then each element is value-initialized; 265171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor while (const ArrayType *AT = S.Context.getAsArrayType(T)) 265271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor T = AT->getElementType(); 265371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 265471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (const RecordType *RT = T->getAs<RecordType>()) { 265571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 265671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is a class type (clause 9) with a user-declared 265771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // constructor (12.1), then the default constructor for T is 265871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // called (and the initialization is ill-formed if T has no 265971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // accessible default constructor); 266071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 266171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // FIXME: we really want to refer to a single subobject of the array, 266271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // but Entity doesn't have a way to capture that (yet). 266371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (ClassDecl->hasUserDeclaredConstructor()) 266471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 266571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 266616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // -- if T is a (possibly cv-qualified) non-union class type 266716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // without a user-provided constructor, then the object is 266816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // zero-initialized and, if T’s implicitly-declared default 266916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // constructor is non-trivial, that constructor is called. 267016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if ((ClassDecl->getTagKind() == TagDecl::TK_class || 267116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ClassDecl->getTagKind() == TagDecl::TK_struct) && 267216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !ClassDecl->hasTrivialConstructor()) { 2673d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 267416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 267516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 267671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 267771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 267871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 2679d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 268071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ZeroInitialization); 268171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 268271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 268399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor/// \brief Attempt default initialization (C++ [dcl.init]p6). 268499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregorstatic void TryDefaultInitialization(Sema &S, 268599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializedEntity &Entity, 268699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializationKind &Kind, 268799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitializationSequence &Sequence) { 268899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(Kind.getKind() == InitializationKind::IK_Default); 268999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 269099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // C++ [dcl.init]p6: 269199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // To default-initialize an object of type T means: 269299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is an array type, each element is default-initialized; 2693d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 269499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor while (const ArrayType *Array = S.Context.getAsArrayType(DestType)) 269599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor DestType = Array->getElementType(); 269699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 269799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is a (possibly cv-qualified) class type (Clause 9), the default 269899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // constructor for T is called (and the initialization is ill-formed if 269999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // T has no accessible default constructor); 270060c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (DestType->isRecordType() && S.getLangOptions().CPlusPlus) { 270199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, DestType, 270299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence); 270399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 270499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 270599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - otherwise, no initialization is performed. 270699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.setSequenceKind(InitializationSequence::NoInitialization); 270799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 270899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // If a program calls for the default initialization of an object of 270999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // a const-qualified type T, T shall be a class type with a user-provided 271099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // default constructor. 271160c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (DestType.isConstQualified() && S.getLangOptions().CPlusPlus) 271299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 271399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 271499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 271520093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]), 271620093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// which enumerates all conversion functions and performs overload resolution 271720093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// to select the best. 271820093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryUserDefinedConversion(Sema &S, 271920093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 272020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 272120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 272220093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 27234a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.setSequenceKind(InitializationSequence::UserDefinedConversion); 27244a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 2725d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 27264a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert(!DestType->isReferenceType() && "References are handled elsewhere"); 27274a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType SourceType = Initializer->getType(); 27284a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert((DestType->isRecordType() || SourceType->isRecordType()) && 27294a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor "Must have a class type to perform a user-defined conversion"); 27304a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 27314a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Build the candidate set directly in the initialization sequence 27324a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // structure, so that it will persist if we fail. 27334a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 27344a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CandidateSet.clear(); 27354a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 27364a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Determine whether we are allowed to call explicit constructors or 27374a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // explicit conversion operators. 27384a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 27394a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 27404a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) { 27414a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting to is a class type. Enumerate its constructors 27424a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // to see if there is a suitable conversion. 27434a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXRecordDecl *DestRecordDecl 27444a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 27454a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 27464a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor DeclarationName ConstructorName 27474a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = S.Context.DeclarationNames.getCXXConstructorName( 27484a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor S.Context.getCanonicalType(DestType).getUnqualifiedType()); 27494a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor DeclContext::lookup_iterator Con, ConEnd; 27504a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor for (llvm::tie(Con, ConEnd) = DestRecordDecl->lookup(ConstructorName); 27514a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Con != ConEnd; ++Con) { 27529aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 27539aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 27549aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 27554a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Find the constructor (which may be a template). 27564a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXConstructorDecl *Constructor = 0; 27574a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionTemplateDecl *ConstructorTmpl 27589aa472c45d2bd81b7b52c225e8acc560d716db97John McCall = dyn_cast<FunctionTemplateDecl>(D); 27594a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 27604a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Constructor = cast<CXXConstructorDecl>( 27614a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ConstructorTmpl->getTemplatedDecl()); 27624a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 27639aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 27644a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 27654a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (!Constructor->isInvalidDecl() && 27664a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 27674a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 27689aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 276986820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 27704a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor &Initializer, 1, CandidateSet); 27714a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 27729aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 277386820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall &Initializer, 1, CandidateSet); 27744a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 27754a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 27764a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 2777cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2778cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman SourceLocation DeclLoc = Initializer->getLocStart(); 2779cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 27804a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) { 27814a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting from is a class type, enumerate its conversion 27824a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // functions. 2783cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 278433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // We can only enumerate the conversion functions for a complete type; if 278533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // the type isn't complete, simply skip this step. 278633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (!S.RequireCompleteType(DeclLoc, SourceType, 0)) { 278733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *SourceRecordDecl 278833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = cast<CXXRecordDecl>(SourceRecordType->getDecl()); 27894a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 2790eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 279133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = SourceRecordDecl->getVisibleConversionFunctions(); 2792eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 279333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman E = Conversions->end(); 279433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman I != E; ++I) { 279533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman NamedDecl *D = *I; 279633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 279733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (isa<UsingShadowDecl>(D)) 279833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman D = cast<UsingShadowDecl>(D)->getTargetDecl(); 279933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman 280033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 280133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXConversionDecl *Conv; 28024a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConvTemplate) 280333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 28044a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 280533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(*I); 280633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman 280733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (AllowExplicit || !Conv->isExplicit()) { 280833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (ConvTemplate) 28099aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 281086820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, DestType, 281133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CandidateSet); 281233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman else 28139aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 281486820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Initializer, DestType, CandidateSet); 281533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman } 28164a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 28174a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 28184a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 28194a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 28204a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Perform overload resolution. If it fails, return the failed result. 28214a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet::iterator Best; 28221d31833450e6d2947a33cb0840d87661d92eec07John McCall if (OverloadingResult Result 28234a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = S.BestViableFunction(CandidateSet, DeclLoc, Best)) { 28244a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.SetOverloadFailure( 28254a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor InitializationSequence::FK_UserConversionOverloadFailed, 28264a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Result); 28274a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 28284a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 28291d31833450e6d2947a33cb0840d87661d92eec07John McCall 28304a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionDecl *Function = Best->Function; 28314a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 28324a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (isa<CXXConstructorDecl>(Function)) { 28334a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step. Any cv-qualification conversion is 28344a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // subsumed by the initialization. 28359aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType); 28364a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 28374a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 28384a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 28394a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step that calls the conversion function. 28404a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType ConvType = Function->getResultType().getNonReferenceType(); 28419aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType); 28424a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 28434a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // If the conversion following the call to the conversion function is 28444a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // interesting, add it as a separate step. 28454a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (Best->FinalConversion.First || Best->FinalConversion.Second || 28464a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Best->FinalConversion.Third) { 28474a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ImplicitConversionSequence ICS; 28481d31833450e6d2947a33cb0840d87661d92eec07John McCall ICS.setStandard(); 28494a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ICS.Standard = Best->FinalConversion; 28504a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.AddConversionSequenceStep(ICS, DestType); 28514a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 285220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 285320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 285420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt an implicit conversion (C++ [conv]) converting from one 285520093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// non-class type to another. 285620093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryImplicitConversion(Sema &S, 285720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 285820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 285920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 286020093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 286120093b4bf698f292c664676987541d5103b65b15Douglas Gregor ImplicitConversionSequence ICS 2862d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor = S.TryImplicitConversion(Initializer, Entity.getType(), 286320093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*SuppressUserConversions=*/true, 286420093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowExplicit=*/false, 286520093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*ForceRValue=*/false, 286620093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*FIXME:InOverloadResolution=*/false, 286720093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*UserCast=*/Kind.isExplicitCast()); 286820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 28691d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ICS.isBad()) { 287020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ConversionFailed); 287120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 287220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 287320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2874d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddConversionSequenceStep(ICS, Entity.getType()); 287520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 287620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 287720093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::InitializationSequence(Sema &S, 287820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 287920093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 288020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, 28815769d6195087229770d7ac90449443e026c47103John McCall unsigned NumArgs) 28825769d6195087229770d7ac90449443e026c47103John McCall : FailedCandidateSet(Kind.getLocation()) { 288320093b4bf698f292c664676987541d5103b65b15Douglas Gregor ASTContext &Context = S.Context; 288420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 288520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init]p16: 288620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The semantics of initializers are as follows. The destination type is 288720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // the type of the object or reference being initialized and the source 288820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type is the type of the initializer expression. The source type is not 288920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // defined when the initializer is a braced-init-list or when it is a 289020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // parenthesized list of expressions. 2891d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 289220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 289320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isDependentType() || 289420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 289520093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = DependentSequence; 289620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 289720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 289820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 289920093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType SourceType; 290020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer = 0; 290199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs == 1) { 290220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer = Args[0]; 290320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!isa<InitListExpr>(Initializer)) 290420093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceType = Initializer->getType(); 290520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 290620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 290720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is a braced-init-list, the object is 290820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // list-initialized (8.5.4). 290920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) { 291020093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryListInitialization(S, Entity, Kind, InitList, *this); 2911d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 291220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 291320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 291420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a reference type, see 8.5.3. 291520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isReferenceType()) { 291620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p1: 291720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A variable declared to be a T& or T&&, that is, "reference to type T" 291820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (8.3.2), shall be initialized by an object, or function, of type T or 291920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // by an object that can be converted into a T. 292020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (Therefore, multiple arguments are not permitted.) 292120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (NumArgs != 1) 292220093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_TooManyInitsForReference); 292320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 292420093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryReferenceInitialization(S, Entity, Kind, Args[0], *this); 292520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 292620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 292720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 292820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is an array of characters, an array of 292920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // char16_t, an array of char32_t, or an array of wchar_t, and the 293020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer is a string literal, see 8.5.2. 293120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Initializer && IsStringInit(Initializer, DestType, Context)) { 293220093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this); 293320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 293420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 293520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 293620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is (), the object is value-initialized. 293799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Value || 293899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct && NumArgs == 0)) { 293920093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryValueInitialization(S, Entity, Kind, *this); 294020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 294120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 294220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 294399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Handle default initialization. 294499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Default){ 294599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor TryDefaultInitialization(S, Entity, Kind, *this); 294699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 294799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 294818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 294920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, if the destination type is an array, the program is 295020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // ill-formed. 295120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (const ArrayType *AT = Context.getAsArrayType(DestType)) { 295220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (AT->getElementType()->isAnyCharacterType()) 295320093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_ArrayNeedsInitListOrStringLiteral); 295420093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 295520093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_ArrayNeedsInitList); 295620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 295720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 295820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2959cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2960cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman // Handle initialization in C 2961cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman if (!S.getLangOptions().CPlusPlus) { 2962cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman setSequenceKind(CAssignment); 2963cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman AddCAssignmentStep(DestType); 2964cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman return; 2965cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 296620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 296720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a (possibly cv-qualified) class type: 296820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isRecordType()) { 296920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initialization is direct-initialization, or if it is 297020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // copy-initialization where the cv-unqualified version of the 297120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // source type is the same class as, or a derived class of, the 297220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // class of the destination, constructors are considered. [...] 297320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Direct || 297420093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Kind.getKind() == InitializationKind::IK_Copy && 297520093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Context.hasSameUnqualifiedType(SourceType, DestType) || 297620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.IsDerivedFrom(SourceType, DestType)))) 297771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor TryConstructorInitialization(S, Entity, Kind, Args, NumArgs, 2978d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(), *this); 297920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise (i.e., for the remaining copy-initialization cases), 298020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // user-defined conversion sequences that can convert from the source 298120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type to the destination type or (when a conversion function is 298220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // used) to a derived class thereof are enumerated as described in 298320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 13.3.1.4, and the best one is chosen through overload resolution 298420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (13.3). 298520093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 298620093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 298720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 298820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 298920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 299099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs > 1) { 299199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SetFailed(FK_TooManyInitsForScalar); 299299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 299399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 299499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(NumArgs == 1 && "Zero-argument case handled above"); 299599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 299620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, if the source type is a (possibly cv-qualified) class 299720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type, conversion functions are considered. 299899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (!SourceType.isNull() && SourceType->isRecordType()) { 299920093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 300020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 300120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 300220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 300320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the initial value of the object being initialized is the 30044a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // (possibly converted) value of the initializer expression. Standard 300520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversions (Clause 4) will be used, if necessary, to convert the 300620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer expression to the cv-unqualified version of the 300720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // destination type; no user-defined conversions are considered. 300899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor setSequenceKind(StandardConversion); 300920093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryImplicitConversion(S, Entity, Kind, Initializer, *this); 301020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 301120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 301220093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::~InitializationSequence() { 301320093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (llvm::SmallVectorImpl<Step>::iterator Step = Steps.begin(), 301420093b4bf698f292c664676987541d5103b65b15Douglas Gregor StepEnd = Steps.end(); 301520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) 301620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Destroy(); 301720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 301820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 301920093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 302020093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Perform initialization 302120093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 302218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorstatic Sema::AssignmentAction 302318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorgetAssignmentAction(const InitializedEntity &Entity) { 302418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch(Entity.getKind()) { 302518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 302618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 302718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 302818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 302918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 303018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell when we're sending vs. passing? 303118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Passing; 303218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 303318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 303418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Returning; 303518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 303618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Exception: 303718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 303818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("No assignment action for C++-specific initialization"); 303918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 304018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 304118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 304218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell apart casting vs. converting? 304318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Casting; 304418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 304518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Member: 3046d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_ArrayElement: 3047d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 304818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 304918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 305018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 305118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Converting; 305218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 305318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 305418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorstatic bool shouldBindAsTemporary(const InitializedEntity &Entity, 305518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy) { 305618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 305718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 30581b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 30591b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 306018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return !IsCopy; 306118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 306218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 306318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 306418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 3065d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 3066a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson case InitializedEntity::EK_Exception: 306718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return false; 306818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 306918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 307018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 307118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return true; 307218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 307318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 307418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("missed an InitializedEntity kind?"); 307518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 307618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 307718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor/// \brief If we need to perform an additional copy of the initialized object 307818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor/// for this kind of entity (e.g., the result of a function or an object being 307918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor/// thrown), make the copy. 308018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorstatic Sema::OwningExprResult CopyIfRequiredForEntity(Sema &S, 308118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor const InitializedEntity &Entity, 30827abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor const InitializationKind &Kind, 308318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::OwningExprResult CurInit) { 30841b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Expr *CurInitExpr = (Expr *)CurInit.get(); 30851b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 308618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation Loc; 308718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 308818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 308918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 3090d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (Entity.getType()->isReferenceType()) 309118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return move(CurInit); 309218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Loc = Entity.getReturnLoc(); 309318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 309418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 309518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Exception: 309618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Loc = Entity.getThrowLoc(); 309718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 309818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 309918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 3100d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (Entity.getType()->isReferenceType() || 31017abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor Kind.getKind() != InitializationKind::IK_Copy) 31027abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return move(CurInit); 31037abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor Loc = Entity.getDecl()->getLocation(); 31047abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor break; 31057abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 31061b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 31071b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 31081b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson if (Entity.getType()->isReferenceType() || 31091b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Kind.getKind() != InitializationKind::IK_Copy) 31101b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson return move(CurInit); 31111b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Loc = CurInitExpr->getLocStart(); 31121b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson break; 31131b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 311418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 31157abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor // FIXME: Do we need this initialization for a parameter? 31167abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return move(CurInit); 31177abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 311818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 311918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 312018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 3121d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 312218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // We don't need to copy for any of these initialized entities. 312318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return move(CurInit); 312418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 312518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 312618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CXXRecordDecl *Class = 0; 312718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (const RecordType *Record = CurInitExpr->getType()->getAs<RecordType>()) 312818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Class = cast<CXXRecordDecl>(Record->getDecl()); 312918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (!Class) 313018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return move(CurInit); 313118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 313218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // Perform overload resolution using the class's copy constructors. 313318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DeclarationName ConstructorName 313418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor = S.Context.DeclarationNames.getCXXConstructorName( 313518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Context.getCanonicalType(S.Context.getTypeDeclType(Class))); 313618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DeclContext::lookup_iterator Con, ConEnd; 31375769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 313818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor for (llvm::tie(Con, ConEnd) = Class->lookup(ConstructorName); 313918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Con != ConEnd; ++Con) { 314018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // Find the constructor (which may be a template). 314118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(*Con); 314218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (!Constructor || Constructor->isInvalidDecl() || 31439e9199d8649cf3e10c98a69403f05dbb666d8fb1Douglas Gregor !Constructor->isCopyConstructor()) 314418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor continue; 31459aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 31469aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl 31479aa472c45d2bd81b7b52c225e8acc560d716db97John McCall = DeclAccessPair::make(Constructor, Constructor->getAccess()); 31489aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 314986820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall &CurInitExpr, 1, CandidateSet); 315018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 315118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 315218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OverloadCandidateSet::iterator Best; 315318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (S.BestViableFunction(CandidateSet, Loc, Best)) { 315418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Success: 315518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 315618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 315718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_No_Viable_Function: 315818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_no_viable) 31597abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 316018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 3161cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(CandidateSet, Sema::OCD_AllCandidates, 3162cbce60633c9864261105b289473e5a3ed7b4a729John McCall &CurInitExpr, 1); 316318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 316418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 316518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Ambiguous: 316618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_ambiguous) 31677abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 316818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 3169cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(CandidateSet, Sema::OCD_ViableCandidates, 3170cbce60633c9864261105b289473e5a3ed7b4a729John McCall &CurInitExpr, 1); 317118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 317218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 317318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Deleted: 317418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_deleted) 31757abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 317618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 317718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 317818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Best->Function->isDeleted(); 317918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 318018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 318118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 31829aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.CheckConstructorAccess(Loc, 31839aa472c45d2bd81b7b52c225e8acc560d716db97John McCall cast<CXXConstructorDecl>(Best->Function), 31849aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Best->FoundDecl.getAccess()); 31859aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 318618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit.release(); 318718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.BuildCXXConstructExpr(Loc, CurInitExpr->getType(), 318818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor cast<CXXConstructorDecl>(Best->Function), 318918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor /*Elidable=*/true, 319018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::MultiExprArg(S, 319118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor (void**)&CurInitExpr, 1)); 319218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 319320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 319420093b4bf698f292c664676987541d5103b65b15Douglas GregorAction::OwningExprResult 319520093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::Perform(Sema &S, 319620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 319720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 3198d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Action::MultiExprArg Args, 3199d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType *ResultType) { 320020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind == FailedSequence) { 320120093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 320220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Diagnose(S, Entity, Kind, (Expr **)Args.release(), NumArgs); 320320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 320420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 320520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 320620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind == DependentSequence) { 3207d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If the declaration is a non-dependent, incomplete array type 3208d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // that has an initializer, then its type will be completed once 3209d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // the initializer is instantiated. 3210d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (ResultType && !Entity.getType()->isDependentType() && 3211d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Args.size() == 1) { 3212d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DeclType = Entity.getType(); 3213d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (const IncompleteArrayType *ArrayT 3214d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getAsIncompleteArrayType(DeclType)) { 3215d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We don't currently have the ability to accurately 3216d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // compute the length of an initializer list without 3217d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // performing full type-checking of the initializer list 3218d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // (since we have to determine where braces are implicitly 3219d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // introduced and such). So, we fall back to making the array 3220d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // type a dependently-sized array type with no specified 3221d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // bound. 3222d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (isa<InitListExpr>((Expr *)Args.get()[0])) { 3223d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor SourceRange Brackets; 3224d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor 3225d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Scavange the location of the brackets from the entity, if we can. 3226d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (DeclaratorDecl *DD = Entity.getDecl()) { 3227d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) { 3228d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor TypeLoc TL = TInfo->getTypeLoc(); 3229d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (IncompleteArrayTypeLoc *ArrayLoc 3230d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor = dyn_cast<IncompleteArrayTypeLoc>(&TL)) 3231d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Brackets = ArrayLoc->getBracketsRange(); 3232d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor } 3233d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3234d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3235d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor *ResultType 3236d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getDependentSizedArrayType(ArrayT->getElementType(), 3237d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor /*NumElts=*/0, 3238d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getSizeModifier(), 3239d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getIndexTypeCVRQualifiers(), 3240d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Brackets); 3241d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3242d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3243d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3244d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3245d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3246085446216a198ced4183ec1571e1ae51c2920e98Eli Friedman if (Kind.getKind() == InitializationKind::IK_Copy || Kind.isExplicitCast()) 324720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Sema::OwningExprResult(S, Args.release()[0]); 324820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 324967fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor if (Args.size() == 0) 325067fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor return S.Owned((Expr *)0); 325167fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor 325220093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 325320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.Owned(new (S.Context) ParenListExpr(S.Context, 325420093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation(), 325520093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Expr **)Args.release(), 325620093b4bf698f292c664676987541d5103b65b15Douglas Gregor NumArgs, 325720093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation())); 325820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 325920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 326099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (SequenceKind == NoInitialization) 326199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return S.Owned((Expr *)0); 326299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 3263d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType().getNonReferenceType(); 3264d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor // FIXME: Ugly hack around the fact that Entity.getType() is not 3265a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // the same as Entity.getDecl()->getType() in cases involving type merging, 3266a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // and we want latter when it makes sense. 3267d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (ResultType) 3268a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() : 3269d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(); 327020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 327199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sema::OwningExprResult CurInit = S.Owned((Expr *)0); 327299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 327399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(!Steps.empty() && "Cannot have an empty initialization sequence"); 327499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 327599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // For initialization steps that start with a single initializer, 327699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // grab the only argument out the Args and place it into the "current" 327799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // initializer. 327899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (Steps.front().Kind) { 327918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ResolveAddressOfOverloadedFunction: 328018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseRValue: 328118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseLValue: 328218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReference: 328318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReferenceToTemporary: 328418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_UserConversion: 328518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionLValue: 328618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionRValue: 328718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConversionSequence: 328818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ListInitialization: 328918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 3290cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 329118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(Args.size() == 1); 329218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = Sema::OwningExprResult(S, ((Expr **)(Args.get()))[0]->Retain()); 329318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (CurInit.isInvalid()) 329418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 329518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 329618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 329718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConstructorInitialization: 329818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ZeroInitialization: 329918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 330020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 330120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 330220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Walk through the computed steps for the initialization sequence, 330320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // performing the specified conversions along the way. 330416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool ConstructorInitRequiresZeroInit = false; 330520093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (step_iterator Step = step_begin(), StepEnd = step_end(); 330620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) { 330720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 330820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 330920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 331020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *CurInitExpr = (Expr *)CurInit.get(); 331199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor QualType SourceType = CurInitExpr? CurInitExpr->getType() : QualType(); 331220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 331320093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Step->Kind) { 331420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 331520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Overload resolution determined which function invoke; update the 331620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer to reflect that choice. 3317b13b737a2450167c82e148590e8019b839ce6b98John McCall // Access control was done in overload resolution. 3318b13b737a2450167c82e148590e8019b839ce6b98John McCall CurInit = S.FixOverloadedFunctionReference(move(CurInit), 33199aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.Function); 332020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 332120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 332220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 332320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: { 332420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a derived-to-base cast that produces either an rvalue or an 332520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue. Perform that cast. 332620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 332720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Casts to inaccessible base classes are allowed with C-style casts. 332820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast(); 332920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckDerivedToBaseConversion(SourceType, Step->Type, 333020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr->getLocStart(), 333120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr->getSourceRange(), 333220093b4bf698f292c664676987541d5103b65b15Douglas Gregor IgnoreBaseAccess)) 333320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 333420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 333520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitCastExpr(Step->Type, 333620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastExpr::CK_DerivedToBase, 333720093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Expr*)CurInit.release(), 333820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Kind == SK_CastDerivedToBaseLValue)); 333920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 334020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 334120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 334220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 334320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (FieldDecl *BitField = CurInitExpr->getBitField()) { 334420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // References cannot bind to bit fields (C++ [dcl.init.ref]p5). 334520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield) 3346d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor << Entity.getType().isVolatileQualified() 334720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << BitField->getDeclName() 334820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << CurInitExpr->getSourceRange(); 334920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(BitField->getLocation(), diag::note_bitfield_decl); 335020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 335120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3352a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 3353093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson if (CurInitExpr->refersToVectorElement()) { 335441593e3b7da967b52bc3c7f488b8752dee63f38eJohn McCall // References cannot bind to vector elements. 3355093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element) 3356093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << Entity.getType().isVolatileQualified() 3357093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << CurInitExpr->getSourceRange(); 3358093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson return S.ExprError(); 3359093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson } 3360093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson 336120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Reference binding does not have any corresponding ASTs. 336220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 336320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 336420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckExceptionSpecCompatibility(CurInitExpr, DestType)) 336520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 33663aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 336720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 33683aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 336920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 3370a64a869312066ff6119d1d7ae03f88ce499e3f82Anders Carlsson // Reference binding does not have any corresponding ASTs. 3371a64a869312066ff6119d1d7ae03f88ce499e3f82Anders Carlsson 337220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 337320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckExceptionSpecCompatibility(CurInitExpr, DestType)) 337420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 337520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 337620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 337720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 337820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: { 337920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a user-defined conversion that invokes either a constructor 338020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // or a conversion function. 338120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastExpr::CastKind CastKind = CastExpr::CK_Unknown; 338218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy = false; 33839aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionDecl *Fn = Step->Function.Function; 33849aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundFn = Step->Function.FoundDecl; 3385b13b737a2450167c82e148590e8019b839ce6b98John McCall if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) { 338620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the selected constructor. 338720093b4bf698f292c664676987541d5103b65b15Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(S); 338820093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation Loc = CurInitExpr->getLocStart(); 338920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 3390b13b737a2450167c82e148590e8019b839ce6b98John McCall 339120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the arguments required to actually perform the constructor 339220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // call. 339320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CompleteConstructorCall(Constructor, 339420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::MultiExprArg(S, 339520093b4bf698f292c664676987541d5103b65b15Douglas Gregor (void **)&CurInitExpr, 339620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 1), 339720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Loc, ConstructorArgs)) 339820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 339920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 340020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the an expression that constructs a temporary. 340120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Step->Type, Constructor, 340220093b4bf698f292c664676987541d5103b65b15Douglas Gregor move_arg(ConstructorArgs)); 340320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 340420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 3405b13b737a2450167c82e148590e8019b839ce6b98John McCall 34069aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.CheckConstructorAccess(Kind.getLocation(), Constructor, 34079aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn.getAccess()); 340820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 340920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastKind = CastExpr::CK_ConstructorConversion; 341018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType Class = S.Context.getTypeDeclType(Constructor->getParent()); 341118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.Context.hasSameUnqualifiedType(SourceType, Class) || 341218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.IsDerivedFrom(SourceType, Class)) 341318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor IsCopy = true; 341420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 341520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the conversion function. 3416b13b737a2450167c82e148590e8019b839ce6b98John McCall CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn); 341718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 341858e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall S.CheckMemberOperatorAccess(Kind.getLocation(), CurInitExpr, 0, 34199aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn); 3420b13b737a2450167c82e148590e8019b839ce6b98John McCall 342120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Should we move this initialization into a separate 342220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // derived-to-base conversion? I believe the answer is "no", because 342320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // we don't want to turn off access control here for c-style casts. 34245fccd36204f11c8491325038e6ffcc784399098eDouglas Gregor if (S.PerformObjectArgumentInitialization(CurInitExpr, /*Qualifier=*/0, 34255fccd36204f11c8491325038e6ffcc784399098eDouglas Gregor Conversion)) 342620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 342720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 342820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Do a little dance to make sure that CurInit has the proper 342920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // pointer. 343020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 343120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 343220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the actual call to the conversion function. 343320093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(S.BuildCXXMemberCallExpr(CurInitExpr, Conversion)); 343420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid() || !CurInit.get()) 343520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 343620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 343720093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastKind = CastExpr::CK_UserDefinedConversion; 343820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 343920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 344018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (shouldBindAsTemporary(Entity, IsCopy)) 344118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 344218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 344320093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr = CurInit.takeAs<Expr>(); 344420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitCastExpr(CurInitExpr->getType(), 344520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastKind, 344620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr, 344718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor false)); 344818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 344918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (!IsCopy) 34507abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor CurInit = CopyIfRequiredForEntity(S, Entity, Kind, move(CurInit)); 345120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 345220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 345320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 345420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 345520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 345620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform a qualification conversion; these can never go wrong. 345720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ImpCastExprToType(CurInitExpr, Step->Type, 345820093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastExpr::CK_NoOp, 345920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Kind == SK_QualificationConversionLValue); 346020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 346120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(CurInitExpr); 346220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 346320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 346420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 34656864748fc9a780e6db0bb5a7bd20aa889882dc94Douglas Gregor if (S.PerformImplicitConversion(CurInitExpr, Step->Type, Sema::AA_Converting, 346620093b4bf698f292c664676987541d5103b65b15Douglas Gregor false, false, *Step->ICS)) 346720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 346820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 346920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 347020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(CurInitExpr); 347120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 3472d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3473d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: { 3474d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor InitListExpr *InitList = cast<InitListExpr>(CurInitExpr); 3475d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType Ty = Step->Type; 3476cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (S.CheckInitList(Entity, InitList, ResultType? *ResultType : Ty)) 3477d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return S.ExprError(); 3478d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3479d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit.release(); 3480d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit = S.Owned(InitList); 3481d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 3482d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 348351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 348451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: { 348551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor 34869aa472c45d2bd81b7b52c225e8acc560d716db97John McCall = cast<CXXConstructorDecl>(Step->Function.Function); 3487b13b737a2450167c82e148590e8019b839ce6b98John McCall 348851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build a call to the selected constructor. 348951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(S); 349051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceLocation Loc = Kind.getLocation(); 349151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 349251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine the arguments required to actually perform the constructor 349351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // call. 349451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (S.CompleteConstructorCall(Constructor, move(Args), 349551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Loc, ConstructorArgs)) 349651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return S.ExprError(); 349751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 349851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build the an expression that constructs a temporary. 349991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor if (Entity.getKind() == InitializedEntity::EK_Temporary && 350091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct || 350191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Kind.getKind() == InitializationKind::IK_Value)) { 350291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor // An explicitly-constructed temporary, e.g., X(1, 2). 350391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor unsigned NumExprs = ConstructorArgs.size(); 350491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Expr **Exprs = (Expr **)ConstructorArgs.take(); 350591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor S.MarkDeclarationReferenced(Kind.getLocation(), Constructor); 350691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor CurInit = S.Owned(new (S.Context) CXXTemporaryObjectExpr(S.Context, 350791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Constructor, 350891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Entity.getType(), 350991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Kind.getLocation(), 351091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Exprs, 351191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor NumExprs, 351291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Kind.getParenRange().getEnd())); 351391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor } else 351491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 351591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Constructor, 351691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor move_arg(ConstructorArgs), 351791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor ConstructorInitRequiresZeroInit, 35189db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Base); 351951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (CurInit.isInvalid()) 352051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return S.ExprError(); 3521b13b737a2450167c82e148590e8019b839ce6b98John McCall 3522b13b737a2450167c82e148590e8019b839ce6b98John McCall // Only check access if all of that succeeded. 35239aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.CheckConstructorAccess(Loc, Constructor, 35249aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.FoundDecl.getAccess()); 352518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 352618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool Elidable 352718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor = cast<CXXConstructExpr>((Expr *)CurInit.get())->isElidable(); 352818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (shouldBindAsTemporary(Entity, Elidable)) 352918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 353018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 353118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (!Elidable) 35327abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor CurInit = CopyIfRequiredForEntity(S, Entity, Kind, move(CurInit)); 353351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 353451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 353571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 353671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: { 353716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor step_iterator NextStep = Step; 353816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ++NextStep; 353916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (NextStep != StepEnd && 354016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor NextStep->Kind == SK_ConstructorInitialization) { 354116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // The need for zero-initialization is recorded directly into 354216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // the call to the object's constructor within the next step. 354316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ConstructorInitRequiresZeroInit = true; 354416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else if (Kind.getKind() == InitializationKind::IK_Value && 354516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor S.getLangOptions().CPlusPlus && 354616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !Kind.isImplicitValueInit()) { 354771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor CurInit = S.Owned(new (S.Context) CXXZeroInitValueExpr(Step->Type, 354871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getBegin(), 354971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getEnd())); 355016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else { 355171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitValueInitExpr(Step->Type)); 355216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 355371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor break; 355471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 355518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 355618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: { 355718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType SourceType = CurInitExpr->getType(); 355818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::AssignConvertType ConvTy = 355918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.CheckSingleAssignmentConstraints(Step->Type, CurInitExpr); 3560aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 3561aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor // If this is a call, allow conversion to a transparent union. 3562aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor if (ConvTy != Sema::Compatible && 3563aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor Entity.getKind() == InitializedEntity::EK_Parameter && 3564aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExpr) 3565aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor == Sema::Compatible) 3566aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor ConvTy = Sema::Compatible; 3567aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 356818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(), 356918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step->Type, SourceType, 357018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInitExpr, getAssignmentAction(Entity))) 357118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 357218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 357318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit.release(); 357418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.Owned(CurInitExpr); 357518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 357618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 3577cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3578cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: { 3579cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman QualType Ty = Step->Type; 3580cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman CheckStringInit(CurInitExpr, ResultType ? *ResultType : Ty, S); 3581cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman break; 3582cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 358320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 358420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 358520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 358620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return move(CurInit); 358720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 358820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 358920093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 359020093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Diagnose initialization failures 359120093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 359220093b4bf698f292c664676987541d5103b65b15Douglas Gregorbool InitializationSequence::Diagnose(Sema &S, 359320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 359420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 359520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs) { 359620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind != FailedSequence) 359720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return false; 359820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3599d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 360020093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Failure) { 360120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_TooManyInitsForReference: 36029db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // FIXME: Customize for the initialized entity? 36039db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (NumArgs == 0) 36049db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_without_init) 36059db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType.getNonReferenceType(); 36069db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor else // FIXME: diagnostic below could be better! 36079db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits) 36089db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 360920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 361020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 361120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitList: 361220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 361320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) 361420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Failure == FK_ArrayNeedsInitListOrStringLiteral); 361520093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 361620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 361720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_AddressOfOverloadFailed: 361820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ResolveAddressOfOverloadedFunction(Args[0], 361920093b4bf698f292c664676987541d5103b65b15Douglas Gregor DestType.getNonReferenceType(), 362020093b4bf698f292c664676987541d5103b65b15Douglas Gregor true); 362120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 362220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 362320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitOverloadFailed: 36244a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor case FK_UserConversionOverloadFailed: 362520093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (FailedOverloadResult) { 362620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Ambiguous: 362718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Failure == FK_UserConversionOverloadFailed) 362818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_ambiguous_condition) 362918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getType() << DestType 363018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 363118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 363218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_ref_init_ambiguous) 363318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << DestType << Args[0]->getType() 363418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 363518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 3636cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(FailedCandidateSet, Sema::OCD_ViableCandidates, 3637cbce60633c9864261105b289473e5a3ed7b4a729John McCall Args, NumArgs); 363820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 363920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 364020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_No_Viable_Function: 364120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition) 364220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 364320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 3644cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(FailedCandidateSet, Sema::OCD_AllCandidates, 3645cbce60633c9864261105b289473e5a3ed7b4a729John McCall Args, NumArgs); 364620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 364720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 364820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Deleted: { 364920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function) 365020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 365120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 365220093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 365320093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Ovl = S.BestViableFunction(FailedCandidateSet, 365420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind.getLocation(), 365520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Best); 365620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Ovl == OR_Deleted) { 365720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 365820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Best->Function->isDeleted(); 365920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 36609f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Inconsistent overload resolution?"); 366120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 366220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 366320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 366420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 366520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Success: 36669f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Conversion did not fail!"); 366720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 366820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 366920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 367020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 367120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 367220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 367320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), 367420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Failure == FK_NonConstLValueReferenceBindingToTemporary 367520093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? diag::err_lvalue_reference_bind_to_temporary 367620093b4bf698f292c664676987541d5103b65b15Douglas Gregor : diag::err_lvalue_reference_bind_to_unrelated) 3677ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor << DestType.getNonReferenceType().isVolatileQualified() 367820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 367920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 368020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 368120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 368220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 368320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_RValueReferenceBindingToLValue: 368420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref) 368520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 368620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 368720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 368820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitDropsQualifiers: 368920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) 369020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 369120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 369220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 369320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 369420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 369520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitFailed: 369620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_failed) 369720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 369820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Args[0]->isLvalue(S.Context) == Expr::LV_Valid) 369920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 370020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 370120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 370220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 370320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ConversionFailed: 370418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_init_conversion_failed) 370518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << (int)Entity.getKind() 370620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType 370720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Args[0]->isLvalue(S.Context) == Expr::LV_Valid) 370820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 370920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 3710d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 3711d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3712d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_TooManyInitsForScalar: { 371399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceRange R; 371499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 371599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (InitListExpr *InitList = dyn_cast<InitListExpr>(Args[0])) 371699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor R = SourceRange(InitList->getInit(1)->getLocStart(), 371799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitList->getLocEnd()); 371899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor else 371999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor R = SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 3720d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3721d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_excess_initializers) 372299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor << /*scalar=*/2 << R; 3723d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 3724d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3725d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3726d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_ReferenceBindingToInitList: 3727d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list) 3728d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getSourceRange(); 3729d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 3730d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3731d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_InitListBadDestinationType: 3732d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type) 3733d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange(); 3734d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 373551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 373651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case FK_ConstructorOverloadFailed: { 373751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceRange ArgsRange; 373851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (NumArgs) 373951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ArgsRange = SourceRange(Args[0]->getLocStart(), 374051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Args[NumArgs - 1]->getLocEnd()); 374151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 374251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // FIXME: Using "DestType" for the entity we're printing is probably 374351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // bad. 374451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor switch (FailedOverloadResult) { 374551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Ambiguous: 374651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_ambiguous_init) 374751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 374881201626aa08bcc9d05c8b3c6a1d38a7d577c3ceJohn McCall S.PrintOverloadCandidates(FailedCandidateSet, 3749cbce60633c9864261105b289473e5a3ed7b4a729John McCall Sema::OCD_ViableCandidates, Args, NumArgs); 375051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 375151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 375251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_No_Viable_Function: 37539db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 37549db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor (Entity.getKind() == InitializedEntity::EK_Base || 37559db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Member) && 37569db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 37579db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default initialization of a member or 37589db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // base within a constructor. If no viable function was 37599db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // found, notify the user that she needs to explicitly 37609db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialize this base/member. 37619db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor 37629db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = cast<CXXConstructorDecl>(S.CurContext); 37639db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Base) { 37649db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 37659db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 37669db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 37679db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*base=*/0 37689db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getType(); 37699db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 37709db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor RecordDecl *BaseDecl 37719db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getBaseSpecifier()->getType()->getAs<RecordType>() 37729db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ->getDecl(); 37739db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(BaseDecl->getLocation(), diag::note_previous_decl) 37749db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(BaseDecl); 37759db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 37769db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 37779db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 37789db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 37799db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*member=*/1 37809db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 37819db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_field_decl); 37829db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 37839db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (const RecordType *Record 37849db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getType()->getAs<RecordType>()) 37859db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Record->getDecl()->getLocation(), 37869db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor diag::note_previous_decl) 37879db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(Record->getDecl()); 37889db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 37899db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor break; 37909db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 37919db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 379251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init) 379351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 3794cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(FailedCandidateSet, Sema::OCD_AllCandidates, 3795cbce60633c9864261105b289473e5a3ed7b4a729John McCall Args, NumArgs); 379651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 379751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 379851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Deleted: { 379951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 380051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << true << DestType << ArgsRange; 380151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 380251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadingResult Ovl = S.BestViableFunction(FailedCandidateSet, 380351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getLocation(), 380451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Best); 380551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (Ovl == OR_Deleted) { 380651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 380751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << Best->Function->isDeleted(); 380851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } else { 380951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Inconsistent overload resolution?"); 381051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 381151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 381251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 381351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 381451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Success: 381551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Conversion did not fail!"); 381651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 381751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 381851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 381951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 382099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 382199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case FK_DefaultInitOfConst: 38229db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Member && 38239db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 38249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default-initialization of a const member in 38259db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // a constructor. Complain that it needs to be explicitly 38269db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialized. 38279db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext); 38289db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor) 38299db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 38309db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 38319db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*const=*/1 38329db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 38339db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl) 38349db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 38359db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 38369db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_default_init_const) 38379db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType << (bool)DestType->getAs<RecordType>(); 38389db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 383999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor break; 384020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 384120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 384220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return true; 384320093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 384418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 3845de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump(llvm::raw_ostream &OS) const { 3846de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (SequenceKind) { 3847de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FailedSequence: { 3848de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Failed sequence: "; 3849de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (Failure) { 3850de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForReference: 3851de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for reference"; 3852de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3853de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3854de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitList: 3855de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list"; 3856de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3857de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3858de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 3859de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list or string literal"; 3860de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3861de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3862de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_AddressOfOverloadFailed: 3863de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "address of overloaded function failed"; 3864de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3865de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3866de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitOverloadFailed: 3867de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overload resolution for reference initialization failed"; 3868de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3869de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3870de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 3871de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to temporary"; 3872de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3873de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3874de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 3875de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to unrelated type"; 3876de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3877de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3878de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_RValueReferenceBindingToLValue: 3879de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "rvalue reference bound to an lvalue"; 3880de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3881de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3882de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitDropsQualifiers: 3883de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization drops qualifiers"; 3884de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3885de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3886de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitFailed: 3887de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization failed"; 3888de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3889de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3890de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConversionFailed: 3891de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "conversion failed"; 3892de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3893de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3894de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForScalar: 3895de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for scalar"; 3896de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3897de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3898de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceBindingToInitList: 3899de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "referencing binding to initializer list"; 3900de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3901de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3902de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_InitListBadDestinationType: 3903de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "initializer list for non-aggregate, non-scalar type"; 3904de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3905de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3906de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_UserConversionOverloadFailed: 3907de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overloading failed for user-defined conversion"; 3908de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3909de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3910de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConstructorOverloadFailed: 3911de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor overloading failed"; 3912de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3913de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3914de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_DefaultInitOfConst: 3915de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "default initialization of a const variable"; 3916de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3917de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 3918de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << '\n'; 3919de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 3920de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 3921de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3922de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case DependentSequence: 3923de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Dependent sequence: "; 3924de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 3925de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3926de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case UserDefinedConversion: 3927de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "User-defined conversion sequence: "; 3928de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3929de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3930de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ConstructorInitialization: 3931de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Constructor initialization sequence: "; 3932de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3933de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3934de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ReferenceBinding: 3935de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Reference binding: "; 3936de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3937de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3938de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ListInitialization: 3939de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "List initialization: "; 3940de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3941de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3942de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ZeroInitialization: 3943de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Zero initialization\n"; 3944de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 3945de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3946de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case NoInitialization: 3947de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "No initialization\n"; 3948de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 3949de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3950de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case StandardConversion: 3951de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Standard conversion: "; 3952de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3953de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3954de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case CAssignment: 3955de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment: "; 3956de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3957de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3958de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case StringInit: 3959de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "String initialization: "; 3960de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3961de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 3962de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3963de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) { 3964de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor if (S != step_begin()) { 3965de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << " -> "; 3966de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 3967de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3968de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (S->Kind) { 3969de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 3970de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "resolve address of overloaded function"; 3971de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3972de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3973de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseRValue: 3974de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (rvalue" << S->Type.getAsString() << ")"; 3975de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3976de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3977de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseLValue: 3978de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (lvalue" << S->Type.getAsString() << ")"; 3979de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3980de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3981de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReference: 3982de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to lvalue"; 3983de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3984de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3985de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReferenceToTemporary: 3986de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to a temporary"; 3987de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3988de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3989de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_UserConversion: 39909aa472c45d2bd81b7b52c225e8acc560d716db97John McCall OS << "user-defined conversion via " 39919aa472c45d2bd81b7b52c225e8acc560d716db97John McCall << S->Function.Function->getNameAsString(); 3992de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3993de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3994de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionRValue: 3995de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (rvalue)"; 3996de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3997de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionLValue: 3998de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (lvalue)"; 3999de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4000de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4001de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConversionSequence: 4002de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "implicit conversion sequence ("; 4003de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor S->ICS->DebugPrint(); // FIXME: use OS 4004de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << ")"; 4005de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4006de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4007de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ListInitialization: 4008de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "list initialization"; 4009de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4010de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4011de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConstructorInitialization: 4012de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor initialization"; 4013de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4014de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4015de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ZeroInitialization: 4016de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "zero initialization"; 4017de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4018de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4019de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CAssignment: 4020de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment"; 4021de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4022de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4023de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_StringInit: 4024de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "string initialization"; 4025de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4026de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4027de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4028de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 4029de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4030de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump() const { 4031de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor dump(llvm::errs()); 4032de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 4033de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 403418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 403518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// Initialization helper functions 403618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 403718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::OwningExprResult 403818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::PerformCopyInitialization(const InitializedEntity &Entity, 403918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation EqualLoc, 404018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OwningExprResult Init) { 404118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Init.isInvalid()) 404218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return ExprError(); 404318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 404418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Expr *InitE = (Expr *)Init.get(); 404518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(InitE && "No initialization expression?"); 404618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 404718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (EqualLoc.isInvalid()) 404818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc = InitE->getLocStart(); 404918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 405018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationKind Kind = InitializationKind::CreateCopy(InitE->getLocStart(), 405118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc); 405218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 405318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Init.release(); 405418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Seq.Perform(*this, Entity, Kind, 405518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor MultiExprArg(*this, (void**)&InitE, 1)); 405618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 4057