SemaInit.cpp revision 3aba09376c5f49c4c8d176109ea4835bc2c528ee
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" 2105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor#include "clang/Parse/Designator.h" 220cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff#include "clang/AST/ASTContext.h" 232078bb9c9336da56ea521e98e718556b227541f6Anders Carlsson#include "clang/AST/ExprCXX.h" 2479e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner#include "clang/AST/ExprObjC.h" 25d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor#include "clang/AST/TypeLoc.h" 2620093b4bf698f292c664676987541d5103b65b15Douglas Gregor#include "llvm/Support/ErrorHandling.h" 27c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor#include <map> 2805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorusing namespace clang; 290cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 30dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 31dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Sema Initialization Checking 32dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 33dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 3479e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattnerstatic Expr *IsStringInit(Expr *Init, QualType DeclType, ASTContext &Context) { 358879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner const ArrayType *AT = Context.getAsArrayType(DeclType); 368879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (!AT) return 0; 378879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 388718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT)) 398718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman return 0; 408718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman 418879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // See if this is a string literal or @encode. 428879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner Init = Init->IgnoreParens(); 431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 448879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Handle @encode, which is a narrow string. 458879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType()) 468879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 478879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 488879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Otherwise we can only handle string literals. 498879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner StringLiteral *SL = dyn_cast<StringLiteral>(Init); 50220b6369d7717bfe6894b46cef055d3e763827f2Chris Lattner if (SL == 0) return 0; 51bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman 52bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman QualType ElemTy = Context.getCanonicalType(AT->getElementType()); 538879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // char array can be initialized with a narrow string. 548879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Only allow char x[] = "foo"; not char x[] = L"foo"; 558879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (!SL->isWide()) 56bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman return ElemTy->isCharType() ? Init : 0; 578879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 58bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // wchar_t array can be initialized with a wide string: C99 6.7.8p15 (with 59bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // correction from DR343): "An array with element type compatible with a 60bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // qualified or unqualified version of wchar_t may be initialized by a wide 61bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // string literal, optionally enclosed in braces." 62bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman if (Context.typesAreCompatible(Context.getWCharType(), 63bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman ElemTy.getUnqualifiedType())) 648879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner return 0; 67dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 68dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 6979e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattnerstatic void CheckStringInit(Expr *Str, QualType &DeclT, Sema &S) { 7079e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner // Get the length of the string as parsed. 7179e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner uint64_t StrLength = 7279e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner cast<ConstantArrayType>(Str->getType())->getSize().getZExtValue(); 7379e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7579e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner const ArrayType *AT = S.Context.getAsArrayType(DeclT); 76dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p14. We have an array of character type with unknown size 78dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // being initialized to a string literal. 79dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner llvm::APSInt ConstVal(32); 8019da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner ConstVal = StrLength; 81dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // Return a new array type (C99 6.7.8p22). 8246a617a792bfab0d9b1e057371ea3b9540802226John McCall DeclT = S.Context.getConstantArrayType(IAT->getElementType(), 8346a617a792bfab0d9b1e057371ea3b9540802226John McCall ConstVal, 8446a617a792bfab0d9b1e057371ea3b9540802226John McCall ArrayType::Normal, 0); 8519da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner return; 86dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner } 871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 888718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman const ConstantArrayType *CAT = cast<ConstantArrayType>(AT); 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 908718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // C99 6.7.8p14. We have an array of character type with known size. However, 918718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // the size may be smaller or larger than the string we are initializing. 928718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // FIXME: Avoid truncation for 64-bit length strings. 938718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (StrLength-1 > CAT->getSize().getZExtValue()) 948718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman S.Diag(Str->getSourceRange().getBegin(), 958718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman diag::warn_initializer_string_for_char_array_too_long) 968718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman << Str->getSourceRange(); 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 988718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // Set the type to the actual size that we are initializing. If we have 998718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // something like: 1008718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // char x[1] = "foo"; 1018718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // then this will set the string literal's type to char[1]. 1028718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman Str->setType(DeclT); 103dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 104dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 105dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 106dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Semantic checking for initializer lists. 107dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 108dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 1099e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// @brief Semantic checking for initializer lists. 1109e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1119e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// The InitListChecker class contains a set of routines that each 1129e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// handle the initialization of a certain kind of entity, e.g., 1139e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arrays, vectors, struct/union types, scalars, etc. The 1149e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// InitListChecker itself performs a recursive walk of the subobject 1159e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure of the type to be initialized, while stepping through 1169e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// the initializer list one element at a time. The IList and Index 1179e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// parameters to each of the Check* routines contain the active 1189e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// (syntactic) initializer list and the index into that initializer 1199e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list that represents the current initializer. Each routine is 1209e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// responsible for moving that Index forward as it consumes elements. 1219e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1229e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// Each Check* routine also has a StructuredList/StructuredIndex 1239e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arguments, which contains the current the "structured" (semantic) 1249e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initializer list and the index into that initializer list where we 1259e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// are copying initializers as we map them over to the semantic 1269e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. Once we have completed our recursive walk of the subobject 1279e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure, we will have constructed a full semantic initializer 1289e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. 1299e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1309e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// C99 designators cause changes in the initializer list traversal, 1319e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// because they make the initialization "jump" into a specific 1329e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// subobject and then continue the initialization from that 1339e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// point. CheckDesignatedInitializer() recursively steps into the 1349e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// designated subobject and manages backing out the recursion to 1359e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initialize the subobjects after the one designated. 1368b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattnernamespace { 137c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorclass InitListChecker { 1380820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner Sema &SemaRef; 139c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool hadError; 140c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor std::map<InitListExpr *, InitListExpr *> SyntacticToSemantic; 141c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *FullyStructuredList; 1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1438ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckImplicitInitList(const InitializedEntity &Entity, 144987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, QualType T, 1459e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 146eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 147eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1488ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckExplicitInitList(const InitializedEntity &Entity, 14946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 1509e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 151eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 152eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1538ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckListElementTypes(const InitializedEntity &Entity, 15446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &DeclType, 1551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 156c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1579e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 158eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 159eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1608ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckSubElementType(const InitializedEntity &Entity, 16146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType ElemType, 162c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1639e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1649e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1658ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckScalarType(const InitializedEntity &Entity, 16646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 167c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1689e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1699e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1708ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckReferenceType(const InitializedEntity &Entity, 1718ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 172930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 173930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 174930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex); 1758ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckVectorType(const InitializedEntity &Entity, 17646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, unsigned &Index, 1779e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1789e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1798ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckStructUnionTypes(const InitializedEntity &Entity, 1802bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, QualType DeclType, 1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator Field, 182c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 1839e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 184eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 185eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1868ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckArrayType(const InitializedEntity &Entity, 187784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::APSInt elementIndex, 189c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 1909e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1919e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1928ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson bool CheckDesignatedInitializer(const InitializedEntity &Entity, 1939a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, DesignatedInitExpr *DIE, 194711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &CurrentObjectType, 196c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor RecordDecl::field_iterator *NextField, 197c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor llvm::APSInt *NextElementIndex, 198c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 199c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 200c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &StructuredIndex, 201eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 202eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject); 203c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 204c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor QualType CurrentObjectType, 205c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 206c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned StructuredIndex, 207c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor SourceRange InitRange); 2089e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor void UpdateStructuredListElement(InitListExpr *StructuredList, 2099e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex, 210c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor Expr *expr); 211c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numArrayElements(QualType DeclType); 212c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numStructUnionElements(QualType DeclType); 213930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 214d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor void FillInValueInitForField(unsigned Init, FieldDecl *Field, 215d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 216d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 217cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor void FillInValueInitializations(const InitializedEntity &Entity, 218cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 219c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorpublic: 220cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker(Sema &S, const InitializedEntity &Entity, 221cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *IL, QualType &T); 222c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool HadError() { return hadError; } 223c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 224c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // @brief Retrieves the fully-structured initializer list used for 225c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // semantic analysis and code generation. 226c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } 227c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor}; 2288b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattner} // end anonymous namespace 22968355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 230d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregorvoid InitListChecker::FillInValueInitForField(unsigned Init, FieldDecl *Field, 231d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 232d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, 233d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor bool &RequiresSecondPass) { 234d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 235d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned NumInits = ILE->getNumInits(); 236d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializedEntity MemberEntity 237d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitializedEntity::InitializeMember(Field, &ParentEntity); 238d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 239d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // FIXME: We probably don't need to handle references 240d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // specially here, since value-initialization of references is 241d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // handled in InitializationSequence. 242d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->getType()->isReferenceType()) { 243d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // C++ [dcl.init.aggr]p9: 244d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // If an incomplete or empty initializer-list leaves a 245d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // member of reference type uninitialized, the program is 246d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // ill-formed. 247d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized) 248d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << Field->getType() 249d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << ILE->getSyntacticForm()->getSourceRange(); 250d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Field->getLocation(), 251d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor diag::note_uninit_reference_member); 252d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 253d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 254d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 255d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 256d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 257d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor true); 258d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationSequence InitSeq(SemaRef, MemberEntity, Kind, 0, 0); 259d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (!InitSeq) { 260d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitSeq.Diagnose(SemaRef, MemberEntity, Kind, 0, 0); 261d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 262d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 263d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 264d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 265d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Sema::OwningExprResult MemberInit 266d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitSeq.Perform(SemaRef, MemberEntity, Kind, 267d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Sema::MultiExprArg(SemaRef, 0, 0)); 268d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (MemberInit.isInvalid()) { 269d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 270d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 271d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 272d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 273d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) { 274d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Do nothing 275d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (Init < NumInits) { 276d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->setInit(Init, MemberInit.takeAs<Expr>()); 277d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitSeq.getKind() 278d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor == InitializationSequence::ConstructorInitialization) { 279d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Value-initialization requires a constructor call, so 280d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // extend the initializer list to include the constructor 281d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // call and make a note that we'll need to take another pass 282d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // through the initializer list. 283d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->updateInit(Init, MemberInit.takeAs<Expr>()); 284d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass = true; 285d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 286d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitListExpr *InnerILE 287d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 288d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitializations(MemberEntity, InnerILE, 289d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass); 290d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor} 291d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 2924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Recursively replaces NULL values within the given initializer list 2934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// with expressions that perform value-initialization of the 2944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// appropriate type. 295cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregorvoid 296cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::FillInValueInitializations(const InitializedEntity &Entity, 297cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, 298cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool &RequiresSecondPass) { 2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((ILE->getType() != SemaRef.Context.VoidTy) && 300930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor "Should not have void type"); 30187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 30287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (ILE->getSyntacticForm()) 30387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor Loc = ILE->getSyntacticForm()->getSourceRange().getBegin(); 3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3056217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) { 306d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion() && 307d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->getInitializedFieldInUnion()) 308d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(0, ILE->getInitializedFieldInUnion(), 309d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Entity, ILE, RequiresSecondPass); 310d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor else { 311d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned Init = 0; 312d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor for (RecordDecl::field_iterator 313d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field = RType->getDecl()->field_begin(), 314d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FieldEnd = RType->getDecl()->field_end(); 315d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field != FieldEnd; ++Field) { 316d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->isUnnamedBitfield()) 317d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor continue; 318d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 319d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 32087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 32187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 322d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(Init, *Field, Entity, ILE, RequiresSecondPass); 323d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 324cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 325cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 326d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ++Init; 327d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 328d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Only look at the first initialization of a union. 329d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion()) 330d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor break; 331d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 3324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 3334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 3351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType ElementType; 3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 339cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializedEntity ElementEntity = Entity; 34087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumInits = ILE->getNumInits(); 34187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumElements = NumInits; 3420820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) { 3434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = AType->getElementType(); 34487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) 34587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = CAType->getSize().getZExtValue(); 346cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 347cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 348183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) { 3494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = VType->getElementType(); 35087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = VType->getNumElements(); 351cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 352cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else 3544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = ILE->getType(); 3551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 356cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 35787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor for (unsigned Init = 0; Init != NumElements; ++Init) { 35816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (hadError) 35916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return; 36016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 361d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement || 362d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson ElementEntity.getKind() == InitializedEntity::EK_VectorElement) 363cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity.setElementIndex(Init); 364cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 36587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 366cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 367cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor true); 368cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationSequence InitSeq(SemaRef, ElementEntity, Kind, 0, 0); 369cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!InitSeq) { 370cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitSeq.Diagnose(SemaRef, ElementEntity, Kind, 0, 0); 37187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor hadError = true; 37287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 37387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 37487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 375cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor Sema::OwningExprResult ElementInit 376cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor = InitSeq.Perform(SemaRef, ElementEntity, Kind, 377cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor Sema::MultiExprArg(SemaRef, 0, 0)); 378cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (ElementInit.isInvalid()) { 37916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor hadError = true; 380cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 381cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 382cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 383cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (hadError) { 384cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Do nothing 385cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (Init < NumInits) { 386cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ILE->setInit(Init, ElementInit.takeAs<Expr>()); 387cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (InitSeq.getKind() 388cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor == InitializationSequence::ConstructorInitialization) { 389cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Value-initialization requires a constructor call, so 390cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // extend the initializer list to include the constructor 391cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // call and make a note that we'll need to take another pass 392cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // through the initializer list. 393cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ILE->updateInit(Init, ElementInit.takeAs<Expr>()); 394cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass = true; 395cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 396ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else if (InitListExpr *InnerILE 397cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 398cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(ElementEntity, InnerILE, RequiresSecondPass); 3994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 4004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 4014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 40268355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 403cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity, 404cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *IL, QualType &T) 4050820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner : SemaRef(S) { 4060cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff hadError = false; 407c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 408b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman unsigned newIndex = 0; 4094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 4101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FullyStructuredList 411ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor = getStructuredSubobjectInit(IL, newIndex, T, 0, 0, IL->getSourceRange()); 4128ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckExplicitInitList(Entity, IL, T, newIndex, 41346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson FullyStructuredList, newStructuredIndex, 414eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor /*TopLevelObject=*/true); 415c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 416cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!hadError) { 417cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool RequiresSecondPass = false; 418cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, RequiresSecondPass); 41916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (RequiresSecondPass && !hadError) 420cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, 421cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass); 422cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 4230cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4240cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4250cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numArrayElements(QualType DeclType) { 426638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // FIXME: use a proper constant 427638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman int maxElements = 0x7FFFFFFF; 428c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = 4290820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 4300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = static_cast<int>(CAT->getSize().getZExtValue()); 4310cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 4320cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return maxElements; 4330cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4340cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4350cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numStructUnionElements(QualType DeclType) { 4366217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl(); 4374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor int InitializableMembers = 0; 4381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (RecordDecl::field_iterator 43917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = structDecl->field_begin(), 44017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = structDecl->field_end(); 4414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Field != FieldEnd; ++Field) { 4424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if ((*Field)->getIdentifier() || !(*Field)->isBitField()) 4434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++InitializableMembers; 4444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 44539ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (structDecl->isUnion()) 446f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return std::min(InitializableMembers, 1); 447f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return InitializableMembers - structDecl->hasFlexibleArrayMember(); 4480cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4490cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4508ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity, 451987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, 4524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType T, unsigned &Index, 4534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 454eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 455eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 4560cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff int maxElements = 0; 4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4580cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (T->isArrayType()) 4590cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numArrayElements(T); 4600cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else if (T->isStructureType() || T->isUnionType()) 4610cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numStructUnionElements(T); 462b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman else if (T->isVectorType()) 463183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall maxElements = T->getAs<VectorType>()->getNumElements(); 4640cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else 4650cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff assert(0 && "CheckImplicitInitList(): Illegal type"); 466b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 467402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman if (maxElements == 0) { 4680820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(ParentIList->getInit(Index)->getLocStart(), 469402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman diag::err_implicit_empty_initializer); 4704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 471402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman hadError = true; 472402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman return; 473402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman } 474402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman 4754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Build a structured initializer list corresponding to this subobject. 4764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredSubobjectInitList 4771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList, 4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredIndex, 479ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor SourceRange(ParentIList->getInit(Index)->getSourceRange().getBegin(), 480ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor ParentIList->getSourceRange().getEnd())); 4814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredSubobjectInitIndex = 0; 4824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 4834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Check the element types and build the structural subobject. 48487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned StartIndex = Index; 485987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson CheckListElementTypes(Entity, ParentIList, T, 486987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredSubobjectInitList, 488eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredSubobjectInitIndex, 489eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 49087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1); 491a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor StructuredSubobjectInitList->setType(T); 492a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor 493ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor // Update the structured sub-object initializer so that it's ending 49487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor // range corresponds with the end of the last initializer it used. 49587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (EndIndex < ParentIList->getNumInits()) { 4961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation EndLoc 49787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor = ParentIList->getInit(EndIndex)->getSourceRange().getEnd(); 49887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor StructuredSubobjectInitList->setRBraceLoc(EndLoc); 49987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 5000cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5010cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5028ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, 50346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 5044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 506eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 507eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 508c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman assert(IList->isExplicit() && "Illegal Implicit InitListExpr"); 5094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = StructuredList; 5104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList->setSyntacticForm(IList); 51146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true, 51246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson Index, StructuredList, StructuredIndex, TopLevelObject); 513a647caad2dec67ac25b763f06237cfe3c3968b51Steve Naroff IList->setType(T); 5144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList->setType(T); 515638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (hadError) 516638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 517c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 518638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (Index < IList->getNumInits()) { 519c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman // We have leftover initializers 520e540858b289b23653bcb23646f135729203635cbEli Friedman if (StructuredIndex == 1 && 521e540858b289b23653bcb23646f135729203635cbEli Friedman IsStringInit(StructuredList->getInit(0), T, SemaRef.Context)) { 5227c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers_in_char_array_initializer; 523e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 5247c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor DK = diag::err_excess_initializers_in_char_array_initializer; 525e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 526e540858b289b23653bcb23646f135729203635cbEli Friedman } 527bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman // Special-case 5280820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 529dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getInit(Index)->getSourceRange(); 530d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman } else if (!T->isIncompleteType()) { 531b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // Don't complain for incomplete types, since we'll get an error 532b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // elsewhere 533eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType CurrentObjectType = StructuredList->getType(); 5341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int initKind = 535eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isArrayType()? 0 : 536eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isVectorType()? 1 : 537eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isScalarType()? 2 : 538eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isUnionType()? 3 : 539eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 4; 5407c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 5417c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers; 542e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 543e540858b289b23653bcb23646f135729203635cbEli Friedman DK = diag::err_excess_initializers; 5440863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman hadError = true; 5450863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman } 5460863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman if (SemaRef.getLangOptions().OpenCL && initKind == 1) { 5470863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman DK = diag::err_excess_initializers; 548e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 549e540858b289b23653bcb23646f135729203635cbEli Friedman } 5507c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 5510820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 552eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << initKind << IList->getInit(Index)->getSourceRange(); 553c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 554c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 555cda25a977e4b7fe4e080b87586410eaeab7b62f6Eli Friedman 556759f25237864f3a3cc23eb01f0c0ce6edcc9342dEli Friedman if (T->isScalarType() && !TopLevelObject) 5570820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::warn_braces_around_scalar_init) 558a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor << IList->getSourceRange() 55929d9c1adfadf65e2d847d44bec37746844b9e0e3Chris Lattner << CodeModificationHint::CreateRemoval(IList->getLocStart()) 56029d9c1adfadf65e2d847d44bec37746844b9e0e3Chris Lattner << CodeModificationHint::CreateRemoval(IList->getLocEnd()); 5610cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5620cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5638ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckListElementTypes(const InitializedEntity &Entity, 56446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 5651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &DeclType, 56687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool SubobjectIsDesignatorContext, 5674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 569eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 570eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 571c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (DeclType->isScalarType()) { 57246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, DeclType, Index, 57346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 574c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (DeclType->isVectorType()) { 57546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckVectorType(Entity, IList, DeclType, Index, 57646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 577d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor } else if (DeclType->isAggregateType()) { 578d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor if (DeclType->isRecordType()) { 5796217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 5802bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson CheckStructUnionTypes(Entity, IList, DeclType, RD->field_begin(), 5814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubobjectIsDesignatorContext, Index, 582eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 583eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 58487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } else if (DeclType->isArrayType()) { 585f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor llvm::APSInt Zero( 5860820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()), 587f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor false); 588784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson CheckArrayType(Entity, IList, DeclType, Zero, 589784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson SubobjectIsDesignatorContext, Index, 5904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 591ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else 5924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor assert(0 && "Aggregate that isn't a structure or array?!"); 593613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff } else if (DeclType->isVoidType() || DeclType->isFunctionType()) { 594613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff // This type is invalid, issue a diagnostic. 5954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 5960820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 597d162584991885ab004a02573a73ce06422b921fcChris Lattner << DeclType; 598d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman hadError = true; 599930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isRecordType()) { 600930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init]p14: 601930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] If the class is an aggregate (8.5.1), and the initializer 602930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // is a brace-enclosed list, see 8.5.1. 603930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 604930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Note: 8.5.1 is handled below; here, we diagnose the case where 605930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // we have an initializer list and a destination type that is not 606930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an aggregate. 607930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // FIXME: In C++0x, this is yet another form of initialization. 6080820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 609930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType << IList->getSourceRange(); 610930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 611930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isReferenceType()) { 6128ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, DeclType, Index, 6138ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 6140cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } else { 6150cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // In C, all types are either scalars or aggregates, but 6161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // additional handling is needed here for C++ (and possibly others?). 6170cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff assert(0 && "Unsupported initializer type"); 6180cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 6190cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6200cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6218ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckSubElementType(const InitializedEntity &Entity, 62246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 6231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElemType, 6244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 6254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 6264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 6276fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 628c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) { 629c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman unsigned newIndex = 0; 6304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 6311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *newStructuredList 6324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor = getStructuredSubobjectInit(IList, Index, ElemType, 6334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex, 6344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubInitList->getSourceRange()); 63546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckExplicitInitList(Entity, SubInitList, ElemType, newIndex, 6364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor newStructuredList, newStructuredIndex); 6374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 6384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 63979e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner } else if (Expr *Str = IsStringInit(expr, ElemType, SemaRef.Context)) { 64079e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner CheckStringInit(Str, ElemType, SemaRef); 641f71ae8d8024561f92dd7916363e7a791684563ccChris Lattner UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 6424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 643c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (ElemType->isScalarType()) { 64446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, ElemType, Index, 64546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 646930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (ElemType->isReferenceType()) { 6478ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, ElemType, Index, 6488ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 649b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman } else { 6500820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (SemaRef.getLangOptions().CPlusPlus) { 651930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 652930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // All implicit type conversions (clause 4) are considered when 653930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // initializing the aggregate member with an ini- tializer from 654930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an initializer-list. If the initializer can initialize a 655930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // member, the member is initialized. [...] 6561b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 6571b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson // FIXME: Better EqualLoc? 6581b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationKind Kind = 6591b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationKind::CreateCopy(expr->getLocStart(), SourceLocation()); 6601b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationSequence Seq(SemaRef, Entity, Kind, &expr, 1); 6611b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 6621b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson if (Seq) { 6631b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Sema::OwningExprResult Result = 6641b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Seq.Perform(SemaRef, Entity, Kind, 6651b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Sema::MultiExprArg(SemaRef, (void **)&expr, 1)); 6661b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson if (Result.isInvalid()) 667930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 6681b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 6691b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson UpdateStructuredListElement(StructuredList, StructuredIndex, 6701b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Result.takeAs<Expr>()); 671930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 672930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 673930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 674930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 675930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Fall through for subaggregate initialization 676930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 6771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p13: 678930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 679930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // The initializer for a structure or union object that has 680930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // automatic storage duration shall be either an initializer 681930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // list as described below, or a single expression that has 682930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // compatible structure or union type. In the latter case, the 683930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // initial value of the object, including unnamed members, is 684930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // that of the expression. 6856b5374f837f925d99b1a76bc2fe8c98c1698df7fEli Friedman if ((ElemType->isRecordType() || ElemType->isVectorType()) && 6868718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman SemaRef.Context.hasSameUnqualifiedType(expr->getType(), ElemType)) { 687930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 688930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 689930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 690930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 691930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 692930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Fall through for subaggregate initialization 693930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 694930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 695930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 697930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] Otherwise, if the member is itself a non-empty 698930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // subaggregate, brace elision is assumed and the initializer is 699930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // considered for the initialization of the first member of 700930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // the subaggregate. 701930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (ElemType->isAggregateType() || ElemType->isVectorType()) { 702987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList, 703930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor StructuredIndex); 704930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 705930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 706930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // We cannot initialize this element, so let 707930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // PerformCopyInitialization produce the appropriate diagnostic. 708ca755fe38f00d63363b3a3ac2a1ae6c1eb2957f9Anders Carlsson SemaRef.PerformCopyInitialization(Entity, SourceLocation(), 709ca755fe38f00d63363b3a3ac2a1ae6c1eb2957f9Anders Carlsson SemaRef.Owned(expr)); 710ca755fe38f00d63363b3a3ac2a1ae6c1eb2957f9Anders Carlsson IList->setInit(Index, 0); 711930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 712930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 713930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 714930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 715930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 716b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman} 717b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 7188ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckScalarType(const InitializedEntity &Entity, 71946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 7206fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned &Index, 7214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 7224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 7230cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 7246fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 725c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (isa<InitListExpr>(expr)) { 7260820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 727dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner diag::err_many_braces_around_scalar_init) 728dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getSourceRange(); 729bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman hadError = true; 730bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman ++Index; 7314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 732bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 73305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } else if (isa<DesignatedInitExpr>(expr)) { 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(expr->getSourceRange().getBegin(), 73505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor diag::err_designator_for_scalar_init) 73605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << DeclType << expr->getSourceRange(); 73705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 73805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Index; 7394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 74005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return; 7410cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 74205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 743c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson Sema::OwningExprResult Result = 744a1635d9b468709d47b6c533cc82bdabf34f560b8Eli Friedman SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 745a1635d9b468709d47b6c533cc82bdabf34f560b8Eli Friedman SemaRef.Owned(expr)); 746c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson 747c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson Expr *ResultExpr; 748c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson 749c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson if (Result.isInvalid()) 750bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman hadError = true; // types weren't compatible. 751c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson else { 752c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson ResultExpr = Result.takeAs<Expr>(); 753c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson 754c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson if (ResultExpr != expr) { 755c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson // The type was promoted, update initializer list. 756c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson IList->setInit(Index, ResultExpr); 757c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson } 75805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 7594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (hadError) 7604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 7614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 762c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 7630cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 764bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman } else { 7650820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_empty_scalar_initializer) 766dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getSourceRange(); 767bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman hadError = true; 7684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 7694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 770bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 7710cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 7720cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 7730cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 7748ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckReferenceType(const InitializedEntity &Entity, 7758ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 776930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 777930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 778930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex) { 779930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (Index < IList->getNumInits()) { 780930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor Expr *expr = IList->getInit(Index); 781930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (isa<InitListExpr>(expr)) { 7820820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 783930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType << IList->getSourceRange(); 784930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 785930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 786930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 787930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 789930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 790a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson Sema::OwningExprResult Result = 791a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 792a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson SemaRef.Owned(expr)); 793a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 794a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson if (Result.isInvalid()) 795930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 796a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 797a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson expr = Result.takeAs<Expr>(); 798a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson IList->setInit(Index, expr); 799a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 800930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (hadError) 801930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 802930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor else 803930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 804930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 805930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 806390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: It would be wonderful if we could point at the actual member. In 807390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // general, it would be useful to pass location information down the stack, 808390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // so that we know the location (or decl) of the "current object" being 809390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // initialized. 8101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getLocStart(), 811930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor diag::err_init_reference_member_uninitialized) 812930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType 813930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << IList->getSourceRange(); 814930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 815930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 816930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 817930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 818930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 819930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor} 820930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 8218ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckVectorType(const InitializedEntity &Entity, 82246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 8234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 8244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 8254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 8260cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 827183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VT = DeclType->getAs<VectorType>(); 8282ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned maxElements = VT->getNumElements(); 8292ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned numEltsInit = 0; 8300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff QualType elementType = VT->getElementType(); 8311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8322ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (!SemaRef.getLangOptions().OpenCL) { 8338ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 8348ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 8358ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8368ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { 8378ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Don't attempt to go past the end of the init list 8388ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (Index >= IList->getNumInits()) 8398ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson break; 84046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson 8418ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson ElementEntity.setElementIndex(Index); 8428ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 8438ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 8448ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson } 8452ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } else { 8468ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 8478ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 8488ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8492ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman // OpenCL initializers allows vectors to be constructed from vectors. 8502ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman for (unsigned i = 0; i < maxElements; ++i) { 8512ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman // Don't attempt to go past the end of the init list 8522ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (Index >= IList->getNumInits()) 8532ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman break; 8548ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8558ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson ElementEntity.setElementIndex(Index); 8568ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8572ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman QualType IType = IList->getInit(Index)->getType(); 8582ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (!IType->isVectorType()) { 8598ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 8602ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman StructuredList, StructuredIndex); 8612ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman ++numEltsInit; 8622ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } else { 863183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *IVT = IType->getAs<VectorType>(); 8642ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned numIElts = IVT->getNumElements(); 8652ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman QualType VecType = SemaRef.Context.getExtVectorType(elementType, 8662ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman numIElts); 8678ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, VecType, Index, 8682ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman StructuredList, StructuredIndex); 8692ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman numEltsInit += numIElts; 8702ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 8712ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 8720cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8742ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman // OpenCL & AltiVec require all elements to be initialized. 8752ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (numEltsInit != maxElements) 8762ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (SemaRef.getLangOptions().OpenCL || SemaRef.getLangOptions().AltiVec) 8772ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SemaRef.Diag(IList->getSourceRange().getBegin(), 8782ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman diag::err_vector_incorrect_num_initializers) 8792ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman << (numEltsInit < maxElements) << maxElements << numEltsInit; 8800cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 8810cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 8820cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 8838ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckArrayType(const InitializedEntity &Entity, 884784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 88587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt elementIndex, 8861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 8874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 8884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 8894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 8900cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // Check for the special-case of initializing an array with a string. 8910cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 89279e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner if (Expr *Str = IsStringInit(IList->getInit(Index), DeclType, 89379e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner SemaRef.Context)) { 89479e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner CheckStringInit(Str, DeclType, SemaRef); 8954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We place the string literal directly into the resulting 8964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initializer list. This is the only place where the structure 8974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // of the structured initializer list doesn't match exactly, 8984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // because doing so would involve allocating one character 8994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // constant for each string. 900f71ae8d8024561f92dd7916363e7a791684563ccChris Lattner UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 9010820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner StructuredList->resizeInits(SemaRef.Context, StructuredIndex); 9020cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 9030cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return; 9040cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 9050cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 906c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const VariableArrayType *VAT = 9070820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsVariableArrayType(DeclType)) { 908638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // Check for VLAs; in standard C it would be possible to check this 909638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // earlier, but I don't know where clang accepts VLAs (gcc accepts 910638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // them in all sorts of strange places). 9110820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(VAT->getSizeExpr()->getLocStart(), 912dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner diag::err_variable_object_no_init) 913dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << VAT->getSizeExpr()->getSourceRange(); 914638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman hadError = true; 9154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 9164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 917638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 918638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman } 919638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman 92005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We might know the maximum number of elements in advance. 9214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor llvm::APSInt maxElements(elementIndex.getBitWidth(), 9224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor elementIndex.isUnsigned()); 92305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool maxElementsKnown = false; 92405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (const ConstantArrayType *CAT = 9250820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 92605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = CAT->getSize(); 927f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor elementIndex.extOrTrunc(maxElements.getBitWidth()); 928e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 92905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElementsKnown = true; 93005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 93105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 9320820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner QualType elementType = SemaRef.Context.getAsArrayType(DeclType) 933c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner ->getElementType(); 93405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 93505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 93605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 93787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 93887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 93987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 94087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 94187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 94287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 94387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. elementIndex will be 94487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // updated to be the next array element we'll initialize. 9459a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 9464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, 0, &elementIndex, Index, 947eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, true, 948eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) { 94905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 95087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor continue; 95187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 95287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 953f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor if (elementIndex.getBitWidth() > maxElements.getBitWidth()) 954f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor maxElements.extend(elementIndex.getBitWidth()); 955f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor else if (elementIndex.getBitWidth() < maxElements.getBitWidth()) 956f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor elementIndex.extend(maxElements.getBitWidth()); 957e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 958f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor 95987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If the array is of incomplete type, keep track of the number of 96087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // elements in the initializer. 96187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 96287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor maxElements = elementIndex; 96305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 96405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 96505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 96605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 96705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we know the maximum number of elements, and we've already 96805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // hit it, stop consuming elements in the initializer list. 96905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElementsKnown && elementIndex == maxElements) 9700cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff break; 97105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 9728ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 973784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex, 9748ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson Entity); 9758ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Check this element. 9768ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 9778ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 97805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++elementIndex; 97905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 98005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If the array is of incomplete type, keep track of the number of 98105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // elements in the initializer. 98205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 98305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = elementIndex; 9840cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 985587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman if (!hadError && DeclType->isIncompleteArrayType()) { 9860cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // If this is an incomplete array type, the actual type needs to 987396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // be calculated here. 988e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned()); 98905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElements == Zero) { 990396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // Sizing an array implicitly to zero is not allowed by ISO C, 991396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // but is supported by GNU. 9920820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 993396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar diag::ext_typecheck_zero_array_size); 9940cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 995396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar 9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements, 997396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar ArrayType::Normal, 0); 9980cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 9990cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 10000cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 10018ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, 10022bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, 10031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType DeclType, 100487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator Field, 10051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 10064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 10074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 1008eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 1009eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 10106217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl* structDecl = DeclType->getAs<RecordType>()->getDecl(); 10111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1012b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // If the record is invalid, some of it's members are invalid. To avoid 1013b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // confusion, we forgo checking the intializer for the entire record. 1014b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman if (structDecl->isInvalidDecl()) { 1015b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman hadError = true; 1016b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman return; 10171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 10183498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 10193498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (DeclType->isUnionType() && IList->getNumInits() == 0) { 10203498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor // Value-initialize the first named member of the union. 10216217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 102217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator FieldEnd = RD->field_end(); 10233498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor Field != FieldEnd; ++Field) { 10243498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (Field->getDeclName()) { 10253498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 10263498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor break; 10273498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10283498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10293498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return; 10303498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10313498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 103205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If structDecl is a forward declaration, this loop won't do 103305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // anything except look at designated initializers; That's okay, 103405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // because an error should get printed out elsewhere. It might be 103505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // worthwhile to skip over the rest of the initializer, though. 10366217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 103717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RecordDecl::field_iterator FieldEnd = RD->field_end(); 1038dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor bool InitializedSomething = false; 103905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 104005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 104105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 104205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 104387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 104487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 104587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 104687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 104787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 104887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 104987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. Field will be updated to 105087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the next field that we'll be initializing. 10519a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 10524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, &Field, 0, Index, 1053eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 1054eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, TopLevelObject)) 105505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 105605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1057dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 105805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 105905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 106005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 106105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field == FieldEnd) { 106205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We've run out of fields. We're done. 106344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor break; 106405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 106544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1066dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor // We've already initialized a member of a union. We're done. 1067dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor if (InitializedSomething && DeclType->isUnionType()) 1068dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor break; 1069dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor 107005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we've hit the flexible array member at the end, we're done. 107105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field->getType()->isIncompleteArrayType()) 1072b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman break; 107344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 10740bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (Field->isUnnamedBitfield()) { 10754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Don't initialize unnamed bitfields, e.g. "int : 20;" 107605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 1077b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman continue; 10780cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 107944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 10808ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 10818ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 10828ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 10838ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 1084dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 10850bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 10860bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (DeclType->isUnionType()) { 10870bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor // Initialize the first field within the union. 10880bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 10890bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 109005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 109105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 10920cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 109344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() || 1095a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor Index >= IList->getNumInits()) 1096eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return; 1097eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1098eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Handle GNU flexible array initializers. 10991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!TopLevelObject && 1100a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor (!isa<InitListExpr>(IList->getInit(Index)) || 1101a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor cast<InitListExpr>(IList->getInit(Index))->getNumInits() > 0)) { 11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getInit(Index)->getSourceRange().getBegin(), 1103eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_nonempty) 1104eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << IList->getInit(Index)->getSourceRange().getBegin(); 11050820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1106eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1107eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor hadError = true; 1108a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor ++Index; 1109a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor return; 1110a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor } else { 11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getInit(Index)->getSourceRange().getBegin(), 1112a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor diag::ext_flexible_array_init) 1113a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor << IList->getInit(Index)->getSourceRange().getBegin(); 1114a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1115a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor << *Field; 1116eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1117eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 11188ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 11198ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1120987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson 11218ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (isa<InitListExpr>(IList->getInit(Index))) 11228ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 11238ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 11248ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson else 11258ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index, 1126987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson StructuredList, StructuredIndex); 11270cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 11280cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1129ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Expand a field designator that refers to a member of an 1130ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// anonymous struct or union into a series of field designators that 1131ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// refers to the field within the appropriate subobject. 1132ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// 1133ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// Field/FieldIndex will be updated to point to the (new) 1134ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// currently-designated field. 1135ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorstatic void ExpandAnonymousFieldDesignator(Sema &SemaRef, 11361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned DesigIdx, 1138ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *Field, 1139ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor RecordDecl::field_iterator &FieldIter, 1140ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor unsigned &FieldIndex) { 1141ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor typedef DesignatedInitExpr::Designator Designator; 1142ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1143ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the path from the current object to the member of the 1144ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // anonymous struct/union (backwards). 1145ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor llvm::SmallVector<FieldDecl *, 4> Path; 1146ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SemaRef.BuildAnonymousStructUnionMemberPath(Field, Path); 11471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1148ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the replacement designators. 1149ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor llvm::SmallVector<Designator, 4> Replacements; 1150ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor for (llvm::SmallVector<FieldDecl *, 4>::reverse_iterator 1151ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FI = Path.rbegin(), FIEnd = Path.rend(); 1152ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FI != FIEnd; ++FI) { 1153ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (FI + 1 == FIEnd) 11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Replacements.push_back(Designator((IdentifierInfo *)0, 1155ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getDotLoc(), 1156ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getFieldLoc())); 1157ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor else 1158ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.push_back(Designator((IdentifierInfo *)0, SourceLocation(), 1159ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SourceLocation())); 1160ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.back().setField(*FI); 1161ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1162ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1163ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Expand the current designator into the set of replacement 1164ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // designators, so we have a full subobject path down to where the 1165ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // member of the anonymous struct/union is actually stored. 1166319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0], 1167ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor &Replacements[0] + Replacements.size()); 11681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1169ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Update FieldIter/FieldIndex; 1170ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor RecordDecl *Record = cast<RecordDecl>(Path.back()->getDeclContext()); 117117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldIter = Record->field_begin(); 1172ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldIndex = 0; 117317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator FEnd = Record->field_end(); 1174ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldIter != FEnd; ++FieldIter) { 1175ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (FieldIter->isUnnamedBitfield()) 1176ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor continue; 1177ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1178ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (*FieldIter == Path.back()) 1179ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return; 1180ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1181ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor ++FieldIndex; 1182ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1183ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1184ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor assert(false && "Unable to find anonymous struct/union field"); 1185ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 1186ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 118705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Check the well-formedness of a C99 designated initializer. 118805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 118905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Determines whether the designated initializer @p DIE, which 119005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// resides at the given @p Index within the initializer list @p 119105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// IList, is well-formed for a current object of type @p DeclType 119205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// (C99 6.7.8). The actual subobject that this designator refers to 11931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// within the current subobject is returned in either 11944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @p NextField or @p NextElementIndex (whichever is appropriate). 119505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 119605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param IList The initializer list in which this designated 119705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// initializer occurs. 119805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 1199711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DIE The designated initializer expression. 1200711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// 1201711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DesigIdx The index of the current designator. 120205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 120305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param DeclType The type of the "current object" (C99 6.7.8p17), 120405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// into which the designation in @p DIE should refer. 120505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 120687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextField If non-NULL and the first designator in @p DIE is 120787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// a field, this will be set to the field declaration corresponding 120887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// to the field named by the designator. 120905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 121087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextElementIndex If non-NULL and the first designator in @p 121187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// DIE is an array designator or GNU array-range designator, this 121287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// will be set to the last index initialized by this designator. 121305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 121405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param Index Index into @p IList where the designated initializer 121505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @p DIE occurs. 121605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 12174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @param StructuredList The initializer list expression that 12184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// describes all of the subobject initializers in the order they'll 12194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// actually be initialized. 12204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 122105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @returns true if there was an error, false otherwise. 12221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 12238ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders CarlssonInitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 12249a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, 12251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 1226711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 122787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor QualType &CurrentObjectType, 122887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator *NextField, 122987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt *NextElementIndex, 12304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 12314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 123234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned &StructuredIndex, 1233eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 1234eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 1235711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if (DesigIdx == DIE->size()) { 123687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the actual initialization for the designated object type. 123787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 12386fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 12396fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Temporarily remove the designator expression from the 12406fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // initializer list that the child calls see, so that we don't try 12416fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // to re-process the designator. 12426fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned OldIndex = Index; 12436fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE->getInit()); 12446fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 12459a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson CheckSubElementType(Entity, IList, CurrentObjectType, Index, 12464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 12476fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 12486fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Restore the designated initializer expression in the syntactic 12496fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // form of the initializer list. 12506fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor if (IList->getInit(OldIndex) != DIE->getInit()) 12516fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor DIE->setInit(IList->getInit(OldIndex)); 12526fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE); 12536fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 125487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 125587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 125605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1257711997184366d584c9c437102cae1e9d9927b986Douglas Gregor bool IsFirstDesignator = (DesigIdx == 0); 12581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((IsFirstDesignator || StructuredList) && 12594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor "Need a non-designated initializer list to start from"); 12604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1261711997184366d584c9c437102cae1e9d9927b986Douglas Gregor DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx); 12624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Determine the structural initializer list that corresponds to the 12634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // current subobject. 12644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList = IsFirstDesignator? SyntacticToSemantic[IList] 12651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : getStructuredSubobjectInit(IList, Index, CurrentObjectType, 1266ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor StructuredList, StructuredIndex, 12674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange(D->getStartLocation(), 12684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DIE->getSourceRange().getEnd())); 12694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor assert(StructuredList && "Expected a structured initializer list"); 12704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 127187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (D->isFieldDesignator()) { 127287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p7: 127387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 127487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 127587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 127687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // . identifier 127787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 127887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have 127987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // structure or union type and the identifier shall be the 12801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // name of a member of that type. 12816217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = CurrentObjectType->getAs<RecordType>(); 128287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!RT) { 128387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation Loc = D->getDotLoc(); 128487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (Loc.isInvalid()) 128587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Loc = D->getFieldLoc(); 12860820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Loc, diag::err_field_designator_non_aggr) 12870820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner << SemaRef.getLangOptions().CPlusPlus << CurrentObjectType; 128887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 128987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 129087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 129187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 12924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Note: we perform a linear search of the fields here, despite 12934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the fact that we have a faster lookup method, because we always 12944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // need to compute the field's index. 1295ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *KnownField = D->getField(); 129687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IdentifierInfo *FieldName = D->getFieldName(); 12974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned FieldIndex = 0; 12981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator 129917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = RT->getDecl()->field_begin(), 130017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RT->getDecl()->field_end(); 13014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (; Field != FieldEnd; ++Field) { 13024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field->isUnnamedBitfield()) 13034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor continue; 13044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1305ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (KnownField == *Field || Field->getIdentifier() == FieldName) 13064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor break; 13074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 13084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 130987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 131087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 13114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field == FieldEnd) { 1312ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // There was no normal field in the struct with the designated 1313ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // name. Perform another lookup for this name, which may find 1314ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // something that we can't designate (e.g., a member function), 1315ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // may find nothing, or may find a member of an anonymous 13161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // struct/union. 131717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName); 1318c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldDecl *ReplacementField = 0; 13194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Lookup.first == Lookup.second) { 1320c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Name lookup didn't find anything. Determine whether this 1321c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // was a typo for another field name. 1322c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor LookupResult R(SemaRef, FieldName, D->getFieldLoc(), 1323c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Sema::LookupMemberName); 1324c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (SemaRef.CorrectTypo(R, /*Scope=*/0, /*SS=*/0, RT->getDecl()) && 1325c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor (ReplacementField = R.getAsSingle<FieldDecl>()) && 1326c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ReplacementField->getDeclContext()->getLookupContext() 1327c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ->Equals(RT->getDecl())) { 1328c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), 1329c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor diag::err_field_designator_unknown_suggest) 1330c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType << R.getLookupName() 1331c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << CodeModificationHint::CreateReplacement(D->getFieldLoc(), 1332c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor R.getLookupName().getAsString()); 133367dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor SemaRef.Diag(ReplacementField->getLocation(), 133467dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor diag::note_previous_decl) 133567dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor << ReplacementField->getDeclName(); 1336c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else { 1337c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown) 1338c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType; 1339c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++Index; 1340c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor return true; 1341c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1342c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else if (!KnownField) { 1343c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Determine whether we found a field at all. 1344c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ReplacementField = dyn_cast<FieldDecl>(*Lookup.first); 1345c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1346c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1347c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!ReplacementField) { 13484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Name lookup found something, but it wasn't a field. 13490820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield) 13504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << FieldName; 13511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag((*Lookup.first)->getLocation(), 13524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_field_designator_found); 1353ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman ++Index; 1354ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman return true; 1355ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1356c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1357c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!KnownField && 1358c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor cast<RecordDecl>((ReplacementField)->getDeclContext()) 1359c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ->isAnonymousStructOrUnion()) { 1360c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Handle an field designator that refers to a member of an 1361c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // anonymous struct or union. 1362c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, 1363c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ReplacementField, 1364c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field, FieldIndex); 1365c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor D = DIE->getDesignator(DesigIdx); 1366c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else if (!KnownField) { 1367c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // The replacement field comes from typo correction; find it 1368c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // in the list of fields. 1369c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldIndex = 0; 1370c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field = RT->getDecl()->field_begin(); 1371c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor for (; Field != FieldEnd; ++Field) { 1372c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (Field->isUnnamedBitfield()) 1373c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor continue; 1374c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1375c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (ReplacementField == *Field || 1376c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field->getIdentifier() == ReplacementField->getIdentifier()) 1377c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor break; 1378c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1379c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++FieldIndex; 1380c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1381c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1382ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } else if (!KnownField && 1383ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor cast<RecordDecl>((*Field)->getDeclContext()) 13844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ->isAnonymousStructOrUnion()) { 1385ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, *Field, 1386ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Field, FieldIndex); 1387ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor D = DIE->getDesignator(DesigIdx); 138887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 13894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 13904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // All of the fields of a union are located at the same place in 13914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the initializer list. 13920bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (RT->getDecl()->isUnion()) { 13934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor FieldIndex = 0; 13940bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 13950bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 13964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 139787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Update the designator with the field declaration. 13984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor D->setField(*Field); 13991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 14014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this field. 14024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (FieldIndex >= StructuredList->getNumInits()) 14030820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1); 14044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1405eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // This designator names a flexible array member. 1406eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Field->getType()->isIncompleteArrayType()) { 1407eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool Invalid = false; 1408711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if ((DesigIdx + 1) != DIE->size()) { 1409eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // We can't designate an object within the flexible array 1410eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // member (because GCC doesn't allow it). 14111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr::Designator *NextD 1412711997184366d584c9c437102cae1e9d9927b986Douglas Gregor = DIE->getDesignator(DesigIdx + 1); 14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(NextD->getStartLocation(), 1414eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_designator_into_flexible_array_member) 14151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << SourceRange(NextD->getStartLocation(), 1416eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor DIE->getSourceRange().getEnd()); 14170820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1418eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1419eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1420eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1421eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1422eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (!hadError && !isa<InitListExpr>(DIE->getInit())) { 1423eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // The initializer is not an initializer list. 14240820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(DIE->getInit()->getSourceRange().getBegin(), 1425eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_needs_braces) 1426eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << DIE->getInit()->getSourceRange(); 14270820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1428eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1429eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1430eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1431eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1432eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Handle GNU flexible array initializers. 14331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Invalid && !TopLevelObject && 1434eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor cast<InitListExpr>(DIE->getInit())->getNumInits() > 0) { 14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(DIE->getSourceRange().getBegin(), 1436eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_nonempty) 1437eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << DIE->getSourceRange().getBegin(); 14380820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1439eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1440eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1441eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1442eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1443eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Invalid) { 1444eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Index; 1445eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1446eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1447eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1448eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Initialize the array. 1449eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool prevHadError = hadError; 1450eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1451eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned OldIndex = Index; 1452eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(Index, DIE->getInit()); 14538ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 14548ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 14558ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 14568ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 1457eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, newStructuredIndex); 14588ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 1459eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(OldIndex, DIE); 1460eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (hadError && !prevHadError) { 1461eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Field; 1462eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++FieldIndex; 1463eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (NextField) 1464eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor *NextField = Field; 1465eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredIndex = FieldIndex; 1466eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1467eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1468eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } else { 1469eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Recurse to check later designated subobjects. 1470eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType FieldType = (*Field)->getType(); 1471eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 14729a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 14739a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity MemberEntity = 14748ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 14758ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1, 14769a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson FieldType, 0, 0, Index, 14779a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, newStructuredIndex, 1478eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, false)) 1479eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1480eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 148187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 148287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Find the position of the next field to be initialized in this 148387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // subobject. 148487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Field; 14854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 148605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 148787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 148887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this struct/class/union subobject. 148987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 149087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextField) 149187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor *NextField = Field; 14924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = FieldIndex; 149387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 149487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 149505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 149634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 149734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 149834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1499ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // We've already initialized something in the union; we're done. 1500ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (RT->getDecl()->isUnion()) 1501ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return hadError; 1502ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 150387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining fields within this class/struct/union subobject. 150487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 15052bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson 15068ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckStructUnionTypes(Entity, IList, CurrentObjectType, Field, false, Index, 15074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, FieldIndex); 150887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 150987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 151005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 151187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p6: 151287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 151387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 151487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 151587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ] 151687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 151787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have array 151887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // type and the expression shall be an integer constant 151987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // expression. If the array is of unknown size, any 152087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // nonnegative value is valid. 152187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 152287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Additionally, cope with the GNU extension that permits 152387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designators of the form 152487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 152587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ... constant-expression ] 15260820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType); 152787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!AT) { 15280820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array) 152987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor << CurrentObjectType; 153087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 153187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 153287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 153305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 153487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Expr *IndexExpr = 0; 153534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor llvm::APSInt DesignatedStartIndex, DesignatedEndIndex; 153634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (D->isArrayDesignator()) { 153787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayIndex(*D); 15383bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedStartIndex = IndexExpr->EvaluateAsInt(SemaRef.Context); 153934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex = DesignatedStartIndex; 154034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 154187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(D->isArrayRangeDesignator() && "Need array-range designator"); 15423bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 15431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedStartIndex = 15453bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DIE->getArrayRangeStart(*D)->EvaluateAsInt(SemaRef.Context); 15461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedEndIndex = 15473bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DIE->getArrayRangeEnd(*D)->EvaluateAsInt(SemaRef.Context); 154887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayRangeEnd(*D); 154934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 15503bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (DesignatedStartIndex.getZExtValue() !=DesignatedEndIndex.getZExtValue()) 1551a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor FullyStructuredList->sawArrayRangeDesignator(); 155287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 155305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 155487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (isa<ConstantArrayType>(AT)) { 155587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false); 155634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth()); 155734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned()); 155834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth()); 155934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned()); 156034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex >= MaxElements) { 15610820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IndexExpr->getSourceRange().getBegin(), 156287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor diag::err_array_designator_too_large) 156334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor << DesignatedEndIndex.toString(10) << MaxElements.toString(10) 156487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor << IndexExpr->getSourceRange(); 156587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 156687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 156705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 156834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 156934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Make sure the bit-widths and signedness match. 157034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedStartIndex.getBitWidth() > DesignatedEndIndex.getBitWidth()) 157134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.extend(DesignatedStartIndex.getBitWidth()); 15723bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner else if (DesignatedStartIndex.getBitWidth() < 15733bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedEndIndex.getBitWidth()) 157434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.extend(DesignatedEndIndex.getBitWidth()); 157534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(true); 157634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(true); 157705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 15781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 15804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this array element. 158134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits()) 15821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredList->resizeInits(SemaRef.Context, 158334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.getZExtValue() + 1); 158434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 158534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Repeatedly perform subobject initializations in the range 158634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // [DesignatedStartIndex, DesignatedEndIndex]. 158734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 158834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next designator 158934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned ElementIndex = DesignatedStartIndex.getZExtValue(); 159034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned OldIndex = Index; 15919a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 15929a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity ElementEntity = 15938ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 15949a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 159534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor while (DesignatedStartIndex <= DesignatedEndIndex) { 159634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Recurse to check later designated subobjects. 159734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor QualType ElementType = AT->getElementType(); 159834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor Index = OldIndex; 15999a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 16009a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementEntity.setElementIndex(ElementIndex); 16018ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (CheckDesignatedInitializer(ElementEntity, IList, DIE, DesigIdx + 1, 16029a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementType, 0, 0, Index, 16039a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, ElementIndex, 1604eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor (DesignatedStartIndex == DesignatedEndIndex), 1605eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) 160634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return true; 160787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 160834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next index in the array that we'll be initializing. 160934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ++DesignatedStartIndex; 161034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ElementIndex = DesignatedStartIndex.getZExtValue(); 161134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } 161287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 161387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 161487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this array subobject. 161587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 161687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextElementIndex) 161734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor *NextElementIndex = DesignatedStartIndex; 16184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = ElementIndex; 161987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 162087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 16211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 162234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 162334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 162434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 162587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining elements within this array subobject. 162605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool prevHadError = hadError; 16278ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex, 1628784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 16294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, ElementIndex); 16301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return hadError && !prevHadError; 163105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 163205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 16334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// Get the structured initializer list for a subobject of type 16344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// @p CurrentObjectType. 16354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListExpr * 16364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 16374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType CurrentObjectType, 16384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 16394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredIndex, 16404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange InitRange) { 16414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *ExistingInit = 0; 16424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 16434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = SyntacticToSemantic[IList]; 16444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else if (StructuredIndex < StructuredList->getNumInits()) 16454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = StructuredList->getInit(StructuredIndex); 16461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit)) 16484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 16494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 16504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (ExistingInit) { 16514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We are creating an initializer list that initializes the 16524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobjects of the current object, but there was already an 16534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initialization that completely initialized the current 16544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject, e.g., by a compound literal: 16551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 16564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X { int a, b; }; 16574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 }; 16581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 16594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Here, xs[0].a == 0 and xs[0].b == 3, since the second, 16604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // designated initializer re-initializes the whole 16614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject [0], overwriting previous initializers. 16621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(InitRange.getBegin(), 1663ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor diag::warn_subobject_initializer_overrides) 16644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << InitRange; 16651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(ExistingInit->getSourceRange().getBegin(), 16664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 166754f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 16684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << ExistingInit->getSourceRange(); 16694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 16704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *Result 16721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) InitListExpr(InitRange.getBegin(), 0, 0, 1673ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor InitRange.getEnd()); 1674ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor 16754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Result->setType(CurrentObjectType); 16764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1677fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Pre-allocate storage for the structured initializer list. 1678fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor unsigned NumElements = 0; 167908457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor unsigned NumInits = 0; 168008457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (!StructuredList) 168108457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = IList->getNumInits(); 168208457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor else if (Index < IList->getNumInits()) { 168308457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) 168408457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = SubList->getNumInits(); 168508457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor } 168608457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor 16871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ArrayType *AType 1688fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor = SemaRef.Context.getAsArrayType(CurrentObjectType)) { 1689fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) { 1690fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = CAType->getSize().getZExtValue(); 1691fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Simple heuristic so that we don't allocate a very large 1692fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // initializer with many empty entries at the end. 169308457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (NumInits && NumElements > NumInits) 1694fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 0; 1695fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 1696183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) 1697fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = VType->getNumElements(); 16986217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const RecordType *RType = CurrentObjectType->getAs<RecordType>()) { 1699fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor RecordDecl *RDecl = RType->getDecl(); 1700fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (RDecl->isUnion()) 1701fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 1; 1702fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor else 17031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumElements = std::distance(RDecl->field_begin(), 170417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RDecl->field_end()); 1705fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 1706fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 170708457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (NumElements < NumInits) 1708fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = IList->getNumInits(); 1709fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 1710fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor Result->reserveInits(NumElements); 1711fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 17124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Link this new initializer list into the structured initializer 17134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // lists. 17144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (StructuredList) 17154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList->updateInit(StructuredIndex, Result); 17164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else { 17174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Result->setSyntacticForm(IList); 17184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = Result; 17194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 17204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 17224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 17234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Update the initializer at index @p StructuredIndex within the 17254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// structured initializer list to the value @p expr. 17264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregorvoid InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, 17274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex, 17284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *expr) { 17294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // No structured initializer list to update 17304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 17314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 17324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Expr *PrevInit = StructuredList->updateInit(StructuredIndex, expr)) { 17344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // This initializer overwrites a previous initializer. Warn. 17351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(expr->getSourceRange().getBegin(), 17364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::warn_initializer_overrides) 17374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << expr->getSourceRange(); 17381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(PrevInit->getSourceRange().getBegin(), 17394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 174054f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 17414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << PrevInit->getSourceRange(); 17424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 17431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 17454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 17464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 174705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Check that the given Index expression is a valid array designator 174805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// value. This is essentailly just a wrapper around 17493bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner/// VerifyIntegerConstantExpression that also checks for negative values 175005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// and produces a reasonable diagnostic if there is a 175105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// failure. Returns true if there was an error, false otherwise. If 175205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// everything went okay, Value will receive the value of the constant 175305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// expression. 17541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool 17553bf6893b77c30cb774100e0fa7ae029331675ec1Chris LattnerCheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) { 175605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation Loc = Index->getSourceRange().getBegin(); 175705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 175805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Make sure this is an integer constant expression. 17593bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (S.VerifyIntegerConstantExpression(Index, &Value)) 17603bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return true; 17613bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 17623bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (Value.isSigned() && Value.isNegative()) 17633bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return S.Diag(Loc, diag::err_array_designator_negative) 176405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << Value.toString(10) << Index->getSourceRange(); 176505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 176653d3d8e0662197f7245d8f5ff697a72a2b4b3f54Douglas Gregor Value.setIsUnsigned(true); 176705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return false; 176805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 176905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 177005c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorSema::OwningExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, 177105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation Loc, 1772eeae8f072748affce25ab4064982626361293390Douglas Gregor bool GNUSyntax, 177305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor OwningExprResult Init) { 177405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef DesignatedInitExpr::Designator ASTDesignator; 177505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 177605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool Invalid = false; 177705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::SmallVector<ASTDesignator, 32> Designators; 177805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::SmallVector<Expr *, 32> InitExpressions; 177905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 178005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Build designators and check array designator expressions. 178105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) { 178205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor const Designator &D = Desig.getDesignator(Idx); 178305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor switch (D.getKind()) { 178405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::FieldDesignator: 17851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(), 178605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getFieldLoc())); 178705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 178805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 178905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayDesignator: { 179005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Index = static_cast<Expr *>(D.getArrayIndex()); 179105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt IndexValue; 17929ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (!Index->isTypeDependent() && 17939ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor !Index->isValueDependent() && 17949ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, Index, IndexValue)) 179505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 179605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else { 179705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 17981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 179905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getRBracketLoc())); 180005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor InitExpressions.push_back(Index); 180105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 180205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 180305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 180405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 180505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayRangeDesignator: { 180605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart()); 180705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd()); 180805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt StartValue; 180905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt EndValue; 18109ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool StartDependent = StartIndex->isTypeDependent() || 18119ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor StartIndex->isValueDependent(); 18129ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool EndDependent = EndIndex->isTypeDependent() || 18139ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor EndIndex->isValueDependent(); 18149ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if ((!StartDependent && 18159ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, StartIndex, StartValue)) || 18169ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor (!EndDependent && 18179ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, EndIndex, EndValue))) 181805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 1819d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else { 1820d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor // Make sure we're comparing values with the same bit width. 18219ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (StartDependent || EndDependent) { 18229ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Nothing to compute. 18239ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (StartValue.getBitWidth() > EndValue.getBitWidth()) 1824d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor EndValue.extend(StartValue.getBitWidth()); 1825d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else if (StartValue.getBitWidth() < EndValue.getBitWidth()) 1826d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor StartValue.extend(EndValue.getBitWidth()); 1827d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor 1828c4bb7bfe8328f79004517dd268f6146c8066c205Douglas Gregor if (!StartDependent && !EndDependent && EndValue < StartValue) { 1829d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range) 18301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << StartValue.toString(10) << EndValue.toString(10) 1831d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor << StartIndex->getSourceRange() << EndIndex->getSourceRange(); 1832d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Invalid = true; 1833d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } else { 1834d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 1836d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getEllipsisLoc(), 1837d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getRBracketLoc())); 1838d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(StartIndex); 1839d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(EndIndex); 1840d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } 184105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 184205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 184305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 184405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 184505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 184605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 184705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Invalid || Init.isInvalid()) 184805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return ExprError(); 184905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 185005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Clear out the expressions within the designation. 185105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Desig.ClearExprs(*this); 185205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 185305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor DesignatedInitExpr *DIE 1854beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad = DesignatedInitExpr::Create(Context, 1855beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Designators.data(), Designators.size(), 1856beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad InitExpressions.data(), InitExpressions.size(), 1857e9146f2e9f1c4e281544e8c080934c72d41012caAnders Carlsson Loc, GNUSyntax, Init.takeAs<Expr>()); 185805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return Owned(DIE); 185905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 1860c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 1861cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregorbool Sema::CheckInitList(const InitializedEntity &Entity, 1862cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *&InitList, QualType &DeclType) { 1863cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker CheckInitList(*this, Entity, InitList, DeclType); 1864c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor if (!CheckInitList.HadError()) 1865c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitList = CheckInitList.getFullyStructuredList(); 1866c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 1867c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor return CheckInitList.HadError(); 1868c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor} 186987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 1870cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 1871cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor// Initialization entity 1872cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 187339da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor 1874cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index, 1875cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor const InitializedEntity &Parent) 1876d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson : Parent(&Parent), Index(Index) 1877cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor{ 1878d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) { 1879d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_ArrayElement; 1880d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = AT->getElementType(); 1881d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } else { 1882d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_VectorElement; 1883d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = Parent.getType()->getAs<VectorType>()->getElementType(); 1884d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } 188520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 188620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 188720093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializedEntity InitializedEntity::InitializeBase(ASTContext &Context, 188820093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXBaseSpecifier *Base) 188920093b4bf698f292c664676987541d5103b65b15Douglas Gregor{ 189020093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializedEntity Result; 189120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Kind = EK_Base; 189220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Base = Base; 1893d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Result.Type = Base->getType(); 189420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 189520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 189620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 189799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas GregorDeclarationName InitializedEntity::getName() const { 189899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (getKind()) { 189999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Parameter: 1900a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor if (!VariableOrMember) 1901a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor return DeclarationName(); 1902a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor // Fall through 1903a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor 1904a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor case EK_Variable: 190599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Member: 190699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return VariableOrMember->getDeclName(); 190799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 190899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Result: 190999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Exception: 191018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case EK_New: 191199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Temporary: 191299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Base: 1913d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 1914d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 191599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 191699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 191799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 191899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Silence GCC warning 191999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 192099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 192199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 19227abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas GregorDeclaratorDecl *InitializedEntity::getDecl() const { 19237abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor switch (getKind()) { 19247abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Variable: 19257abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Parameter: 19267abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Member: 19277abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return VariableOrMember; 19287abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 19297abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Result: 19307abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Exception: 19317abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_New: 19327abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Temporary: 19337abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Base: 1934d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 1935d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 19367abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 19377abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor } 19387abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 19397abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor // Silence GCC warning 19407abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 19417abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor} 19427abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 194320093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 194420093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Initialization sequence 194520093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 194620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 194720093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::Step::Destroy() { 194820093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Kind) { 194920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 195020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 195120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: 195220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 195320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 195420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: 195520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 195620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 1957d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: 195851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: 195971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: 196018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 1961cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 196220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 196320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 196420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 196520093b4bf698f292c664676987541d5103b65b15Douglas Gregor delete ICS; 196620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 196720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 196820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 196920093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddAddressOverloadResolutionStep( 197020093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function) { 197120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 197220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ResolveAddressOfOverloadedFunction; 197320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Function->getType(); 197420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Function = Function; 197520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 197620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 197720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 197820093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType, 197920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IsLValue) { 198020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 198120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = IsLValue? SK_CastDerivedToBaseLValue : SK_CastDerivedToBaseRValue; 198220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = BaseType; 198320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 198420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 198520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 198620093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddReferenceBindingStep(QualType T, 198720093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool BindingTemporary) { 198820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 198920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference; 199020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 199120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 199220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 199320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 199403981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedmanvoid InitializationSequence::AddUserConversionStep(FunctionDecl *Function, 199503981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman QualType T) { 199620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 199720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_UserConversion; 199803981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman S.Type = T; 199920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Function = Function; 200020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 200120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 200220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 200320093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddQualificationConversionStep(QualType Ty, 200420093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IsLValue) { 200520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 200620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = IsLValue? SK_QualificationConversionLValue 200720093b4bf698f292c664676987541d5103b65b15Douglas Gregor : SK_QualificationConversionRValue; 200820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Ty; 200920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 201020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 201120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 201220093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddConversionSequenceStep( 201320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const ImplicitConversionSequence &ICS, 201420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T) { 201520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 201620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ConversionSequence; 201720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 201820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ICS = new ImplicitConversionSequence(ICS); 201920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 202020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 202120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2022d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorvoid InitializationSequence::AddListInitializationStep(QualType T) { 2023d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Step S; 2024d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Kind = SK_ListInitialization; 2025d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Type = T; 2026d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Steps.push_back(S); 2027d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor} 2028d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 202951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregorvoid 203051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas GregorInitializationSequence::AddConstructorInitializationStep( 203151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor, 203251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor QualType T) { 203351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Step S; 203451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Kind = SK_ConstructorInitialization; 203551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Type = T; 203651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Function = Constructor; 203751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Steps.push_back(S); 203851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor} 203951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 204071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorvoid InitializationSequence::AddZeroInitializationStep(QualType T) { 204171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Step S; 204271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Kind = SK_ZeroInitialization; 204371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Type = T; 204471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Steps.push_back(S); 204571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 204671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 204718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorvoid InitializationSequence::AddCAssignmentStep(QualType T) { 204818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step S; 204918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Kind = SK_CAssignment; 205018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Type = T; 205118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Steps.push_back(S); 205218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 205318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 2054cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedmanvoid InitializationSequence::AddStringInitStep(QualType T) { 2055cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Step S; 2056cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Kind = SK_StringInit; 2057cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Type = T; 2058cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Steps.push_back(S); 2059cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman} 2060cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 206120093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::SetOverloadFailure(FailureKind Failure, 206220093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Result) { 206320093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = FailedSequence; 206420093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->Failure = Failure; 206520093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->FailedOverloadResult = Result; 206620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 206720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 206820093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 206920093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Attempt initialization 207020093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 207120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 207220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt list initialization (C++0x [dcl.init.list]) 2073d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorstatic void TryListInitialization(Sema &S, 207420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 207520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 207620093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitListExpr *InitList, 207720093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2078d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We only perform rudimentary checking of list 2079d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // initializations at this point, then assume that any list 2080d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // initialization of an array, aggregate, or scalar will be 2081d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // well-formed. We we actually "perform" list initialization, we'll 2082d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // do all of the necessary checking. C++0x initializer lists will 2083d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // force us to perform more checking here. 2084d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ListInitialization); 2085d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2086d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 2087d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2088d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // C++ [dcl.init]p13: 2089d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If T is a scalar type, then a declaration of the form 2090d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2091d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // T x = { a }; 2092d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2093d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // is equivalent to 2094d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2095d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // T x = a; 2096d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (DestType->isScalarType()) { 2097d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (InitList->getNumInits() > 1 && S.getLangOptions().CPlusPlus) { 2098d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar); 2099d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 2100d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 2101d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2102d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume scalar initialization from a single value works. 2103d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isAggregateType()) { 2104d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume aggregate initialization works. 2105d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isVectorType()) { 2106d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume vector initialization works. 2107d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isReferenceType()) { 2108d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: C++0x defines behavior for this. 2109d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList); 2110d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 2111d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isRecordType()) { 2112d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: C++0x defines behavior for this 2113d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType); 2114d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 2115d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2116d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Add a general "list initialization" step. 2117d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.AddListInitializationStep(DestType); 211820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 211920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 212020093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Try a reference initialization that involves calling a conversion 212120093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// function. 212220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// 212320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// FIXME: look intos DRs 656, 896 212420093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic OverloadingResult TryRefInitWithConversionFunction(Sema &S, 212520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 212620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 212720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 212820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowRValues, 212920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2130d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 213120093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 213220093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T1 = cv1T1.getUnqualifiedType(); 213320093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 213420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T2 = cv2T2.getUnqualifiedType(); 213520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 213620093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase; 213720093b4bf698f292c664676987541d5103b65b15Douglas Gregor assert(!S.CompareReferenceRelationship(Initializer->getLocStart(), 213820093b4bf698f292c664676987541d5103b65b15Douglas Gregor T1, T2, DerivedToBase) && 213920093b4bf698f292c664676987541d5103b65b15Douglas Gregor "Must have incompatible references when binding via conversion"); 214060cfcecaf48e4310339dcfbdb0e3f0e6d2853855Chandler Carruth (void)DerivedToBase; 214120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 214220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the candidate set directly in the initialization sequence 214320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // structure, so that it will persist if we fail. 214420093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 214520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CandidateSet.clear(); 214620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 214720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 214820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 214920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 215020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 215120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const RecordType *T1RecordType = 0; 215220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (AllowRValues && (T1RecordType = T1->getAs<RecordType>())) { 215320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 215420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to see if there is a suitable conversion. 215520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl()); 215620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 215720093b4bf698f292c664676987541d5103b65b15Douglas Gregor DeclarationName ConstructorName 215820093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.Context.DeclarationNames.getCXXConstructorName( 215920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getCanonicalType(T1).getUnqualifiedType()); 216020093b4bf698f292c664676987541d5103b65b15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 216120093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (llvm::tie(Con, ConEnd) = T1RecordDecl->lookup(ConstructorName); 216220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Con != ConEnd; ++Con) { 216320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Find the constructor (which may be a template). 216420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConstructorDecl *Constructor = 0; 216520093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionTemplateDecl *ConstructorTmpl 216620093b4bf698f292c664676987541d5103b65b15Douglas Gregor = dyn_cast<FunctionTemplateDecl>(*Con); 216720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 216820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 216920093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 217020093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 217120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor = cast<CXXConstructorDecl>(*Con); 217220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 217320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Constructor->isInvalidDecl() && 217420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 217520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 217686820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, 217786820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ConstructorTmpl->getAccess(), 217886820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 217920093b4bf698f292c664676987541d5103b65b15Douglas Gregor &Initializer, 1, CandidateSet); 218020093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 218186820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddOverloadCandidate(Constructor, Constructor->getAccess(), 218286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall &Initializer, 1, CandidateSet); 218320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 218420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 218520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 218620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 218720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (const RecordType *T2RecordType = T2->getAs<RecordType>()) { 218820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting from is a class type, enumerate its conversion 218920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions. 219020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl()); 219120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 219220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the type we are converting to. If we are allowed to 219320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // convert to an rvalue, take the type that the destination type 219420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // refers to. 219520093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType ToType = AllowRValues? cv1T1 : DestType; 219620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2197eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 219820093b4bf698f292c664676987541d5103b65b15Douglas Gregor = T2RecordDecl->getVisibleConversionFunctions(); 2199eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 2200eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall E = Conversions->end(); I != E; ++I) { 220120093b4bf698f292c664676987541d5103b65b15Douglas Gregor NamedDecl *D = *I; 220220093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 220320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<UsingShadowDecl>(D)) 220420093b4bf698f292c664676987541d5103b65b15Douglas Gregor D = cast<UsingShadowDecl>(D)->getTargetDecl(); 220520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 220620093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 220720093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConversionDecl *Conv; 220820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 220920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 221020093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 221120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(*I); 221220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 221320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the conversion function doesn't return a reference type, 221420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // it can't be considered for this conversion unless we're allowed to 221520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // consider rvalues. 221620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Do we need to make sure that we only consider conversion 221720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // candidates with reference-compatible results? That might be needed to 221820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // break recursion. 221920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if ((AllowExplicit || !Conv->isExplicit()) && 222020093b4bf698f292c664676987541d5103b65b15Douglas Gregor (AllowRValues || Conv->getConversionType()->isLValueReferenceType())){ 222120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 222286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getAccess(), 222386820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, 222420093b4bf698f292c664676987541d5103b65b15Douglas Gregor ToType, CandidateSet); 222520093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 222686820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddConversionCandidate(Conv, I.getAccess(), ActingDC, 222786820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Initializer, cv1T1, CandidateSet); 222820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 222920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 223020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 223120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 223220093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 223320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 223420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform overload resolution. If it fails, return the failed result. 223520093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 223620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (OverloadingResult Result 223720093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.BestViableFunction(CandidateSet, DeclLoc, Best)) 223820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 223903981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 224020093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function = Best->Function; 224103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 224203981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Compute the returned type of the conversion. 224320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<CXXConversionDecl>(Function)) 224420093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = Function->getResultType(); 224520093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 224620093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv1T1; 224703981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 224803981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Add the user-defined conversion step. 224903981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman Sequence.AddUserConversionStep(Function, T2.getNonReferenceType()); 225003981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 225103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Determine whether we need to perform derived-to-base or 225203981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // cv-qualification adjustments. 225320093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool NewDerivedToBase = false; 225420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult NewRefRelationship 225520093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.CompareReferenceRelationship(DeclLoc, T1, T2.getNonReferenceType(), 225620093b4bf698f292c664676987541d5103b65b15Douglas Gregor NewDerivedToBase); 225720093b4bf698f292c664676987541d5103b65b15Douglas Gregor assert(NewRefRelationship != Sema::Ref_Incompatible && 225820093b4bf698f292c664676987541d5103b65b15Douglas Gregor "Overload resolution picked a bad conversion function"); 225920093b4bf698f292c664676987541d5103b65b15Douglas Gregor (void)NewRefRelationship; 226020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (NewDerivedToBase) 226120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 226220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getQualifiedType(T1, 226320093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2.getNonReferenceType().getQualifiers()), 226420093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*isLValue=*/true); 226520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 226620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (cv1T1.getQualifiers() != T2.getNonReferenceType().getQualifiers()) 226720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddQualificationConversionStep(cv1T1, T2->isReferenceType()); 226820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 226920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, !T2->isReferenceType()); 227020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return OR_Success; 227120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 227220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 227320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt reference initialization (C++0x [dcl.init.list]) 227420093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryReferenceInitialization(Sema &S, 227520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 227620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 227720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 227820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 227920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ReferenceBinding); 228020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2281d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 228220093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 22835535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T1Quals; 22845535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 228520093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 22865535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T2Quals; 22875535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 228820093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 228920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 229020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the initializer is the address of an overloaded function, try 229120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to resolve the overloaded function. If all goes well, T2 is the 229220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type of the resulting function. 229320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) { 229420093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Fn = S.ResolveAddressOfOverloadedFunction(Initializer, 229520093b4bf698f292c664676987541d5103b65b15Douglas Gregor T1, 229620093b4bf698f292c664676987541d5103b65b15Douglas Gregor false); 229720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Fn) { 229820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 229920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 230020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 230120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 230220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddAddressOverloadResolutionStep(Fn); 230320093b4bf698f292c664676987541d5103b65b15Douglas Gregor cv2T2 = Fn->getType(); 230420093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv2T2.getUnqualifiedType(); 230520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 230620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 230720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Rvalue references 230820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool ForceRValue = false; 230920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 231020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Compute some basic properties of the types and the initializer. 231120093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isLValueRef = DestType->isLValueReferenceType(); 231220093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isRValueRef = !isLValueRef; 231320093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase = false; 231420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr::isLvalueResult InitLvalue = ForceRValue ? Expr::LV_InvalidExpression : 231520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer->isLvalue(S.Context); 231620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult RefRelationship 231720093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase); 231820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 231920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p5: 232020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A reference to type "cv1 T1" is initialized by an expression of type 232120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // "cv2 T2" as follows: 232220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 232320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the reference is an lvalue reference and the initializer 232420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // expression 232520093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult ConvOvlResult = OR_Success; 232620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isLValueRef) { 232720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (InitLvalue == Expr::LV_Valid && 232820093b4bf698f292c664676987541d5103b65b15Douglas Gregor RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification) { 232920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - is an lvalue (but is not a bit-field), and "cv1 T1" is 233020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2," or 233120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 2332de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // Per C++ [over.best.ics]p2, we don't diagnose whether the lvalue is a 233320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // bit-field when we're determining whether the reference initialization 2334de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // can occur. However, we do pay attention to whether it is a bit-field 2335de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // to decide whether we're actually binding to a temporary created from 2336de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // the bit-field. 233720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 233820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 23395535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth S.Context.getQualifiedType(T1, T2Quals), 234020093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*isLValue=*/true); 23415535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 234220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddQualificationConversionStep(cv1T1, /*IsLValue=*/true); 2343de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor bool BindingTemporary = T1Quals.hasConst() && !T1Quals.hasVolatile() && 2344093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson (Initializer->getBitField() || Initializer->refersToVectorElement()); 2345de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, BindingTemporary); 234620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 234720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 234820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 234920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - has a class type (i.e., T2 is a class type), where T1 is not 235020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-related to T2, and can be implicitly converted to an 235120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible 235220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // with "cv3 T3" (this conversion is selected by enumerating the 235320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // applicable conversion functions (13.3.1.6) and choosing the best 235420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // one through overload resolution (13.3)), 235520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType()) { 235620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, Kind, 235720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer, 235820093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowRValues=*/false, 235920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 236020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult == OR_Success) 236120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 23621d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ConvOvlResult != OR_No_Viable_Function) { 23631d31833450e6d2947a33cb0840d87661d92eec07John McCall Sequence.SetOverloadFailure( 23641d31833450e6d2947a33cb0840d87661d92eec07John McCall InitializationSequence::FK_ReferenceInitOverloadFailed, 23651d31833450e6d2947a33cb0840d87661d92eec07John McCall ConvOvlResult); 23661d31833450e6d2947a33cb0840d87661d92eec07John McCall } 236720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 236820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 236920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 237020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the reference shall be an lvalue reference to a 237120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // non-volatile const type (i.e., cv1 shall be const), or the reference 237220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // shall be an rvalue reference and the initializer expression shall 237320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // be an rvalue. 2374ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor if (!((isLValueRef && T1Quals.hasConst() && !T1Quals.hasVolatile()) || 237520093b4bf698f292c664676987541d5103b65b15Douglas Gregor (isRValueRef && InitLvalue != Expr::LV_Valid))) { 237620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 237720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 237820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 237920093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 238020093b4bf698f292c664676987541d5103b65b15Douglas Gregor else if (isLValueRef) 238120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitLvalue == Expr::LV_Valid 238220093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? (RefRelationship == Sema::Ref_Related 238320093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? InitializationSequence::FK_ReferenceInitDropsQualifiers 238420093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToUnrelated) 238520093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 238620093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 238720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed( 238820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_RValueReferenceBindingToLValue); 238920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 239020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 239120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 239220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 239320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If T1 and T2 are class types and 239420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (T1->isRecordType() && T2->isRecordType()) { 239520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - the initializer expression is an rvalue and "cv1 T1" is 239620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2", or 239720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (InitLvalue != Expr::LV_Valid && 239820093b4bf698f292c664676987541d5103b65b15Douglas Gregor RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification) { 239920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 240020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 24015535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth S.Context.getQualifiedType(T1, T2Quals), 240220093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*isLValue=*/false); 24035535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 240420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddQualificationConversionStep(cv1T1, /*IsLValue=*/false); 240520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 240620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 240720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 240820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 240920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - T1 is not reference-related to T2 and the initializer expression 241020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // can be implicitly converted to an rvalue of type "cv3 T3" (this 241120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversion is selected by enumerating the applicable conversion 241220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions (13.3.1.6) and choosing the best one through overload 241320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // resolution (13.3)), 241420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible) { 241520093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, 241620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind, Initializer, 241720093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowRValues=*/true, 241820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 241920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult) 242020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 242120093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 242220093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 242320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 242420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 242520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 242620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 242720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 242820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 242920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 243020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 243120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer expression is an rvalue, with T2 an array type, 243220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // and "cv1 T1" is reference-compatible with "cv2 T2," the reference 243320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // is bound to the object represented by the rvalue (see 3.10). 243420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: How can an array type be reference-compatible with anything? 243520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Don't we mean the element types of T1 and T2? 243620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 243720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, a temporary of type “cv1 T1” is created and initialized 243820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // from the initializer expression using the rules for a non-reference 243920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // copy initialization (8.5). The reference is then bound to the 244020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // temporary. [...] 244120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 244220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 244320093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct); 244420093b4bf698f292c664676987541d5103b65b15Douglas Gregor ImplicitConversionSequence ICS 244520093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.TryImplicitConversion(Initializer, cv1T1, 244620093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*SuppressUserConversions=*/false, AllowExplicit, 244720093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*ForceRValue=*/false, 244820093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*FIXME:InOverloadResolution=*/false, 244920093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*UserCast=*/Kind.isExplicitCast()); 245020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 24511d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ICS.isBad()) { 245220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Use the conversion function set stored in ICS to turn 245320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // this into an overloading ambiguity diagnostic. However, we need 245420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to keep that set as an OverloadCandidateSet rather than as some 245520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // other kind of set. 245618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 245718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetOverloadFailure( 245818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 245918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor ConvOvlResult); 246018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 246118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed); 246220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 246320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 246420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 246520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // [...] If T1 is reference-related to T2, cv1 must be the 246620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // same cv-qualification as, or greater cv-qualification 246720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // than, cv2; otherwise, the program is ill-formed. 24685535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T1CVRQuals = T1Quals.getCVRQualifiers(); 24695535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T2CVRQuals = T2Quals.getCVRQualifiers(); 247020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Related && 24715535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth (T1CVRQuals | T2CVRQuals) != T1CVRQuals) { 247220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 247320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 247420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 247520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 247620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform the actual conversion. 247720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddConversionSequenceStep(ICS, cv1T1); 247820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 247920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 248020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 248120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 248220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt character array initialization from a string literal 248320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// (C++ [dcl.init.string], C99 6.7.8). 248420093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryStringLiteralInitialization(Sema &S, 248520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 248620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 248720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 248820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2489cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Sequence.setSequenceKind(InitializationSequence::StringInit); 2490d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddStringInitStep(Entity.getType()); 249120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 249220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 249320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt initialization by constructor (C++ [dcl.init]), which 249420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// enumerates the constructors of the initialized entity and performs overload 249520093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// resolution to select the best. 249620093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryConstructorInitialization(Sema &S, 249720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 249820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 249920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs, 250071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor QualType DestType, 250120093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 250218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Copy) 250318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.setSequenceKind(InitializationSequence::UserDefinedConversion); 250418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 250518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.setSequenceKind(InitializationSequence::ConstructorInitialization); 250651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 250751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build the candidate set directly in the initialization sequence 250851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // structure, so that it will persist if we fail. 250951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 251051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CandidateSet.clear(); 251151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 251251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 251351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // explicit conversion operators. 251451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct || 251551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getKind() == InitializationKind::IK_Value || 251651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getKind() == InitializationKind::IK_Default); 251751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 251851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 251951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // to see if one is suitable. 252051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor const RecordType *DestRecordType = DestType->getAs<RecordType>(); 252151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor assert(DestRecordType && "Constructor initialization requires record type"); 252251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXRecordDecl *DestRecordDecl 252351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 252451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 252551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor DeclarationName ConstructorName 252651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = S.Context.DeclarationNames.getCXXConstructorName( 252751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Context.getCanonicalType(DestType).getUnqualifiedType()); 252851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 252951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor for (llvm::tie(Con, ConEnd) = DestRecordDecl->lookup(ConstructorName); 253051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Con != ConEnd; ++Con) { 253151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Find the constructor (which may be a template). 253251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor = 0; 253351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor FunctionTemplateDecl *ConstructorTmpl 253451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = dyn_cast<FunctionTemplateDecl>(*Con); 253551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 253651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 253751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 253851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor else 253951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Constructor = cast<CXXConstructorDecl>(*Con); 254051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 254151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (!Constructor->isInvalidDecl() && 254299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (AllowExplicit || !Constructor->isExplicit())) { 254351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 254486820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, 254586820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ConstructorTmpl->getAccess(), 254686820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 254751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Args, NumArgs, CandidateSet); 254851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor else 254986820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddOverloadCandidate(Constructor, Constructor->getAccess(), 255086820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Args, NumArgs, CandidateSet); 255151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 255251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 255351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 255451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceLocation DeclLoc = Kind.getLocation(); 255551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 255651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Perform overload resolution. If it fails, return the failed result. 255751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 255851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (OverloadingResult Result 255951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = S.BestViableFunction(CandidateSet, DeclLoc, Best)) { 256051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Sequence.SetOverloadFailure( 256151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor InitializationSequence::FK_ConstructorOverloadFailed, 256251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Result); 256351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return; 256451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 25659db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 25669db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // C++0x [dcl.init]p6: 25679db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // If a program calls for the default initialization of an object 25689db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // of a const-qualified type T, T shall be a class type with a 25699db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // user-provided default constructor. 25709db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 25719db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getType().isConstQualified() && 25729db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor cast<CXXConstructorDecl>(Best->Function)->isImplicit()) { 25739db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 25749db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor return; 25759db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 25769db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 257751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Add the constructor initialization step. Any cv-qualification conversion is 257851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // subsumed by the initialization. 257918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Copy) { 258018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.AddUserConversionStep(Best->Function, DestType); 258118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } else { 258218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.AddConstructorInitializationStep( 258351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor cast<CXXConstructorDecl>(Best->Function), 258418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DestType); 258518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 258620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 258720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 258871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor/// \brief Attempt value initialization (C++ [dcl.init]p7). 258971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorstatic void TryValueInitialization(Sema &S, 259071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializedEntity &Entity, 259171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializationKind &Kind, 259271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor InitializationSequence &Sequence) { 259371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // C++ [dcl.init]p5: 259471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 259571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // To value-initialize an object of type T means: 2596d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType T = Entity.getType(); 259771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 259871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is an array type, then each element is value-initialized; 259971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor while (const ArrayType *AT = S.Context.getAsArrayType(T)) 260071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor T = AT->getElementType(); 260171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 260271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (const RecordType *RT = T->getAs<RecordType>()) { 260371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 260471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is a class type (clause 9) with a user-declared 260571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // constructor (12.1), then the default constructor for T is 260671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // called (and the initialization is ill-formed if T has no 260771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // accessible default constructor); 260871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 260971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // FIXME: we really want to refer to a single subobject of the array, 261071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // but Entity doesn't have a way to capture that (yet). 261171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (ClassDecl->hasUserDeclaredConstructor()) 261271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 261371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 261416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // -- if T is a (possibly cv-qualified) non-union class type 261516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // without a user-provided constructor, then the object is 261616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // zero-initialized and, if T’s implicitly-declared default 261716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // constructor is non-trivial, that constructor is called. 261816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if ((ClassDecl->getTagKind() == TagDecl::TK_class || 261916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ClassDecl->getTagKind() == TagDecl::TK_struct) && 262016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !ClassDecl->hasTrivialConstructor()) { 2621d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 262216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 262316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 262471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 262571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 262671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 2627d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 262871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ZeroInitialization); 262971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 263071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 263199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor/// \brief Attempt default initialization (C++ [dcl.init]p6). 263299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregorstatic void TryDefaultInitialization(Sema &S, 263399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializedEntity &Entity, 263499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializationKind &Kind, 263599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitializationSequence &Sequence) { 263699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(Kind.getKind() == InitializationKind::IK_Default); 263799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 263899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // C++ [dcl.init]p6: 263999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // To default-initialize an object of type T means: 264099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is an array type, each element is default-initialized; 2641d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 264299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor while (const ArrayType *Array = S.Context.getAsArrayType(DestType)) 264399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor DestType = Array->getElementType(); 264499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 264599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is a (possibly cv-qualified) class type (Clause 9), the default 264699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // constructor for T is called (and the initialization is ill-formed if 264799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // T has no accessible default constructor); 264899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (DestType->isRecordType()) { 264999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, DestType, 265099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence); 265199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 265299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 265399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - otherwise, no initialization is performed. 265499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.setSequenceKind(InitializationSequence::NoInitialization); 265599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 265699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // If a program calls for the default initialization of an object of 265799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // a const-qualified type T, T shall be a class type with a user-provided 265899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // default constructor. 265999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (DestType.isConstQualified()) 266099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 266199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 266299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 266320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]), 266420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// which enumerates all conversion functions and performs overload resolution 266520093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// to select the best. 266620093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryUserDefinedConversion(Sema &S, 266720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 266820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 266920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 267020093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 26714a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.setSequenceKind(InitializationSequence::UserDefinedConversion); 26724a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 2673d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 26744a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert(!DestType->isReferenceType() && "References are handled elsewhere"); 26754a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType SourceType = Initializer->getType(); 26764a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert((DestType->isRecordType() || SourceType->isRecordType()) && 26774a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor "Must have a class type to perform a user-defined conversion"); 26784a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 26794a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Build the candidate set directly in the initialization sequence 26804a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // structure, so that it will persist if we fail. 26814a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 26824a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CandidateSet.clear(); 26834a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 26844a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Determine whether we are allowed to call explicit constructors or 26854a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // explicit conversion operators. 26864a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 26874a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 26884a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) { 26894a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting to is a class type. Enumerate its constructors 26904a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // to see if there is a suitable conversion. 26914a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXRecordDecl *DestRecordDecl 26924a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 26934a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 26944a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor DeclarationName ConstructorName 26954a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = S.Context.DeclarationNames.getCXXConstructorName( 26964a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor S.Context.getCanonicalType(DestType).getUnqualifiedType()); 26974a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor DeclContext::lookup_iterator Con, ConEnd; 26984a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor for (llvm::tie(Con, ConEnd) = DestRecordDecl->lookup(ConstructorName); 26994a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Con != ConEnd; ++Con) { 27004a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Find the constructor (which may be a template). 27014a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXConstructorDecl *Constructor = 0; 27024a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionTemplateDecl *ConstructorTmpl 27034a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = dyn_cast<FunctionTemplateDecl>(*Con); 27044a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 27054a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Constructor = cast<CXXConstructorDecl>( 27064a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ConstructorTmpl->getTemplatedDecl()); 27074a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 27084a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Constructor = cast<CXXConstructorDecl>(*Con); 27094a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 27104a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (!Constructor->isInvalidDecl() && 27114a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 27124a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 271386820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, 271486820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ConstructorTmpl->getAccess(), 271586820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 27164a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor &Initializer, 1, CandidateSet); 27174a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 271886820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddOverloadCandidate(Constructor, Constructor->getAccess(), 271986820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall &Initializer, 1, CandidateSet); 27204a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 27214a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 27224a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 2723cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2724cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman SourceLocation DeclLoc = Initializer->getLocStart(); 2725cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 27264a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) { 27274a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting from is a class type, enumerate its conversion 27284a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // functions. 2729cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 273033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // We can only enumerate the conversion functions for a complete type; if 273133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // the type isn't complete, simply skip this step. 273233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (!S.RequireCompleteType(DeclLoc, SourceType, 0)) { 273333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *SourceRecordDecl 273433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = cast<CXXRecordDecl>(SourceRecordType->getDecl()); 27354a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 2736eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 273733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = SourceRecordDecl->getVisibleConversionFunctions(); 2738eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 273933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman E = Conversions->end(); 274033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman I != E; ++I) { 274133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman NamedDecl *D = *I; 274233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 274333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (isa<UsingShadowDecl>(D)) 274433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman D = cast<UsingShadowDecl>(D)->getTargetDecl(); 274533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman 274633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 274733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXConversionDecl *Conv; 27484a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConvTemplate) 274933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 27504a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 275133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(*I); 275233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman 275333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (AllowExplicit || !Conv->isExplicit()) { 275433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (ConvTemplate) 275586820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getAccess(), 275686820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, DestType, 275733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CandidateSet); 275833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman else 275986820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddConversionCandidate(Conv, I.getAccess(), ActingDC, 276086820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Initializer, DestType, CandidateSet); 276133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman } 27624a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 27634a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 27644a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 27654a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 27664a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Perform overload resolution. If it fails, return the failed result. 27674a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet::iterator Best; 27681d31833450e6d2947a33cb0840d87661d92eec07John McCall if (OverloadingResult Result 27694a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = S.BestViableFunction(CandidateSet, DeclLoc, Best)) { 27704a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.SetOverloadFailure( 27714a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor InitializationSequence::FK_UserConversionOverloadFailed, 27724a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Result); 27734a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 27744a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 27751d31833450e6d2947a33cb0840d87661d92eec07John McCall 27764a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionDecl *Function = Best->Function; 27774a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 27784a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (isa<CXXConstructorDecl>(Function)) { 27794a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step. Any cv-qualification conversion is 27804a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // subsumed by the initialization. 27814a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.AddUserConversionStep(Function, DestType); 27824a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 27834a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 27844a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 27854a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step that calls the conversion function. 27864a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType ConvType = Function->getResultType().getNonReferenceType(); 27874a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.AddUserConversionStep(Function, ConvType); 27884a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 27894a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // If the conversion following the call to the conversion function is 27904a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // interesting, add it as a separate step. 27914a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (Best->FinalConversion.First || Best->FinalConversion.Second || 27924a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Best->FinalConversion.Third) { 27934a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ImplicitConversionSequence ICS; 27941d31833450e6d2947a33cb0840d87661d92eec07John McCall ICS.setStandard(); 27954a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ICS.Standard = Best->FinalConversion; 27964a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.AddConversionSequenceStep(ICS, DestType); 27974a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 279820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 279920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 280020093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt an implicit conversion (C++ [conv]) converting from one 280120093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// non-class type to another. 280220093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryImplicitConversion(Sema &S, 280320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 280420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 280520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 280620093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 280720093b4bf698f292c664676987541d5103b65b15Douglas Gregor ImplicitConversionSequence ICS 2808d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor = S.TryImplicitConversion(Initializer, Entity.getType(), 280920093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*SuppressUserConversions=*/true, 281020093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowExplicit=*/false, 281120093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*ForceRValue=*/false, 281220093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*FIXME:InOverloadResolution=*/false, 281320093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*UserCast=*/Kind.isExplicitCast()); 281420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 28151d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ICS.isBad()) { 281620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ConversionFailed); 281720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 281820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 281920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2820d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddConversionSequenceStep(ICS, Entity.getType()); 282120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 282220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 282320093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::InitializationSequence(Sema &S, 282420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 282520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 282620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, 282720093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs) { 282820093b4bf698f292c664676987541d5103b65b15Douglas Gregor ASTContext &Context = S.Context; 282920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 283020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init]p16: 283120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The semantics of initializers are as follows. The destination type is 283220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // the type of the object or reference being initialized and the source 283320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type is the type of the initializer expression. The source type is not 283420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // defined when the initializer is a braced-init-list or when it is a 283520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // parenthesized list of expressions. 2836d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 283720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 283820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isDependentType() || 283920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 284020093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = DependentSequence; 284120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 284220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 284320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 284420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType SourceType; 284520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer = 0; 284699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs == 1) { 284720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer = Args[0]; 284820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!isa<InitListExpr>(Initializer)) 284920093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceType = Initializer->getType(); 285020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 285120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 285220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is a braced-init-list, the object is 285320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // list-initialized (8.5.4). 285420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) { 285520093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryListInitialization(S, Entity, Kind, InitList, *this); 2856d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 285720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 285820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 285920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a reference type, see 8.5.3. 286020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isReferenceType()) { 286120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p1: 286220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A variable declared to be a T& or T&&, that is, "reference to type T" 286320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (8.3.2), shall be initialized by an object, or function, of type T or 286420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // by an object that can be converted into a T. 286520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (Therefore, multiple arguments are not permitted.) 286620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (NumArgs != 1) 286720093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_TooManyInitsForReference); 286820093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 286920093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryReferenceInitialization(S, Entity, Kind, Args[0], *this); 287020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 287120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 287220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 287320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is an array of characters, an array of 287420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // char16_t, an array of char32_t, or an array of wchar_t, and the 287520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer is a string literal, see 8.5.2. 287620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Initializer && IsStringInit(Initializer, DestType, Context)) { 287720093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this); 287820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 287920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 288020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 288120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is (), the object is value-initialized. 288299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Value || 288399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct && NumArgs == 0)) { 288420093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryValueInitialization(S, Entity, Kind, *this); 288520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 288620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 288720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 288899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Handle default initialization. 288999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Default){ 289099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor TryDefaultInitialization(S, Entity, Kind, *this); 289199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 289299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 289318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 289420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, if the destination type is an array, the program is 289520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // ill-formed. 289620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (const ArrayType *AT = Context.getAsArrayType(DestType)) { 289720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (AT->getElementType()->isAnyCharacterType()) 289820093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_ArrayNeedsInitListOrStringLiteral); 289920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 290020093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_ArrayNeedsInitList); 290120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 290220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 290320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2904cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2905cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman // Handle initialization in C 2906cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman if (!S.getLangOptions().CPlusPlus) { 2907cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman setSequenceKind(CAssignment); 2908cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman AddCAssignmentStep(DestType); 2909cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman return; 2910cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 291120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 291220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a (possibly cv-qualified) class type: 291320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isRecordType()) { 291420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initialization is direct-initialization, or if it is 291520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // copy-initialization where the cv-unqualified version of the 291620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // source type is the same class as, or a derived class of, the 291720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // class of the destination, constructors are considered. [...] 291820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Direct || 291920093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Kind.getKind() == InitializationKind::IK_Copy && 292020093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Context.hasSameUnqualifiedType(SourceType, DestType) || 292120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.IsDerivedFrom(SourceType, DestType)))) 292271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor TryConstructorInitialization(S, Entity, Kind, Args, NumArgs, 2923d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(), *this); 292420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise (i.e., for the remaining copy-initialization cases), 292520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // user-defined conversion sequences that can convert from the source 292620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type to the destination type or (when a conversion function is 292720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // used) to a derived class thereof are enumerated as described in 292820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 13.3.1.4, and the best one is chosen through overload resolution 292920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (13.3). 293020093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 293120093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 293220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 293320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 293420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 293599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs > 1) { 293699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SetFailed(FK_TooManyInitsForScalar); 293799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 293899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 293999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(NumArgs == 1 && "Zero-argument case handled above"); 294099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 294120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, if the source type is a (possibly cv-qualified) class 294220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type, conversion functions are considered. 294399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (!SourceType.isNull() && SourceType->isRecordType()) { 294420093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 294520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 294620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 294720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 294820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the initial value of the object being initialized is the 29494a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // (possibly converted) value of the initializer expression. Standard 295020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversions (Clause 4) will be used, if necessary, to convert the 295120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer expression to the cv-unqualified version of the 295220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // destination type; no user-defined conversions are considered. 295399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor setSequenceKind(StandardConversion); 295420093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryImplicitConversion(S, Entity, Kind, Initializer, *this); 295520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 295620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 295720093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::~InitializationSequence() { 295820093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (llvm::SmallVectorImpl<Step>::iterator Step = Steps.begin(), 295920093b4bf698f292c664676987541d5103b65b15Douglas Gregor StepEnd = Steps.end(); 296020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) 296120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Destroy(); 296220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 296320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 296420093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 296520093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Perform initialization 296620093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 296718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorstatic Sema::AssignmentAction 296818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorgetAssignmentAction(const InitializedEntity &Entity) { 296918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch(Entity.getKind()) { 297018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 297118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 297218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 297318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 297418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 297518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell when we're sending vs. passing? 297618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Passing; 297718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 297818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 297918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Returning; 298018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 298118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Exception: 298218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 298318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("No assignment action for C++-specific initialization"); 298418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 298518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 298618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 298718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell apart casting vs. converting? 298818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Casting; 298918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 299018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Member: 2991d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_ArrayElement: 2992d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 299318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 299418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 299518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 299618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Converting; 299718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 299818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 299918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorstatic bool shouldBindAsTemporary(const InitializedEntity &Entity, 300018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy) { 300118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 300218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 300318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Exception: 30041b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 30051b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 300618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return !IsCopy; 300718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 300818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 300918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 301018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 3011d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 301218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return false; 301318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 301418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 301518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 301618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return true; 301718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 301818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 301918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("missed an InitializedEntity kind?"); 302018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 302118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 302218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor/// \brief If we need to perform an additional copy of the initialized object 302318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor/// for this kind of entity (e.g., the result of a function or an object being 302418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor/// thrown), make the copy. 302518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorstatic Sema::OwningExprResult CopyIfRequiredForEntity(Sema &S, 302618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor const InitializedEntity &Entity, 30277abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor const InitializationKind &Kind, 302818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::OwningExprResult CurInit) { 30291b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Expr *CurInitExpr = (Expr *)CurInit.get(); 30301b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 303118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation Loc; 303218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 303318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 303418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 3035d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (Entity.getType()->isReferenceType()) 303618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return move(CurInit); 303718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Loc = Entity.getReturnLoc(); 303818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 303918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 304018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Exception: 304118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Loc = Entity.getThrowLoc(); 304218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 304318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 304418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 3045d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (Entity.getType()->isReferenceType() || 30467abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor Kind.getKind() != InitializationKind::IK_Copy) 30477abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return move(CurInit); 30487abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor Loc = Entity.getDecl()->getLocation(); 30497abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor break; 30507abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 30511b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 30521b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 30531b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson if (Entity.getType()->isReferenceType() || 30541b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Kind.getKind() != InitializationKind::IK_Copy) 30551b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson return move(CurInit); 30561b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Loc = CurInitExpr->getLocStart(); 30571b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson break; 30581b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 305918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 30607abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor // FIXME: Do we need this initialization for a parameter? 30617abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return move(CurInit); 30627abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 306318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 306418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 306518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 3066d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 306718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // We don't need to copy for any of these initialized entities. 306818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return move(CurInit); 306918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 307018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 307118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CXXRecordDecl *Class = 0; 307218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (const RecordType *Record = CurInitExpr->getType()->getAs<RecordType>()) 307318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Class = cast<CXXRecordDecl>(Record->getDecl()); 307418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (!Class) 307518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return move(CurInit); 307618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 307718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // Perform overload resolution using the class's copy constructors. 307818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DeclarationName ConstructorName 307918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor = S.Context.DeclarationNames.getCXXConstructorName( 308018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Context.getCanonicalType(S.Context.getTypeDeclType(Class))); 308118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DeclContext::lookup_iterator Con, ConEnd; 308218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OverloadCandidateSet CandidateSet; 308318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor for (llvm::tie(Con, ConEnd) = Class->lookup(ConstructorName); 308418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Con != ConEnd; ++Con) { 308518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // Find the constructor (which may be a template). 308618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(*Con); 308718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (!Constructor || Constructor->isInvalidDecl() || 30889e9199d8649cf3e10c98a69403f05dbb666d8fb1Douglas Gregor !Constructor->isCopyConstructor()) 308918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor continue; 309018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 309186820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall S.AddOverloadCandidate(Constructor, Constructor->getAccess(), 309286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall &CurInitExpr, 1, CandidateSet); 309318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 309418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 309518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OverloadCandidateSet::iterator Best; 309618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (S.BestViableFunction(CandidateSet, Loc, Best)) { 309718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Success: 309818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 309918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 310018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_No_Viable_Function: 310118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_no_viable) 31027abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 310318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 3104cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(CandidateSet, Sema::OCD_AllCandidates, 3105cbce60633c9864261105b289473e5a3ed7b4a729John McCall &CurInitExpr, 1); 310618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 310718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 310818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Ambiguous: 310918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_ambiguous) 31107abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 311118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 3112cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(CandidateSet, Sema::OCD_ViableCandidates, 3113cbce60633c9864261105b289473e5a3ed7b4a729John McCall &CurInitExpr, 1); 311418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 311518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 311618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Deleted: 311718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_deleted) 31187abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 311918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 312018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 312118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Best->Function->isDeleted(); 312218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 312318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 312418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 312518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit.release(); 312618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.BuildCXXConstructExpr(Loc, CurInitExpr->getType(), 312718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor cast<CXXConstructorDecl>(Best->Function), 312818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor /*Elidable=*/true, 312918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::MultiExprArg(S, 313018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor (void**)&CurInitExpr, 1)); 313118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 313220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 313320093b4bf698f292c664676987541d5103b65b15Douglas GregorAction::OwningExprResult 313420093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::Perform(Sema &S, 313520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 313620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 3137d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Action::MultiExprArg Args, 3138d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType *ResultType) { 313920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind == FailedSequence) { 314020093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 314120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Diagnose(S, Entity, Kind, (Expr **)Args.release(), NumArgs); 314220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 314320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 314420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 314520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind == DependentSequence) { 3146d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If the declaration is a non-dependent, incomplete array type 3147d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // that has an initializer, then its type will be completed once 3148d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // the initializer is instantiated. 3149d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (ResultType && !Entity.getType()->isDependentType() && 3150d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Args.size() == 1) { 3151d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DeclType = Entity.getType(); 3152d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (const IncompleteArrayType *ArrayT 3153d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getAsIncompleteArrayType(DeclType)) { 3154d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We don't currently have the ability to accurately 3155d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // compute the length of an initializer list without 3156d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // performing full type-checking of the initializer list 3157d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // (since we have to determine where braces are implicitly 3158d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // introduced and such). So, we fall back to making the array 3159d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // type a dependently-sized array type with no specified 3160d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // bound. 3161d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (isa<InitListExpr>((Expr *)Args.get()[0])) { 3162d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor SourceRange Brackets; 3163d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor 3164d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Scavange the location of the brackets from the entity, if we can. 3165d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (DeclaratorDecl *DD = Entity.getDecl()) { 3166d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) { 3167d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor TypeLoc TL = TInfo->getTypeLoc(); 3168d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (IncompleteArrayTypeLoc *ArrayLoc 3169d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor = dyn_cast<IncompleteArrayTypeLoc>(&TL)) 3170d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Brackets = ArrayLoc->getBracketsRange(); 3171d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor } 3172d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3173d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3174d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor *ResultType 3175d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getDependentSizedArrayType(ArrayT->getElementType(), 3176d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor /*NumElts=*/0, 3177d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getSizeModifier(), 3178d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getIndexTypeCVRQualifiers(), 3179d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Brackets); 3180d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3181d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3182d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3183d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3184d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3185085446216a198ced4183ec1571e1ae51c2920e98Eli Friedman if (Kind.getKind() == InitializationKind::IK_Copy || Kind.isExplicitCast()) 318620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Sema::OwningExprResult(S, Args.release()[0]); 318720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 318820093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 318920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.Owned(new (S.Context) ParenListExpr(S.Context, 319020093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation(), 319120093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Expr **)Args.release(), 319220093b4bf698f292c664676987541d5103b65b15Douglas Gregor NumArgs, 319320093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation())); 319420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 319520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 319699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (SequenceKind == NoInitialization) 319799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return S.Owned((Expr *)0); 319899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 3199d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType().getNonReferenceType(); 3200d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor // FIXME: Ugly hack around the fact that Entity.getType() is not 3201a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // the same as Entity.getDecl()->getType() in cases involving type merging, 3202a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // and we want latter when it makes sense. 3203d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (ResultType) 3204a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() : 3205d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(); 320620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 320799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sema::OwningExprResult CurInit = S.Owned((Expr *)0); 320899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 320999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(!Steps.empty() && "Cannot have an empty initialization sequence"); 321099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 321199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // For initialization steps that start with a single initializer, 321299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // grab the only argument out the Args and place it into the "current" 321399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // initializer. 321499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (Steps.front().Kind) { 321518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ResolveAddressOfOverloadedFunction: 321618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseRValue: 321718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseLValue: 321818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReference: 321918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReferenceToTemporary: 322018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_UserConversion: 322118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionLValue: 322218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionRValue: 322318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConversionSequence: 322418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ListInitialization: 322518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 3226cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 322718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(Args.size() == 1); 322818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = Sema::OwningExprResult(S, ((Expr **)(Args.get()))[0]->Retain()); 322918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (CurInit.isInvalid()) 323018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 323118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 323218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 323318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConstructorInitialization: 323418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ZeroInitialization: 323518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 323620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 323720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 323820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Walk through the computed steps for the initialization sequence, 323920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // performing the specified conversions along the way. 324016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool ConstructorInitRequiresZeroInit = false; 324120093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (step_iterator Step = step_begin(), StepEnd = step_end(); 324220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) { 324320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 324420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 324520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 324620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *CurInitExpr = (Expr *)CurInit.get(); 324799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor QualType SourceType = CurInitExpr? CurInitExpr->getType() : QualType(); 324820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 324920093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Step->Kind) { 325020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 325120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Overload resolution determined which function invoke; update the 325220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer to reflect that choice. 325320093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.FixOverloadedFunctionReference(move(CurInit), Step->Function); 325420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 325520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 325620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 325720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: { 325820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a derived-to-base cast that produces either an rvalue or an 325920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue. Perform that cast. 326020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 326120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Casts to inaccessible base classes are allowed with C-style casts. 326220093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast(); 326320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckDerivedToBaseConversion(SourceType, Step->Type, 326420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr->getLocStart(), 326520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr->getSourceRange(), 326620093b4bf698f292c664676987541d5103b65b15Douglas Gregor IgnoreBaseAccess)) 326720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 326820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 326920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitCastExpr(Step->Type, 327020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastExpr::CK_DerivedToBase, 327120093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Expr*)CurInit.release(), 327220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Kind == SK_CastDerivedToBaseLValue)); 327320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 327420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 327520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 327620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 327720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (FieldDecl *BitField = CurInitExpr->getBitField()) { 327820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // References cannot bind to bit fields (C++ [dcl.init.ref]p5). 327920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield) 3280d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor << Entity.getType().isVolatileQualified() 328120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << BitField->getDeclName() 328220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << CurInitExpr->getSourceRange(); 328320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(BitField->getLocation(), diag::note_bitfield_decl); 328420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 328520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3286a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 3287093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson if (CurInitExpr->refersToVectorElement()) { 3288093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson // Vector elements cannot bind to bit fields. 3289093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element) 3290093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << Entity.getType().isVolatileQualified() 3291093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << CurInitExpr->getSourceRange(); 3292093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson return S.ExprError(); 3293093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson } 3294093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson 329520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Reference binding does not have any corresponding ASTs. 329620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 329720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 329820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckExceptionSpecCompatibility(CurInitExpr, DestType)) 329920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 33003aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 33013aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson // FIXME: We should do this for all types. 33023aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson if (DestType->isAnyComplexType()) { 33033aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson CurInit = 33043aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson S.Owned(CXXBindReferenceExpr::Create(S.Context, 33053aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson CurInit.takeAs<Expr>(), 33063aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson /*ExtendsLifetime=*/false, 33073aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson /*RequiresTemporaryCopy=*/false)); 33083aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson } 33093aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 331020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 33113aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 331220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 331320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 331420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckExceptionSpecCompatibility(CurInitExpr, DestType)) 331520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 331620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 33173aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson // FIXME: We should do this for all types. 33183aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson if (DestType->isAnyComplexType()) { 33193aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson CurInit = 33203aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson S.Owned(CXXBindReferenceExpr::Create(S.Context, 33213aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson CurInit.takeAs<Expr>(), 33223aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson /*ExtendsLifetime=*/false, 33233aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson /*RequiresTemporaryCopy=*/true)); 33243aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson } 332520093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 332620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 332720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: { 332820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a user-defined conversion that invokes either a constructor 332920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // or a conversion function. 333020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastExpr::CastKind CastKind = CastExpr::CK_Unknown; 333118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy = false; 333220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CXXConstructorDecl *Constructor 333320093b4bf698f292c664676987541d5103b65b15Douglas Gregor = dyn_cast<CXXConstructorDecl>(Step->Function)) { 333420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the selected constructor. 333520093b4bf698f292c664676987541d5103b65b15Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(S); 333620093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation Loc = CurInitExpr->getLocStart(); 333720093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 333820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 333920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the arguments required to actually perform the constructor 334020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // call. 334120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CompleteConstructorCall(Constructor, 334220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::MultiExprArg(S, 334320093b4bf698f292c664676987541d5103b65b15Douglas Gregor (void **)&CurInitExpr, 334420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 1), 334520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Loc, ConstructorArgs)) 334620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 334720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 334820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the an expression that constructs a temporary. 334920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Step->Type, Constructor, 335020093b4bf698f292c664676987541d5103b65b15Douglas Gregor move_arg(ConstructorArgs)); 335120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 335220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 335320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 335420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastKind = CastExpr::CK_ConstructorConversion; 335518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType Class = S.Context.getTypeDeclType(Constructor->getParent()); 335618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.Context.hasSameUnqualifiedType(SourceType, Class) || 335718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.IsDerivedFrom(SourceType, Class)) 335818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor IsCopy = true; 335920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 336020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the conversion function. 336120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Step->Function); 336218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 336320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Should we move this initialization into a separate 336420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // derived-to-base conversion? I believe the answer is "no", because 336520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // we don't want to turn off access control here for c-style casts. 336620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.PerformObjectArgumentInitialization(CurInitExpr, Conversion)) 336720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 336820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 336920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Do a little dance to make sure that CurInit has the proper 337020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // pointer. 337120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 337220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 337320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the actual call to the conversion function. 337420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(S.BuildCXXMemberCallExpr(CurInitExpr, Conversion)); 337520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid() || !CurInit.get()) 337620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 337720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 337820093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastKind = CastExpr::CK_UserDefinedConversion; 337920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 338020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 338118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (shouldBindAsTemporary(Entity, IsCopy)) 338218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 338318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 338420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr = CurInit.takeAs<Expr>(); 338520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitCastExpr(CurInitExpr->getType(), 338620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastKind, 338720093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr, 338818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor false)); 338918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 339018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (!IsCopy) 33917abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor CurInit = CopyIfRequiredForEntity(S, Entity, Kind, move(CurInit)); 339220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 339320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 339420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 339520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 339620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 339720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform a qualification conversion; these can never go wrong. 339820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ImpCastExprToType(CurInitExpr, Step->Type, 339920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastExpr::CK_NoOp, 340020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Kind == SK_QualificationConversionLValue); 340120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 340220093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(CurInitExpr); 340320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 340420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 340520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 34066864748fc9a780e6db0bb5a7bd20aa889882dc94Douglas Gregor if (S.PerformImplicitConversion(CurInitExpr, Step->Type, Sema::AA_Converting, 340720093b4bf698f292c664676987541d5103b65b15Douglas Gregor false, false, *Step->ICS)) 340820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 340920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 341020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 341120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(CurInitExpr); 341220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 3413d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3414d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: { 3415d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor InitListExpr *InitList = cast<InitListExpr>(CurInitExpr); 3416d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType Ty = Step->Type; 3417cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (S.CheckInitList(Entity, InitList, ResultType? *ResultType : Ty)) 3418d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return S.ExprError(); 3419d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3420d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit.release(); 3421d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit = S.Owned(InitList); 3422d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 3423d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 342451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 342551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: { 342651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor 342751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = cast<CXXConstructorDecl>(Step->Function); 342851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 342951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build a call to the selected constructor. 343051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(S); 343151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceLocation Loc = Kind.getLocation(); 343251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 343351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine the arguments required to actually perform the constructor 343451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // call. 343551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (S.CompleteConstructorCall(Constructor, move(Args), 343651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Loc, ConstructorArgs)) 343751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return S.ExprError(); 343851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 343951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build the an expression that constructs a temporary. 3440d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 3441745880f35066bdb1950d0e870608295221346fc5Douglas Gregor Constructor, 344216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor move_arg(ConstructorArgs), 34439db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ConstructorInitRequiresZeroInit, 34449db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Base); 344551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (CurInit.isInvalid()) 344651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return S.ExprError(); 344718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 344818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool Elidable 344918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor = cast<CXXConstructExpr>((Expr *)CurInit.get())->isElidable(); 345018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (shouldBindAsTemporary(Entity, Elidable)) 345118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 345218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 345318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (!Elidable) 34547abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor CurInit = CopyIfRequiredForEntity(S, Entity, Kind, move(CurInit)); 345551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 345651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 345771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 345871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: { 345916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor step_iterator NextStep = Step; 346016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ++NextStep; 346116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (NextStep != StepEnd && 346216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor NextStep->Kind == SK_ConstructorInitialization) { 346316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // The need for zero-initialization is recorded directly into 346416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // the call to the object's constructor within the next step. 346516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ConstructorInitRequiresZeroInit = true; 346616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else if (Kind.getKind() == InitializationKind::IK_Value && 346716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor S.getLangOptions().CPlusPlus && 346816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !Kind.isImplicitValueInit()) { 346971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor CurInit = S.Owned(new (S.Context) CXXZeroInitValueExpr(Step->Type, 347071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getBegin(), 347171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getEnd())); 347216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else { 347371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitValueInitExpr(Step->Type)); 347416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 347571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor break; 347671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 347718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 347818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: { 347918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType SourceType = CurInitExpr->getType(); 348018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::AssignConvertType ConvTy = 348118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.CheckSingleAssignmentConstraints(Step->Type, CurInitExpr); 3482aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 3483aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor // If this is a call, allow conversion to a transparent union. 3484aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor if (ConvTy != Sema::Compatible && 3485aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor Entity.getKind() == InitializedEntity::EK_Parameter && 3486aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExpr) 3487aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor == Sema::Compatible) 3488aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor ConvTy = Sema::Compatible; 3489aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 349018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(), 349118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step->Type, SourceType, 349218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInitExpr, getAssignmentAction(Entity))) 349318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 349418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 349518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit.release(); 349618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.Owned(CurInitExpr); 349718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 349818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 3499cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3500cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: { 3501cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman QualType Ty = Step->Type; 3502cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman CheckStringInit(CurInitExpr, ResultType ? *ResultType : Ty, S); 3503cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman break; 3504cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 350520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 350620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 350720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 350820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return move(CurInit); 350920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 351020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 351120093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 351220093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Diagnose initialization failures 351320093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 351420093b4bf698f292c664676987541d5103b65b15Douglas Gregorbool InitializationSequence::Diagnose(Sema &S, 351520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 351620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 351720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs) { 351820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind != FailedSequence) 351920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return false; 352020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3521d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 352220093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Failure) { 352320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_TooManyInitsForReference: 35249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // FIXME: Customize for the initialized entity? 35259db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (NumArgs == 0) 35269db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_without_init) 35279db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType.getNonReferenceType(); 35289db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor else // FIXME: diagnostic below could be better! 35299db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits) 35309db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 353120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 353220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 353320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitList: 353420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 353520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) 353620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Failure == FK_ArrayNeedsInitListOrStringLiteral); 353720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 353820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 353920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_AddressOfOverloadFailed: 354020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ResolveAddressOfOverloadedFunction(Args[0], 354120093b4bf698f292c664676987541d5103b65b15Douglas Gregor DestType.getNonReferenceType(), 354220093b4bf698f292c664676987541d5103b65b15Douglas Gregor true); 354320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 354420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 354520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitOverloadFailed: 35464a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor case FK_UserConversionOverloadFailed: 354720093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (FailedOverloadResult) { 354820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Ambiguous: 354918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Failure == FK_UserConversionOverloadFailed) 355018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_ambiguous_condition) 355118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getType() << DestType 355218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 355318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 355418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_ref_init_ambiguous) 355518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << DestType << Args[0]->getType() 355618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 355718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 3558cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(FailedCandidateSet, Sema::OCD_ViableCandidates, 3559cbce60633c9864261105b289473e5a3ed7b4a729John McCall Args, NumArgs); 356020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 356120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 356220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_No_Viable_Function: 356320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition) 356420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 356520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 3566cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(FailedCandidateSet, Sema::OCD_AllCandidates, 3567cbce60633c9864261105b289473e5a3ed7b4a729John McCall Args, NumArgs); 356820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 356920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 357020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Deleted: { 357120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function) 357220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 357320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 357420093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 357520093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Ovl = S.BestViableFunction(FailedCandidateSet, 357620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind.getLocation(), 357720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Best); 357820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Ovl == OR_Deleted) { 357920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 358020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Best->Function->isDeleted(); 358120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 35829f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Inconsistent overload resolution?"); 358320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 358420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 358520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 358620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 358720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Success: 35889f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Conversion did not fail!"); 358920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 359020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 359120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 359220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 359320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 359420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 359520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), 359620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Failure == FK_NonConstLValueReferenceBindingToTemporary 359720093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? diag::err_lvalue_reference_bind_to_temporary 359820093b4bf698f292c664676987541d5103b65b15Douglas Gregor : diag::err_lvalue_reference_bind_to_unrelated) 3599ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor << DestType.getNonReferenceType().isVolatileQualified() 360020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 360120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 360220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 360320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 360420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 360520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_RValueReferenceBindingToLValue: 360620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref) 360720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 360820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 360920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 361020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitDropsQualifiers: 361120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) 361220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 361320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 361420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 361520093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 361620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 361720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitFailed: 361820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_failed) 361920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 362020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Args[0]->isLvalue(S.Context) == Expr::LV_Valid) 362120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 362220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 362320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 362420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 362520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ConversionFailed: 362618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_init_conversion_failed) 362718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << (int)Entity.getKind() 362820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType 362920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Args[0]->isLvalue(S.Context) == Expr::LV_Valid) 363020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 363120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 3632d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 3633d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3634d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_TooManyInitsForScalar: { 363599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceRange R; 363699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 363799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (InitListExpr *InitList = dyn_cast<InitListExpr>(Args[0])) 363899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor R = SourceRange(InitList->getInit(1)->getLocStart(), 363999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitList->getLocEnd()); 364099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor else 364199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor R = SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 3642d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3643d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_excess_initializers) 364499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor << /*scalar=*/2 << R; 3645d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 3646d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3647d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3648d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_ReferenceBindingToInitList: 3649d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list) 3650d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getSourceRange(); 3651d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 3652d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3653d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_InitListBadDestinationType: 3654d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type) 3655d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange(); 3656d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 365751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 365851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case FK_ConstructorOverloadFailed: { 365951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceRange ArgsRange; 366051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (NumArgs) 366151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ArgsRange = SourceRange(Args[0]->getLocStart(), 366251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Args[NumArgs - 1]->getLocEnd()); 366351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 366451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // FIXME: Using "DestType" for the entity we're printing is probably 366551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // bad. 366651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor switch (FailedOverloadResult) { 366751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Ambiguous: 366851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_ambiguous_init) 366951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 367081201626aa08bcc9d05c8b3c6a1d38a7d577c3ceJohn McCall S.PrintOverloadCandidates(FailedCandidateSet, 3671cbce60633c9864261105b289473e5a3ed7b4a729John McCall Sema::OCD_ViableCandidates, Args, NumArgs); 367251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 367351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 367451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_No_Viable_Function: 36759db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 36769db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor (Entity.getKind() == InitializedEntity::EK_Base || 36779db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Member) && 36789db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 36799db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default initialization of a member or 36809db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // base within a constructor. If no viable function was 36819db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // found, notify the user that she needs to explicitly 36829db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialize this base/member. 36839db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor 36849db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = cast<CXXConstructorDecl>(S.CurContext); 36859db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Base) { 36869db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 36879db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 36889db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 36899db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*base=*/0 36909db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getType(); 36919db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 36929db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor RecordDecl *BaseDecl 36939db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getBaseSpecifier()->getType()->getAs<RecordType>() 36949db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ->getDecl(); 36959db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(BaseDecl->getLocation(), diag::note_previous_decl) 36969db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(BaseDecl); 36979db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 36989db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 36999db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 37009db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 37019db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*member=*/1 37029db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 37039db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_field_decl); 37049db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 37059db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (const RecordType *Record 37069db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getType()->getAs<RecordType>()) 37079db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Record->getDecl()->getLocation(), 37089db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor diag::note_previous_decl) 37099db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(Record->getDecl()); 37109db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 37119db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor break; 37129db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 37139db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 371451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init) 371551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 3716cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(FailedCandidateSet, Sema::OCD_AllCandidates, 3717cbce60633c9864261105b289473e5a3ed7b4a729John McCall Args, NumArgs); 371851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 371951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 372051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Deleted: { 372151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 372251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << true << DestType << ArgsRange; 372351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 372451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadingResult Ovl = S.BestViableFunction(FailedCandidateSet, 372551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getLocation(), 372651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Best); 372751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (Ovl == OR_Deleted) { 372851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 372951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << Best->Function->isDeleted(); 373051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } else { 373151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Inconsistent overload resolution?"); 373251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 373351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 373451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 373551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 373651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Success: 373751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Conversion did not fail!"); 373851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 373951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 374051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 374151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 374299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 374399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case FK_DefaultInitOfConst: 37449db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Member && 37459db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 37469db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default-initialization of a const member in 37479db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // a constructor. Complain that it needs to be explicitly 37489db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialized. 37499db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext); 37509db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor) 37519db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 37529db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 37539db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*const=*/1 37549db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 37559db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl) 37569db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 37579db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 37589db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_default_init_const) 37599db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType << (bool)DestType->getAs<RecordType>(); 37609db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 376199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor break; 376220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 376320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 376420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return true; 376520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 376618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 3767de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump(llvm::raw_ostream &OS) const { 3768de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (SequenceKind) { 3769de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FailedSequence: { 3770de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Failed sequence: "; 3771de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (Failure) { 3772de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForReference: 3773de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for reference"; 3774de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3775de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3776de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitList: 3777de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list"; 3778de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3779de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3780de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 3781de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list or string literal"; 3782de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3783de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3784de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_AddressOfOverloadFailed: 3785de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "address of overloaded function failed"; 3786de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3787de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3788de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitOverloadFailed: 3789de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overload resolution for reference initialization failed"; 3790de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3791de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3792de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 3793de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to temporary"; 3794de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3795de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3796de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 3797de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to unrelated type"; 3798de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3799de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3800de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_RValueReferenceBindingToLValue: 3801de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "rvalue reference bound to an lvalue"; 3802de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3803de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3804de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitDropsQualifiers: 3805de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization drops qualifiers"; 3806de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3807de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3808de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitFailed: 3809de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization failed"; 3810de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3811de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3812de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConversionFailed: 3813de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "conversion failed"; 3814de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3815de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3816de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForScalar: 3817de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for scalar"; 3818de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3819de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3820de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceBindingToInitList: 3821de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "referencing binding to initializer list"; 3822de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3823de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3824de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_InitListBadDestinationType: 3825de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "initializer list for non-aggregate, non-scalar type"; 3826de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3827de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3828de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_UserConversionOverloadFailed: 3829de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overloading failed for user-defined conversion"; 3830de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3831de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3832de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConstructorOverloadFailed: 3833de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor overloading failed"; 3834de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3835de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3836de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_DefaultInitOfConst: 3837de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "default initialization of a const variable"; 3838de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3839de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 3840de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << '\n'; 3841de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 3842de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 3843de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3844de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case DependentSequence: 3845de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Dependent sequence: "; 3846de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 3847de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3848de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case UserDefinedConversion: 3849de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "User-defined conversion sequence: "; 3850de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3851de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3852de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ConstructorInitialization: 3853de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Constructor initialization sequence: "; 3854de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3855de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3856de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ReferenceBinding: 3857de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Reference binding: "; 3858de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3859de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3860de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ListInitialization: 3861de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "List initialization: "; 3862de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3863de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3864de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ZeroInitialization: 3865de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Zero initialization\n"; 3866de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 3867de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3868de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case NoInitialization: 3869de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "No initialization\n"; 3870de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 3871de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3872de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case StandardConversion: 3873de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Standard conversion: "; 3874de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3875de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3876de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case CAssignment: 3877de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment: "; 3878de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3879de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3880de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case StringInit: 3881de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "String initialization: "; 3882de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3883de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 3884de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3885de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) { 3886de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor if (S != step_begin()) { 3887de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << " -> "; 3888de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 3889de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3890de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (S->Kind) { 3891de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 3892de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "resolve address of overloaded function"; 3893de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3894de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3895de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseRValue: 3896de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (rvalue" << S->Type.getAsString() << ")"; 3897de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3898de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3899de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseLValue: 3900de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (lvalue" << S->Type.getAsString() << ")"; 3901de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3902de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3903de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReference: 3904de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to lvalue"; 3905de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3906de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3907de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReferenceToTemporary: 3908de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to a temporary"; 3909de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3910de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3911de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_UserConversion: 3912de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "user-defined conversion via " << S->Function->getNameAsString(); 3913de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3914de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3915de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionRValue: 3916de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (rvalue)"; 3917de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3918de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionLValue: 3919de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (lvalue)"; 3920de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3921de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3922de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConversionSequence: 3923de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "implicit conversion sequence ("; 3924de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor S->ICS->DebugPrint(); // FIXME: use OS 3925de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << ")"; 3926de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3927de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3928de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ListInitialization: 3929de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "list initialization"; 3930de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3931de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3932de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConstructorInitialization: 3933de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor initialization"; 3934de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3935de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3936de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ZeroInitialization: 3937de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "zero initialization"; 3938de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3939de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3940de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CAssignment: 3941de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment"; 3942de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3943de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3944de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_StringInit: 3945de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "string initialization"; 3946de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 3947de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 3948de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 3949de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 3950de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 3951de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump() const { 3952de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor dump(llvm::errs()); 3953de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 3954de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 395518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 395618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// Initialization helper functions 395718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 395818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::OwningExprResult 395918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::PerformCopyInitialization(const InitializedEntity &Entity, 396018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation EqualLoc, 396118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OwningExprResult Init) { 396218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Init.isInvalid()) 396318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return ExprError(); 396418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 396518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Expr *InitE = (Expr *)Init.get(); 396618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(InitE && "No initialization expression?"); 396718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 396818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (EqualLoc.isInvalid()) 396918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc = InitE->getLocStart(); 397018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 397118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationKind Kind = InitializationKind::CreateCopy(InitE->getLocStart(), 397218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc); 397318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 397418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Init.release(); 397518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Seq.Perform(*this, Entity, Kind, 397618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor MultiExprArg(*this, (void**)&InitE, 1)); 397718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 3978