SemaInit.cpp revision 7a1fad38256eb4c5129359be85ba1ea1678eb5c9
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 1819510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Designator.h" 19e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Initialization.h" 20e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h" 21e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Sema.h" 221e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner#include "clang/Lex/Preprocessor.h" 230cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff#include "clang/AST/ASTContext.h" 247cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 252078bb9c9336da56ea521e98e718556b227541f6Anders Carlsson#include "clang/AST/ExprCXX.h" 2679e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner#include "clang/AST/ExprObjC.h" 27d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor#include "clang/AST/TypeLoc.h" 2820093b4bf698f292c664676987541d5103b65b15Douglas Gregor#include "llvm/Support/ErrorHandling.h" 29c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor#include <map> 3005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorusing namespace clang; 310cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 32dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 33dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Sema Initialization Checking 34dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 35dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 3679e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattnerstatic Expr *IsStringInit(Expr *Init, QualType DeclType, ASTContext &Context) { 378879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner const ArrayType *AT = Context.getAsArrayType(DeclType); 388879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (!AT) return 0; 398879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 408718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT)) 418718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman return 0; 428718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman 438879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // See if this is a string literal or @encode. 448879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner Init = Init->IgnoreParens(); 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 468879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Handle @encode, which is a narrow string. 478879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType()) 488879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 498879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 508879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Otherwise we can only handle string literals. 518879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner StringLiteral *SL = dyn_cast<StringLiteral>(Init); 52220b6369d7717bfe6894b46cef055d3e763827f2Chris Lattner if (SL == 0) return 0; 53bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman 54bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman QualType ElemTy = Context.getCanonicalType(AT->getElementType()); 558879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // char array can be initialized with a narrow string. 568879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Only allow char x[] = "foo"; not char x[] = L"foo"; 578879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (!SL->isWide()) 58bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman return ElemTy->isCharType() ? Init : 0; 598879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 60bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // wchar_t array can be initialized with a wide string: C99 6.7.8p15 (with 61bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // correction from DR343): "An array with element type compatible with a 62bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // qualified or unqualified version of wchar_t may be initialized by a wide 63bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // string literal, optionally enclosed in braces." 64bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman if (Context.typesAreCompatible(Context.getWCharType(), 65bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman ElemTy.getUnqualifiedType())) 668879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner return 0; 69dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 70dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 7179e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattnerstatic void CheckStringInit(Expr *Str, QualType &DeclT, Sema &S) { 7279e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner // Get the length of the string as parsed. 7379e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner uint64_t StrLength = 7479e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner cast<ConstantArrayType>(Str->getType())->getSize().getZExtValue(); 7579e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner 761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7779e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner const ArrayType *AT = S.Context.getAsArrayType(DeclT); 78dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p14. We have an array of character type with unknown size 80dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // being initialized to a string literal. 81dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner llvm::APSInt ConstVal(32); 8219da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner ConstVal = StrLength; 83dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // Return a new array type (C99 6.7.8p22). 8446a617a792bfab0d9b1e057371ea3b9540802226John McCall DeclT = S.Context.getConstantArrayType(IAT->getElementType(), 8546a617a792bfab0d9b1e057371ea3b9540802226John McCall ConstVal, 8646a617a792bfab0d9b1e057371ea3b9540802226John McCall ArrayType::Normal, 0); 8719da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner return; 88dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner } 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 908718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman const ConstantArrayType *CAT = cast<ConstantArrayType>(AT); 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 928718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // C99 6.7.8p14. We have an array of character type with known size. However, 938718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // the size may be smaller or larger than the string we are initializing. 948718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // FIXME: Avoid truncation for 64-bit length strings. 958718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (StrLength-1 > CAT->getSize().getZExtValue()) 968718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman S.Diag(Str->getSourceRange().getBegin(), 978718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman diag::warn_initializer_string_for_char_array_too_long) 988718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman << Str->getSourceRange(); 991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1008718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // Set the type to the actual size that we are initializing. If we have 1018718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // something like: 1028718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // char x[1] = "foo"; 1038718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // then this will set the string literal's type to char[1]. 1048718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman Str->setType(DeclT); 105dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 106dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 107dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 108dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Semantic checking for initializer lists. 109dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 110dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 1119e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// @brief Semantic checking for initializer lists. 1129e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1139e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// The InitListChecker class contains a set of routines that each 1149e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// handle the initialization of a certain kind of entity, e.g., 1159e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arrays, vectors, struct/union types, scalars, etc. The 1169e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// InitListChecker itself performs a recursive walk of the subobject 1179e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure of the type to be initialized, while stepping through 1189e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// the initializer list one element at a time. The IList and Index 1199e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// parameters to each of the Check* routines contain the active 1209e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// (syntactic) initializer list and the index into that initializer 1219e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list that represents the current initializer. Each routine is 1229e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// responsible for moving that Index forward as it consumes elements. 1239e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1249e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// Each Check* routine also has a StructuredList/StructuredIndex 1259e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arguments, which contains the current the "structured" (semantic) 1269e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initializer list and the index into that initializer list where we 1279e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// are copying initializers as we map them over to the semantic 1289e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. Once we have completed our recursive walk of the subobject 1299e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure, we will have constructed a full semantic initializer 1309e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. 1319e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1329e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// C99 designators cause changes in the initializer list traversal, 1339e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// because they make the initialization "jump" into a specific 1349e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// subobject and then continue the initialization from that 1359e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// point. CheckDesignatedInitializer() recursively steps into the 1369e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// designated subobject and manages backing out the recursion to 1379e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initialize the subobjects after the one designated. 1388b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattnernamespace { 139c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorclass InitListChecker { 1400820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner Sema &SemaRef; 141c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool hadError; 142c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor std::map<InitListExpr *, InitListExpr *> SyntacticToSemantic; 143c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *FullyStructuredList; 1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1458ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckImplicitInitList(const InitializedEntity &Entity, 146987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, QualType T, 1479e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 148eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 149eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1508ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckExplicitInitList(const InitializedEntity &Entity, 15146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 1529e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 153eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 154eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1558ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckListElementTypes(const InitializedEntity &Entity, 15646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &DeclType, 1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 158c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1599e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 160eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 161eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1628ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckSubElementType(const InitializedEntity &Entity, 16346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType ElemType, 164c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1659e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1669e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1678ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckScalarType(const InitializedEntity &Entity, 16846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 169c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1709e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1719e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1728ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckReferenceType(const InitializedEntity &Entity, 1738ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 174930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 175930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 176930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex); 1778ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckVectorType(const InitializedEntity &Entity, 17846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, unsigned &Index, 1799e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1809e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1818ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckStructUnionTypes(const InitializedEntity &Entity, 1822bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, QualType DeclType, 1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator Field, 184c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 1859e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 186eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 187eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1888ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckArrayType(const InitializedEntity &Entity, 189784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 1901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::APSInt elementIndex, 191c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 1929e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1939e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1948ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson bool CheckDesignatedInitializer(const InitializedEntity &Entity, 1959a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, DesignatedInitExpr *DIE, 196711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &CurrentObjectType, 198c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor RecordDecl::field_iterator *NextField, 199c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor llvm::APSInt *NextElementIndex, 200c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 201c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 202c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &StructuredIndex, 203eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 204eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject); 205c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 206c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor QualType CurrentObjectType, 207c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 208c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned StructuredIndex, 209c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor SourceRange InitRange); 2109e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor void UpdateStructuredListElement(InitListExpr *StructuredList, 2119e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex, 212c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor Expr *expr); 213c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numArrayElements(QualType DeclType); 214c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numStructUnionElements(QualType DeclType); 215930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 216d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor void FillInValueInitForField(unsigned Init, FieldDecl *Field, 217d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 218d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 219cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor void FillInValueInitializations(const InitializedEntity &Entity, 220cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 221c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorpublic: 222cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker(Sema &S, const InitializedEntity &Entity, 223cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *IL, QualType &T); 224c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool HadError() { return hadError; } 225c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 226c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // @brief Retrieves the fully-structured initializer list used for 227c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // semantic analysis and code generation. 228c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } 229c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor}; 2308b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattner} // end anonymous namespace 23168355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 232d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregorvoid InitListChecker::FillInValueInitForField(unsigned Init, FieldDecl *Field, 233d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 234d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, 235d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor bool &RequiresSecondPass) { 236d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 237d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned NumInits = ILE->getNumInits(); 238d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializedEntity MemberEntity 239d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitializedEntity::InitializeMember(Field, &ParentEntity); 240d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 241d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // FIXME: We probably don't need to handle references 242d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // specially here, since value-initialization of references is 243d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // handled in InitializationSequence. 244d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->getType()->isReferenceType()) { 245d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // C++ [dcl.init.aggr]p9: 246d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // If an incomplete or empty initializer-list leaves a 247d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // member of reference type uninitialized, the program is 248d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // ill-formed. 249d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized) 250d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << Field->getType() 251d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << ILE->getSyntacticForm()->getSourceRange(); 252d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Field->getLocation(), 253d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor diag::note_uninit_reference_member); 254d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 255d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 256d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 257d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 258d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 259d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor true); 260d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationSequence InitSeq(SemaRef, MemberEntity, Kind, 0, 0); 261d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (!InitSeq) { 262d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitSeq.Diagnose(SemaRef, MemberEntity, Kind, 0, 0); 263d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 264d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 265d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 266d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 26760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult MemberInit 268d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitSeq.Perform(SemaRef, MemberEntity, Kind, 269d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Sema::MultiExprArg(SemaRef, 0, 0)); 270d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (MemberInit.isInvalid()) { 271d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 272d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 273d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 274d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 275d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) { 276d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Do nothing 277d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (Init < NumInits) { 278d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->setInit(Init, MemberInit.takeAs<Expr>()); 279d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitSeq.getKind() 280d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor == InitializationSequence::ConstructorInitialization) { 281d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Value-initialization requires a constructor call, so 282d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // extend the initializer list to include the constructor 283d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // call and make a note that we'll need to take another pass 284d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // through the initializer list. 285709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek ILE->updateInit(SemaRef.Context, Init, MemberInit.takeAs<Expr>()); 286d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass = true; 287d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 288d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitListExpr *InnerILE 289d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 290d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitializations(MemberEntity, InnerILE, 291d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass); 292d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor} 293d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 2944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Recursively replaces NULL values within the given initializer list 2954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// with expressions that perform value-initialization of the 2964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// appropriate type. 297cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregorvoid 298cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::FillInValueInitializations(const InitializedEntity &Entity, 299cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, 300cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool &RequiresSecondPass) { 3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((ILE->getType() != SemaRef.Context.VoidTy) && 302930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor "Should not have void type"); 30387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 30487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (ILE->getSyntacticForm()) 30587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor Loc = ILE->getSyntacticForm()->getSourceRange().getBegin(); 3061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3076217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) { 308d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion() && 309d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->getInitializedFieldInUnion()) 310d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(0, ILE->getInitializedFieldInUnion(), 311d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Entity, ILE, RequiresSecondPass); 312d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor else { 313d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned Init = 0; 314d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor for (RecordDecl::field_iterator 315d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field = RType->getDecl()->field_begin(), 316d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FieldEnd = RType->getDecl()->field_end(); 317d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field != FieldEnd; ++Field) { 318d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->isUnnamedBitfield()) 319d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor continue; 320d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 321d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 32287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 32387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 324d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(Init, *Field, Entity, ILE, RequiresSecondPass); 325d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 326cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 327cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 328d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ++Init; 329d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 330d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Only look at the first initialization of a union. 331d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion()) 332d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor break; 333d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 3344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 3354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 3371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType ElementType; 3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializedEntity ElementEntity = Entity; 34287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumInits = ILE->getNumInits(); 34387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumElements = NumInits; 3440820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) { 3454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = AType->getElementType(); 34687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) 34787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = CAType->getSize().getZExtValue(); 348cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 349cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 350183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) { 3514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = VType->getElementType(); 35287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = VType->getNumElements(); 353cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 354cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 3551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else 3564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = ILE->getType(); 3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 358cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 35987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor for (unsigned Init = 0; Init != NumElements; ++Init) { 36016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (hadError) 36116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return; 36216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 363d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement || 364d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson ElementEntity.getKind() == InitializedEntity::EK_VectorElement) 365cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity.setElementIndex(Init); 366cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 36787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 368cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 369cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor true); 370cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationSequence InitSeq(SemaRef, ElementEntity, Kind, 0, 0); 371cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!InitSeq) { 372cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitSeq.Diagnose(SemaRef, ElementEntity, Kind, 0, 0); 37387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor hadError = true; 37487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 37587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 37687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 37760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult ElementInit 378cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor = InitSeq.Perform(SemaRef, ElementEntity, Kind, 379cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor Sema::MultiExprArg(SemaRef, 0, 0)); 380cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (ElementInit.isInvalid()) { 38116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor hadError = true; 382cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 383cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 384cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 385cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (hadError) { 386cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Do nothing 387cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (Init < NumInits) { 388cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ILE->setInit(Init, ElementInit.takeAs<Expr>()); 389cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (InitSeq.getKind() 390cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor == InitializationSequence::ConstructorInitialization) { 391cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Value-initialization requires a constructor call, so 392cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // extend the initializer list to include the constructor 393cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // call and make a note that we'll need to take another pass 394cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // through the initializer list. 395709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek ILE->updateInit(SemaRef.Context, Init, ElementInit.takeAs<Expr>()); 396cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass = true; 397cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 398ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else if (InitListExpr *InnerILE 399cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 400cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(ElementEntity, InnerILE, RequiresSecondPass); 4014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 4024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 4034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 40468355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 405cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity, 406cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *IL, QualType &T) 4070820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner : SemaRef(S) { 4080cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff hadError = false; 409c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 410b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman unsigned newIndex = 0; 4114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 4121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FullyStructuredList 413ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor = getStructuredSubobjectInit(IL, newIndex, T, 0, 0, IL->getSourceRange()); 4148ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckExplicitInitList(Entity, IL, T, newIndex, 41546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson FullyStructuredList, newStructuredIndex, 416eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor /*TopLevelObject=*/true); 417c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 418cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!hadError) { 419cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool RequiresSecondPass = false; 420cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, RequiresSecondPass); 42116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (RequiresSecondPass && !hadError) 422cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, 423cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass); 424cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 4250cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4260cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4270cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numArrayElements(QualType DeclType) { 428638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // FIXME: use a proper constant 429638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman int maxElements = 0x7FFFFFFF; 430c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = 4310820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 4320cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = static_cast<int>(CAT->getSize().getZExtValue()); 4330cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 4340cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return maxElements; 4350cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4360cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4370cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numStructUnionElements(QualType DeclType) { 4386217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl(); 4394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor int InitializableMembers = 0; 4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (RecordDecl::field_iterator 44117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = structDecl->field_begin(), 44217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = structDecl->field_end(); 4434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Field != FieldEnd; ++Field) { 4444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if ((*Field)->getIdentifier() || !(*Field)->isBitField()) 4454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++InitializableMembers; 4464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 44739ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (structDecl->isUnion()) 448f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return std::min(InitializableMembers, 1); 449f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return InitializableMembers - structDecl->hasFlexibleArrayMember(); 4500cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4510cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4528ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity, 453987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, 4544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType T, unsigned &Index, 4554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 456eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 457eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 4580cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff int maxElements = 0; 4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4600cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (T->isArrayType()) 4610cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numArrayElements(T); 462fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor else if (T->isRecordType()) 4630cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numStructUnionElements(T); 464b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman else if (T->isVectorType()) 465183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall maxElements = T->getAs<VectorType>()->getNumElements(); 4660cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else 4670cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff assert(0 && "CheckImplicitInitList(): Illegal type"); 468b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 469402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman if (maxElements == 0) { 4700820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(ParentIList->getInit(Index)->getLocStart(), 471402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman diag::err_implicit_empty_initializer); 4724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 473402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman hadError = true; 474402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman return; 475402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman } 476402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman 4774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Build a structured initializer list corresponding to this subobject. 4784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredSubobjectInitList 4791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList, 4801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredIndex, 481ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor SourceRange(ParentIList->getInit(Index)->getSourceRange().getBegin(), 482ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor ParentIList->getSourceRange().getEnd())); 4834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredSubobjectInitIndex = 0; 4844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 4854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Check the element types and build the structural subobject. 48687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned StartIndex = Index; 487987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson CheckListElementTypes(Entity, ParentIList, T, 488987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 4891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredSubobjectInitList, 490eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredSubobjectInitIndex, 491eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 49287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1); 493a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor StructuredSubobjectInitList->setType(T); 494a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor 495ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor // Update the structured sub-object initializer so that it's ending 49687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor // range corresponds with the end of the last initializer it used. 49787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (EndIndex < ParentIList->getNumInits()) { 4981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation EndLoc 49987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor = ParentIList->getInit(EndIndex)->getSourceRange().getEnd(); 50087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor StructuredSubobjectInitList->setRBraceLoc(EndLoc); 50187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 5021e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner 5031e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner // Warn about missing braces. 5041e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner if (T->isArrayType() || T->isRecordType()) { 50547f164e15b9358b51ae65f8249d56842f8750767Tanya Lattner SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), 50647f164e15b9358b51ae65f8249d56842f8750767Tanya Lattner diag::warn_missing_braces) 5071e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner << StructuredSubobjectInitList->getSourceRange() 508849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateInsertion(StructuredSubobjectInitList->getLocStart(), 509849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor "{") 510849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateInsertion(SemaRef.PP.getLocForEndOfToken( 5111dcd061f7209f227d785043bd4a75e427d851abeTanya Lattner StructuredSubobjectInitList->getLocEnd()), 512849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor "}"); 5131e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner } 5140cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5150cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5168ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, 51746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 5184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 520eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 521eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 522c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman assert(IList->isExplicit() && "Illegal Implicit InitListExpr"); 5234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = StructuredList; 5244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList->setSyntacticForm(IList); 52546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true, 52646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson Index, StructuredList, StructuredIndex, TopLevelObject); 5276398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor QualType ExprTy = T.getNonLValueExprType(SemaRef.Context); 5286398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor IList->setType(ExprTy); 5296398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor StructuredList->setType(ExprTy); 530638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (hadError) 531638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 532c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 533638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (Index < IList->getNumInits()) { 534c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman // We have leftover initializers 535e540858b289b23653bcb23646f135729203635cbEli Friedman if (StructuredIndex == 1 && 536e540858b289b23653bcb23646f135729203635cbEli Friedman IsStringInit(StructuredList->getInit(0), T, SemaRef.Context)) { 5377c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers_in_char_array_initializer; 538e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 5397c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor DK = diag::err_excess_initializers_in_char_array_initializer; 540e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 541e540858b289b23653bcb23646f135729203635cbEli Friedman } 542bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman // Special-case 5430820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 544dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getInit(Index)->getSourceRange(); 545d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman } else if (!T->isIncompleteType()) { 546b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // Don't complain for incomplete types, since we'll get an error 547b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // elsewhere 548eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType CurrentObjectType = StructuredList->getType(); 5491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int initKind = 550eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isArrayType()? 0 : 551eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isVectorType()? 1 : 552eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isScalarType()? 2 : 553eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isUnionType()? 3 : 554eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 4; 5557c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 5567c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers; 557e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 558e540858b289b23653bcb23646f135729203635cbEli Friedman DK = diag::err_excess_initializers; 5590863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman hadError = true; 5600863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman } 5610863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman if (SemaRef.getLangOptions().OpenCL && initKind == 1) { 5620863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman DK = diag::err_excess_initializers; 563e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 564e540858b289b23653bcb23646f135729203635cbEli Friedman } 5657c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 5660820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 567eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << initKind << IList->getInit(Index)->getSourceRange(); 568c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 569c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 570cda25a977e4b7fe4e080b87586410eaeab7b62f6Eli Friedman 571759f25237864f3a3cc23eb01f0c0ce6edcc9342dEli Friedman if (T->isScalarType() && !TopLevelObject) 5720820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::warn_braces_around_scalar_init) 573a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor << IList->getSourceRange() 574849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocStart()) 575849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocEnd()); 5760cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5770cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5788ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckListElementTypes(const InitializedEntity &Entity, 57946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 5801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &DeclType, 58187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool SubobjectIsDesignatorContext, 5824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 584eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 585eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 586c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (DeclType->isScalarType()) { 58746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, DeclType, Index, 58846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 589c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (DeclType->isVectorType()) { 59046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckVectorType(Entity, IList, DeclType, Index, 59146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 592d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor } else if (DeclType->isAggregateType()) { 593d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor if (DeclType->isRecordType()) { 5946217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 5952bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson CheckStructUnionTypes(Entity, IList, DeclType, RD->field_begin(), 5964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubobjectIsDesignatorContext, Index, 597eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 598eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 59987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } else if (DeclType->isArrayType()) { 600f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor llvm::APSInt Zero( 6010820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()), 602f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor false); 603784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson CheckArrayType(Entity, IList, DeclType, Zero, 604784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson SubobjectIsDesignatorContext, Index, 6054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 606ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else 6074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor assert(0 && "Aggregate that isn't a structure or array?!"); 608613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff } else if (DeclType->isVoidType() || DeclType->isFunctionType()) { 609613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff // This type is invalid, issue a diagnostic. 6104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 6110820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 612d162584991885ab004a02573a73ce06422b921fcChris Lattner << DeclType; 613d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman hadError = true; 614930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isRecordType()) { 615930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init]p14: 616930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] If the class is an aggregate (8.5.1), and the initializer 617930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // is a brace-enclosed list, see 8.5.1. 618930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 619930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Note: 8.5.1 is handled below; here, we diagnose the case where 620930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // we have an initializer list and a destination type that is not 621930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an aggregate. 622930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // FIXME: In C++0x, this is yet another form of initialization. 6230820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 624930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType << IList->getSourceRange(); 625930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 626930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isReferenceType()) { 6278ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, DeclType, Index, 6288ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 629c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall } else if (DeclType->isObjCObjectType()) { 6304d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor SemaRef.Diag(IList->getLocStart(), diag::err_init_objc_class) 6314d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor << DeclType; 6324d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 6330cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } else { 6344d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 6354d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor << DeclType; 6364d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 6370cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 6380cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6390cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6408ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckSubElementType(const InitializedEntity &Entity, 64146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 6421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElemType, 6434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 6444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 6454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 6466fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 647c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) { 648c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman unsigned newIndex = 0; 6494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 6501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *newStructuredList 6514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor = getStructuredSubobjectInit(IList, Index, ElemType, 6524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex, 6534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubInitList->getSourceRange()); 65446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckExplicitInitList(Entity, SubInitList, ElemType, newIndex, 6554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor newStructuredList, newStructuredIndex); 6564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 6574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 65879e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner } else if (Expr *Str = IsStringInit(expr, ElemType, SemaRef.Context)) { 65979e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner CheckStringInit(Str, ElemType, SemaRef); 660f71ae8d8024561f92dd7916363e7a791684563ccChris Lattner UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 6614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 662c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (ElemType->isScalarType()) { 66346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, ElemType, Index, 66446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 665930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (ElemType->isReferenceType()) { 6668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, ElemType, Index, 6678ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 668b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman } else { 6690820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (SemaRef.getLangOptions().CPlusPlus) { 670930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 671930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // All implicit type conversions (clause 4) are considered when 672930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // initializing the aggregate member with an ini- tializer from 673930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an initializer-list. If the initializer can initialize a 674930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // member, the member is initialized. [...] 6751b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 6761b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson // FIXME: Better EqualLoc? 6771b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationKind Kind = 6781b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationKind::CreateCopy(expr->getLocStart(), SourceLocation()); 6791b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationSequence Seq(SemaRef, Entity, Kind, &expr, 1); 6801b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 6811b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson if (Seq) { 68260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = 6831b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Seq.Perform(SemaRef, Entity, Kind, 684ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall Sema::MultiExprArg(SemaRef, &expr, 1)); 6851b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson if (Result.isInvalid()) 686930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 6871b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 6881b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson UpdateStructuredListElement(StructuredList, StructuredIndex, 6891b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Result.takeAs<Expr>()); 690930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 691930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 692930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 693930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 694930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Fall through for subaggregate initialization 695930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p13: 697930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 698930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // The initializer for a structure or union object that has 699930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // automatic storage duration shall be either an initializer 700930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // list as described below, or a single expression that has 701930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // compatible structure or union type. In the latter case, the 702930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // initial value of the object, including unnamed members, is 703930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // that of the expression. 7046b5374f837f925d99b1a76bc2fe8c98c1698df7fEli Friedman if ((ElemType->isRecordType() || ElemType->isVectorType()) && 7058718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman SemaRef.Context.hasSameUnqualifiedType(expr->getType(), ElemType)) { 706930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 707930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 708930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 709930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 710930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 711930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Fall through for subaggregate initialization 712930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 713930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 714930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 7151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 716930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] Otherwise, if the member is itself a non-empty 717930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // subaggregate, brace elision is assumed and the initializer is 718930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // considered for the initialization of the first member of 719930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // the subaggregate. 720930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (ElemType->isAggregateType() || ElemType->isVectorType()) { 721987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList, 722930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor StructuredIndex); 723930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 724930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 725930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // We cannot initialize this element, so let 726930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // PerformCopyInitialization produce the appropriate diagnostic. 727ca755fe38f00d63363b3a3ac2a1ae6c1eb2957f9Anders Carlsson SemaRef.PerformCopyInitialization(Entity, SourceLocation(), 728ca755fe38f00d63363b3a3ac2a1ae6c1eb2957f9Anders Carlsson SemaRef.Owned(expr)); 729ca755fe38f00d63363b3a3ac2a1ae6c1eb2957f9Anders Carlsson IList->setInit(Index, 0); 730930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 731930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 732930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 733930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 734930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 735b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman} 736b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 7378ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckScalarType(const InitializedEntity &Entity, 73846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 7396fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned &Index, 7404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 7414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 7420cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 7436fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 74409865a903affa9c08687859d8de65470064c7bc2Eli Friedman if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) { 74509865a903affa9c08687859d8de65470064c7bc2Eli Friedman SemaRef.Diag(SubIList->getLocStart(), 74609865a903affa9c08687859d8de65470064c7bc2Eli Friedman diag::warn_many_braces_around_scalar_init) 74709865a903affa9c08687859d8de65470064c7bc2Eli Friedman << SubIList->getSourceRange(); 74809865a903affa9c08687859d8de65470064c7bc2Eli Friedman 74909865a903affa9c08687859d8de65470064c7bc2Eli Friedman CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList, 75009865a903affa9c08687859d8de65470064c7bc2Eli Friedman StructuredIndex); 751bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 75205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } else if (isa<DesignatedInitExpr>(expr)) { 7531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(expr->getSourceRange().getBegin(), 75405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor diag::err_designator_for_scalar_init) 75505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << DeclType << expr->getSourceRange(); 75605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 75705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Index; 7584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 75905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return; 7600cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 76105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 76260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = 763a1635d9b468709d47b6c533cc82bdabf34f560b8Eli Friedman SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 764a1635d9b468709d47b6c533cc82bdabf34f560b8Eli Friedman SemaRef.Owned(expr)); 765c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson 766b571924f32590f026889f227f03570e59e5c29b7Chandler Carruth Expr *ResultExpr = 0; 767c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson 768c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson if (Result.isInvalid()) 769bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman hadError = true; // types weren't compatible. 770c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson else { 771c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson ResultExpr = Result.takeAs<Expr>(); 772c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson 773c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson if (ResultExpr != expr) { 774c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson // The type was promoted, update initializer list. 775c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson IList->setInit(Index, ResultExpr); 776c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson } 77705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 7784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (hadError) 7794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 7804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 781c07b8c02f7c54631ab9a9bd7db9f031d3db170caAnders Carlsson UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 7820cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 783bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman } else { 7840820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_empty_scalar_initializer) 785dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getSourceRange(); 786bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman hadError = true; 7874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 7884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 789bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 7900cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 7910cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 7920cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 7938ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckReferenceType(const InitializedEntity &Entity, 7948ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 795930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 796930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 797930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex) { 798930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (Index < IList->getNumInits()) { 799930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor Expr *expr = IList->getInit(Index); 800930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (isa<InitListExpr>(expr)) { 8010820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 802930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType << IList->getSourceRange(); 803930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 804930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 805930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 806930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 8071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 808930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 80960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = 810a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 811a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson SemaRef.Owned(expr)); 812a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 813a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson if (Result.isInvalid()) 814930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 815a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 816a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson expr = Result.takeAs<Expr>(); 817a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson IList->setInit(Index, expr); 818a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 819930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (hadError) 820930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 821930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor else 822930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 823930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 824930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 825390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: It would be wonderful if we could point at the actual member. In 826390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // general, it would be useful to pass location information down the stack, 827390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // so that we know the location (or decl) of the "current object" being 828390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // initialized. 8291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getLocStart(), 830930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor diag::err_init_reference_member_uninitialized) 831930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType 832930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << IList->getSourceRange(); 833930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 834930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 835930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 836930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 837930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 838930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor} 839930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 8408ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckVectorType(const InitializedEntity &Entity, 84146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 8424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 8434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 8444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 8450cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 846183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VT = DeclType->getAs<VectorType>(); 8472ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned maxElements = VT->getNumElements(); 8482ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned numEltsInit = 0; 8490cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff QualType elementType = VT->getElementType(); 8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8512ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (!SemaRef.getLangOptions().OpenCL) { 8528ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 8538ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 8548ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8558ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { 8568ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Don't attempt to go past the end of the init list 8578ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (Index >= IList->getNumInits()) 8588ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson break; 85946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson 8608ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson ElementEntity.setElementIndex(Index); 8618ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 8628ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 8638ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson } 8642ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } else { 8658ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 8668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 8678ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8682ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman // OpenCL initializers allows vectors to be constructed from vectors. 8692ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman for (unsigned i = 0; i < maxElements; ++i) { 8702ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman // Don't attempt to go past the end of the init list 8712ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (Index >= IList->getNumInits()) 8722ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman break; 8738ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8748ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson ElementEntity.setElementIndex(Index); 8758ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 8762ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman QualType IType = IList->getInit(Index)->getType(); 8772ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (!IType->isVectorType()) { 8788ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 8792ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman StructuredList, StructuredIndex); 8802ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman ++numEltsInit; 8812ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } else { 8823e31552aed7c6e9c915bbc8d457ec84bb4a8d7e9Nate Begeman QualType VecType; 883183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *IVT = IType->getAs<VectorType>(); 8842ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned numIElts = IVT->getNumElements(); 8853e31552aed7c6e9c915bbc8d457ec84bb4a8d7e9Nate Begeman 8863e31552aed7c6e9c915bbc8d457ec84bb4a8d7e9Nate Begeman if (IType->isExtVectorType()) 8873e31552aed7c6e9c915bbc8d457ec84bb4a8d7e9Nate Begeman VecType = SemaRef.Context.getExtVectorType(elementType, numIElts); 8883e31552aed7c6e9c915bbc8d457ec84bb4a8d7e9Nate Begeman else 8893e31552aed7c6e9c915bbc8d457ec84bb4a8d7e9Nate Begeman VecType = SemaRef.Context.getVectorType(elementType, numIElts, 8903e31552aed7c6e9c915bbc8d457ec84bb4a8d7e9Nate Begeman IVT->getAltiVecSpecific()); 8918ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, VecType, Index, 8922ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman StructuredList, StructuredIndex); 8932ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman numEltsInit += numIElts; 8942ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 8952ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 8960cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 8971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 898f3afbeaa68624178a7a78cc20932351eb1f9f10dJohn Thompson // OpenCL requires all elements to be initialized. 8992ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (numEltsInit != maxElements) 900e12a779bbecb46b7287a87e0ff441e32147d10bbChris Lattner if (SemaRef.getLangOptions().OpenCL) 9012ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SemaRef.Diag(IList->getSourceRange().getBegin(), 9022ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman diag::err_vector_incorrect_num_initializers) 9032ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman << (numEltsInit < maxElements) << maxElements << numEltsInit; 9040cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 9050cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 9060cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 9078ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckArrayType(const InitializedEntity &Entity, 908784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 90987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt elementIndex, 9101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 9114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 9124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 9134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 9140cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // Check for the special-case of initializing an array with a string. 9150cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 91679e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner if (Expr *Str = IsStringInit(IList->getInit(Index), DeclType, 91779e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner SemaRef.Context)) { 91879e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner CheckStringInit(Str, DeclType, SemaRef); 9194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We place the string literal directly into the resulting 9204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initializer list. This is the only place where the structure 9214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // of the structured initializer list doesn't match exactly, 9224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // because doing so would involve allocating one character 9234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // constant for each string. 924f71ae8d8024561f92dd7916363e7a791684563ccChris Lattner UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 9250820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner StructuredList->resizeInits(SemaRef.Context, StructuredIndex); 9260cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 9270cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return; 9280cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 9290cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 930c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const VariableArrayType *VAT = 9310820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsVariableArrayType(DeclType)) { 932638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // Check for VLAs; in standard C it would be possible to check this 933638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // earlier, but I don't know where clang accepts VLAs (gcc accepts 934638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // them in all sorts of strange places). 9350820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(VAT->getSizeExpr()->getLocStart(), 936dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner diag::err_variable_object_no_init) 937dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << VAT->getSizeExpr()->getSourceRange(); 938638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman hadError = true; 9394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 9404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 941638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 942638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman } 943638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman 94405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We might know the maximum number of elements in advance. 9454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor llvm::APSInt maxElements(elementIndex.getBitWidth(), 9464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor elementIndex.isUnsigned()); 94705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool maxElementsKnown = false; 94805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (const ConstantArrayType *CAT = 9490820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 95005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = CAT->getSize(); 951f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor elementIndex.extOrTrunc(maxElements.getBitWidth()); 952e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 95305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElementsKnown = true; 95405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 95505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 9560820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner QualType elementType = SemaRef.Context.getAsArrayType(DeclType) 957c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner ->getElementType(); 95805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 95905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 96005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 96187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 96287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 96387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 96487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 96587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 96687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 96787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. elementIndex will be 96887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // updated to be the next array element we'll initialize. 9699a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 9704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, 0, &elementIndex, Index, 971eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, true, 972eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) { 97305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 97487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor continue; 97587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 97687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 977f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor if (elementIndex.getBitWidth() > maxElements.getBitWidth()) 978f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor maxElements.extend(elementIndex.getBitWidth()); 979f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor else if (elementIndex.getBitWidth() < maxElements.getBitWidth()) 980f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor elementIndex.extend(maxElements.getBitWidth()); 981e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 982f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor 98387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If the array is of incomplete type, keep track of the number of 98487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // elements in the initializer. 98587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 98687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor maxElements = elementIndex; 98705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 98805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 98905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 99005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 99105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we know the maximum number of elements, and we've already 99205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // hit it, stop consuming elements in the initializer list. 99305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElementsKnown && elementIndex == maxElements) 9940cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff break; 99505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 9968ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 997784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex, 9988ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson Entity); 9998ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Check this element. 10008ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 10018ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 100205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++elementIndex; 100305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 100405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If the array is of incomplete type, keep track of the number of 100505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // elements in the initializer. 100605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 100705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = elementIndex; 10080cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1009587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman if (!hadError && DeclType->isIncompleteArrayType()) { 10100cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // If this is an incomplete array type, the actual type needs to 1011396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // be calculated here. 1012e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned()); 101305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElements == Zero) { 1014396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // Sizing an array implicitly to zero is not allowed by ISO C, 1015396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // but is supported by GNU. 10160820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 1017396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar diag::ext_typecheck_zero_array_size); 10180cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1019396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar 10201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements, 1021396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar ArrayType::Normal, 0); 10220cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 10230cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 10240cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 10258ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, 10262bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, 10271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType DeclType, 102887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator Field, 10291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 10304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 10314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 1032eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 1033eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 10346217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl* structDecl = DeclType->getAs<RecordType>()->getDecl(); 10351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1036b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // If the record is invalid, some of it's members are invalid. To avoid 1037b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // confusion, we forgo checking the intializer for the entire record. 1038b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman if (structDecl->isInvalidDecl()) { 1039b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman hadError = true; 1040b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman return; 10411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 10423498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 10433498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (DeclType->isUnionType() && IList->getNumInits() == 0) { 10443498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor // Value-initialize the first named member of the union. 10456217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 104617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator FieldEnd = RD->field_end(); 10473498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor Field != FieldEnd; ++Field) { 10483498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (Field->getDeclName()) { 10493498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 10503498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor break; 10513498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10523498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10533498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return; 10543498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10553498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 105605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If structDecl is a forward declaration, this loop won't do 105705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // anything except look at designated initializers; That's okay, 105805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // because an error should get printed out elsewhere. It might be 105905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // worthwhile to skip over the rest of the initializer, though. 10606217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 106117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RecordDecl::field_iterator FieldEnd = RD->field_end(); 1062dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor bool InitializedSomething = false; 106380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall bool CheckForMissingFields = true; 106405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 106505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 106605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 106705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 106887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 106987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 107087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 107187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 107287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 107387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 107487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. Field will be updated to 107587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the next field that we'll be initializing. 10769a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 10774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, &Field, 0, Index, 1078eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 1079eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, TopLevelObject)) 108005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 108105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1082dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 108380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 108480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Disable check for missing fields when designators are used. 108580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // This matches gcc behaviour. 108680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall CheckForMissingFields = false; 108705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 108805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 108905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 109005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field == FieldEnd) { 109105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We've run out of fields. We're done. 109244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor break; 109305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 109444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1095dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor // We've already initialized a member of a union. We're done. 1096dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor if (InitializedSomething && DeclType->isUnionType()) 1097dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor break; 1098dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor 109905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we've hit the flexible array member at the end, we're done. 110005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field->getType()->isIncompleteArrayType()) 1101b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman break; 110244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 11030bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (Field->isUnnamedBitfield()) { 11044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Don't initialize unnamed bitfields, e.g. "int : 20;" 110505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 1106b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman continue; 11070cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 110844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 11098ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 11108ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 11118ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 11128ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 1113dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 11140bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 11150bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (DeclType->isUnionType()) { 11160bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor // Initialize the first field within the union. 11170bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 11180bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 111905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 112005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 11210cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 112244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 112380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Emit warnings for missing struct field initializers. 11248e19890c329279c5ac35ab71a35423d429d80165Douglas Gregor if (InitializedSomething && CheckForMissingFields && Field != FieldEnd && 112580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall !Field->getType()->isIncompleteArrayType() && !DeclType->isUnionType()) { 112680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // It is possible we have one or more unnamed bitfields remaining. 112780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Find first (if any) named field and emit warning. 112880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall for (RecordDecl::field_iterator it = Field, end = RD->field_end(); 112980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall it != end; ++it) { 113080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall if (!it->isUnnamedBitfield()) { 113180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall SemaRef.Diag(IList->getSourceRange().getEnd(), 113280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall diag::warn_missing_field_initializers) << it->getName(); 113380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall break; 113480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 113580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 113680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 113780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() || 1139a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor Index >= IList->getNumInits()) 1140eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return; 1141eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1142eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Handle GNU flexible array initializers. 11431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!TopLevelObject && 1144a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor (!isa<InitListExpr>(IList->getInit(Index)) || 1145a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor cast<InitListExpr>(IList->getInit(Index))->getNumInits() > 0)) { 11461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getInit(Index)->getSourceRange().getBegin(), 1147eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_nonempty) 1148eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << IList->getInit(Index)->getSourceRange().getBegin(); 11490820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1150eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1151eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor hadError = true; 1152a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor ++Index; 1153a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor return; 1154a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor } else { 11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getInit(Index)->getSourceRange().getBegin(), 1156a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor diag::ext_flexible_array_init) 1157a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor << IList->getInit(Index)->getSourceRange().getBegin(); 1158a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1159a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor << *Field; 1160eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1161eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 11628ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 11638ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1164987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson 11658ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (isa<InitListExpr>(IList->getInit(Index))) 11668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 11678ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 11688ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson else 11698ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index, 1170987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson StructuredList, StructuredIndex); 11710cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 11720cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1173ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Expand a field designator that refers to a member of an 1174ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// anonymous struct or union into a series of field designators that 1175ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// refers to the field within the appropriate subobject. 1176ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// 1177ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// Field/FieldIndex will be updated to point to the (new) 1178ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// currently-designated field. 1179ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorstatic void ExpandAnonymousFieldDesignator(Sema &SemaRef, 11801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 11811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned DesigIdx, 1182ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *Field, 1183ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor RecordDecl::field_iterator &FieldIter, 1184ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor unsigned &FieldIndex) { 1185ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor typedef DesignatedInitExpr::Designator Designator; 1186ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1187ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the path from the current object to the member of the 1188ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // anonymous struct/union (backwards). 1189ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor llvm::SmallVector<FieldDecl *, 4> Path; 1190ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SemaRef.BuildAnonymousStructUnionMemberPath(Field, Path); 11911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1192ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the replacement designators. 1193ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor llvm::SmallVector<Designator, 4> Replacements; 1194ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor for (llvm::SmallVector<FieldDecl *, 4>::reverse_iterator 1195ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FI = Path.rbegin(), FIEnd = Path.rend(); 1196ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FI != FIEnd; ++FI) { 1197ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (FI + 1 == FIEnd) 11981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Replacements.push_back(Designator((IdentifierInfo *)0, 1199ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getDotLoc(), 1200ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getFieldLoc())); 1201ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor else 1202ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.push_back(Designator((IdentifierInfo *)0, SourceLocation(), 1203ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SourceLocation())); 1204ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.back().setField(*FI); 1205ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1206ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1207ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Expand the current designator into the set of replacement 1208ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // designators, so we have a full subobject path down to where the 1209ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // member of the anonymous struct/union is actually stored. 1210319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0], 1211ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor &Replacements[0] + Replacements.size()); 12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1213ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Update FieldIter/FieldIndex; 1214ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor RecordDecl *Record = cast<RecordDecl>(Path.back()->getDeclContext()); 121517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldIter = Record->field_begin(); 1216ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldIndex = 0; 121717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator FEnd = Record->field_end(); 1218ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldIter != FEnd; ++FieldIter) { 1219ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (FieldIter->isUnnamedBitfield()) 1220ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor continue; 1221ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1222ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (*FieldIter == Path.back()) 1223ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return; 1224ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1225ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor ++FieldIndex; 1226ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1227ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1228ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor assert(false && "Unable to find anonymous struct/union field"); 1229ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 1230ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 123105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Check the well-formedness of a C99 designated initializer. 123205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 123305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Determines whether the designated initializer @p DIE, which 123405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// resides at the given @p Index within the initializer list @p 123505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// IList, is well-formed for a current object of type @p DeclType 123605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// (C99 6.7.8). The actual subobject that this designator refers to 12371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// within the current subobject is returned in either 12384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @p NextField or @p NextElementIndex (whichever is appropriate). 123905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 124005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param IList The initializer list in which this designated 124105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// initializer occurs. 124205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 1243711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DIE The designated initializer expression. 1244711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// 1245711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DesigIdx The index of the current designator. 124605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 124705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param DeclType The type of the "current object" (C99 6.7.8p17), 124805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// into which the designation in @p DIE should refer. 124905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 125087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextField If non-NULL and the first designator in @p DIE is 125187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// a field, this will be set to the field declaration corresponding 125287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// to the field named by the designator. 125305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 125487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextElementIndex If non-NULL and the first designator in @p 125587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// DIE is an array designator or GNU array-range designator, this 125687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// will be set to the last index initialized by this designator. 125705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 125805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param Index Index into @p IList where the designated initializer 125905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @p DIE occurs. 126005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 12614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @param StructuredList The initializer list expression that 12624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// describes all of the subobject initializers in the order they'll 12634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// actually be initialized. 12644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 126505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @returns true if there was an error, false otherwise. 12661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 12678ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders CarlssonInitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 12689a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, 12691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 1270711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 127187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor QualType &CurrentObjectType, 127287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator *NextField, 127387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt *NextElementIndex, 12744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 12754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 127634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned &StructuredIndex, 1277eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 1278eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 1279711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if (DesigIdx == DIE->size()) { 128087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the actual initialization for the designated object type. 128187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 12826fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 12836fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Temporarily remove the designator expression from the 12846fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // initializer list that the child calls see, so that we don't try 12856fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // to re-process the designator. 12866fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned OldIndex = Index; 12876fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE->getInit()); 12886fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 12899a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson CheckSubElementType(Entity, IList, CurrentObjectType, Index, 12904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 12916fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 12926fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Restore the designated initializer expression in the syntactic 12936fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // form of the initializer list. 12946fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor if (IList->getInit(OldIndex) != DIE->getInit()) 12956fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor DIE->setInit(IList->getInit(OldIndex)); 12966fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE); 12976fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 129887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 129987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 130005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1301711997184366d584c9c437102cae1e9d9927b986Douglas Gregor bool IsFirstDesignator = (DesigIdx == 0); 13021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((IsFirstDesignator || StructuredList) && 13034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor "Need a non-designated initializer list to start from"); 13044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1305711997184366d584c9c437102cae1e9d9927b986Douglas Gregor DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx); 13064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Determine the structural initializer list that corresponds to the 13074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // current subobject. 13084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList = IsFirstDesignator? SyntacticToSemantic[IList] 13091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : getStructuredSubobjectInit(IList, Index, CurrentObjectType, 1310ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor StructuredList, StructuredIndex, 13114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange(D->getStartLocation(), 13124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DIE->getSourceRange().getEnd())); 13134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor assert(StructuredList && "Expected a structured initializer list"); 13144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 131587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (D->isFieldDesignator()) { 131687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p7: 131787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 131887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 131987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 132087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // . identifier 132187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 132287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have 132387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // structure or union type and the identifier shall be the 13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // name of a member of that type. 13256217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = CurrentObjectType->getAs<RecordType>(); 132687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!RT) { 132787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation Loc = D->getDotLoc(); 132887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (Loc.isInvalid()) 132987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Loc = D->getFieldLoc(); 13300820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Loc, diag::err_field_designator_non_aggr) 13310820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner << SemaRef.getLangOptions().CPlusPlus << CurrentObjectType; 133287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 133387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 133487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 133587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 13364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Note: we perform a linear search of the fields here, despite 13374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the fact that we have a faster lookup method, because we always 13384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // need to compute the field's index. 1339ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *KnownField = D->getField(); 134087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IdentifierInfo *FieldName = D->getFieldName(); 13414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned FieldIndex = 0; 13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator 134317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = RT->getDecl()->field_begin(), 134417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RT->getDecl()->field_end(); 13454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (; Field != FieldEnd; ++Field) { 13464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field->isUnnamedBitfield()) 13474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor continue; 13484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1349ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (KnownField == *Field || Field->getIdentifier() == FieldName) 13504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor break; 13514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 13524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 135387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 135487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 13554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field == FieldEnd) { 1356ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // There was no normal field in the struct with the designated 1357ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // name. Perform another lookup for this name, which may find 1358ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // something that we can't designate (e.g., a member function), 1359ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // may find nothing, or may find a member of an anonymous 13601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // struct/union. 136117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName); 1362c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldDecl *ReplacementField = 0; 13634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Lookup.first == Lookup.second) { 1364c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Name lookup didn't find anything. Determine whether this 1365c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // was a typo for another field name. 1366c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor LookupResult R(SemaRef, FieldName, D->getFieldLoc(), 1367c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Sema::LookupMemberName); 1368aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (SemaRef.CorrectTypo(R, /*Scope=*/0, /*SS=*/0, RT->getDecl(), false, 1369aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Sema::CTC_NoKeywords) && 1370c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor (ReplacementField = R.getAsSingle<FieldDecl>()) && 1371c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ReplacementField->getDeclContext()->getLookupContext() 1372c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ->Equals(RT->getDecl())) { 1373c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), 1374c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor diag::err_field_designator_unknown_suggest) 1375c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType << R.getLookupName() 1376849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateReplacement(D->getFieldLoc(), 1377849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor R.getLookupName().getAsString()); 137867dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor SemaRef.Diag(ReplacementField->getLocation(), 137967dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor diag::note_previous_decl) 138067dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor << ReplacementField->getDeclName(); 1381c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else { 1382c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown) 1383c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType; 1384c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++Index; 1385c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor return true; 1386c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1387c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else if (!KnownField) { 1388c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Determine whether we found a field at all. 1389c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ReplacementField = dyn_cast<FieldDecl>(*Lookup.first); 1390c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1391c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1392c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!ReplacementField) { 13934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Name lookup found something, but it wasn't a field. 13940820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield) 13954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << FieldName; 13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag((*Lookup.first)->getLocation(), 13974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_field_designator_found); 1398ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman ++Index; 1399ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman return true; 1400ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1401c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1402c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!KnownField && 1403c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor cast<RecordDecl>((ReplacementField)->getDeclContext()) 1404c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ->isAnonymousStructOrUnion()) { 1405c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Handle an field designator that refers to a member of an 1406c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // anonymous struct or union. 1407c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, 1408c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ReplacementField, 1409c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field, FieldIndex); 1410c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor D = DIE->getDesignator(DesigIdx); 1411c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else if (!KnownField) { 1412c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // The replacement field comes from typo correction; find it 1413c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // in the list of fields. 1414c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldIndex = 0; 1415c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field = RT->getDecl()->field_begin(); 1416c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor for (; Field != FieldEnd; ++Field) { 1417c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (Field->isUnnamedBitfield()) 1418c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor continue; 1419c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1420c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (ReplacementField == *Field || 1421c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field->getIdentifier() == ReplacementField->getIdentifier()) 1422c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor break; 1423c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1424c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++FieldIndex; 1425c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1426c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1427ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } else if (!KnownField && 1428ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor cast<RecordDecl>((*Field)->getDeclContext()) 14294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ->isAnonymousStructOrUnion()) { 1430ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, *Field, 1431ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Field, FieldIndex); 1432ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor D = DIE->getDesignator(DesigIdx); 143387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 14344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 14354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // All of the fields of a union are located at the same place in 14364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the initializer list. 14370bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (RT->getDecl()->isUnion()) { 14384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor FieldIndex = 0; 14390bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 14400bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 14414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 144287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Update the designator with the field declaration. 14434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor D->setField(*Field); 14441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 14464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this field. 14474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (FieldIndex >= StructuredList->getNumInits()) 14480820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1); 14494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1450eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // This designator names a flexible array member. 1451eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Field->getType()->isIncompleteArrayType()) { 1452eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool Invalid = false; 1453711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if ((DesigIdx + 1) != DIE->size()) { 1454eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // We can't designate an object within the flexible array 1455eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // member (because GCC doesn't allow it). 14561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr::Designator *NextD 1457711997184366d584c9c437102cae1e9d9927b986Douglas Gregor = DIE->getDesignator(DesigIdx + 1); 14581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(NextD->getStartLocation(), 1459eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_designator_into_flexible_array_member) 14601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << SourceRange(NextD->getStartLocation(), 1461eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor DIE->getSourceRange().getEnd()); 14620820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1463eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1464eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1465eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1466eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1467eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (!hadError && !isa<InitListExpr>(DIE->getInit())) { 1468eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // The initializer is not an initializer list. 14690820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(DIE->getInit()->getSourceRange().getBegin(), 1470eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_needs_braces) 1471eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << DIE->getInit()->getSourceRange(); 14720820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1473eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1474eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1475eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1476eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1477eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Handle GNU flexible array initializers. 14781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Invalid && !TopLevelObject && 1479eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor cast<InitListExpr>(DIE->getInit())->getNumInits() > 0) { 14801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(DIE->getSourceRange().getBegin(), 1481eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_nonempty) 1482eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << DIE->getSourceRange().getBegin(); 14830820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1484eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1485eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1486eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1487eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1488eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Invalid) { 1489eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Index; 1490eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1491eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1492eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1493eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Initialize the array. 1494eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool prevHadError = hadError; 1495eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1496eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned OldIndex = Index; 1497eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(Index, DIE->getInit()); 14988ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 14998ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 15008ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 15018ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 1502eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, newStructuredIndex); 15038ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 1504eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(OldIndex, DIE); 1505eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (hadError && !prevHadError) { 1506eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Field; 1507eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++FieldIndex; 1508eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (NextField) 1509eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor *NextField = Field; 1510eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredIndex = FieldIndex; 1511eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1512eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1513eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } else { 1514eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Recurse to check later designated subobjects. 1515eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType FieldType = (*Field)->getType(); 1516eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 15179a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 15189a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity MemberEntity = 15198ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 15208ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1, 15219a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson FieldType, 0, 0, Index, 15229a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, newStructuredIndex, 1523eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, false)) 1524eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1525eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 152687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 152787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Find the position of the next field to be initialized in this 152887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // subobject. 152987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Field; 15304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 153105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 153287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 153387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this struct/class/union subobject. 153487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 153587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextField) 153687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor *NextField = Field; 15374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = FieldIndex; 153887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 153987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 154005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 154134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 154234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 154334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1544ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // We've already initialized something in the union; we're done. 1545ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (RT->getDecl()->isUnion()) 1546ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return hadError; 1547ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 154887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining fields within this class/struct/union subobject. 154987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 15502bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson 15518ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckStructUnionTypes(Entity, IList, CurrentObjectType, Field, false, Index, 15524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, FieldIndex); 155387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 155487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 155505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 155687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p6: 155787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 155887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 155987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 156087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ] 156187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 156287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have array 156387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // type and the expression shall be an integer constant 156487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // expression. If the array is of unknown size, any 156587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // nonnegative value is valid. 156687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 156787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Additionally, cope with the GNU extension that permits 156887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designators of the form 156987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 157087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ... constant-expression ] 15710820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType); 157287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!AT) { 15730820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array) 157487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor << CurrentObjectType; 157587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 157687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 157787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 157805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 157987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Expr *IndexExpr = 0; 158034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor llvm::APSInt DesignatedStartIndex, DesignatedEndIndex; 158134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (D->isArrayDesignator()) { 158287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayIndex(*D); 15833bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedStartIndex = IndexExpr->EvaluateAsInt(SemaRef.Context); 158434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex = DesignatedStartIndex; 158534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 158687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(D->isArrayRangeDesignator() && "Need array-range designator"); 15873bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 15881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedStartIndex = 15903bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DIE->getArrayRangeStart(*D)->EvaluateAsInt(SemaRef.Context); 15911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedEndIndex = 15923bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DIE->getArrayRangeEnd(*D)->EvaluateAsInt(SemaRef.Context); 159387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayRangeEnd(*D); 159434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 15953bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (DesignatedStartIndex.getZExtValue() !=DesignatedEndIndex.getZExtValue()) 1596a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor FullyStructuredList->sawArrayRangeDesignator(); 159787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 159805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 159987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (isa<ConstantArrayType>(AT)) { 160087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false); 160134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth()); 160234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned()); 160334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth()); 160434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned()); 160534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex >= MaxElements) { 16060820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IndexExpr->getSourceRange().getBegin(), 160787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor diag::err_array_designator_too_large) 160834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor << DesignatedEndIndex.toString(10) << MaxElements.toString(10) 160987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor << IndexExpr->getSourceRange(); 161087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 161187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 161205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 161334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 161434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Make sure the bit-widths and signedness match. 161534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedStartIndex.getBitWidth() > DesignatedEndIndex.getBitWidth()) 161634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.extend(DesignatedStartIndex.getBitWidth()); 16173bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner else if (DesignatedStartIndex.getBitWidth() < 16183bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedEndIndex.getBitWidth()) 161934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.extend(DesignatedEndIndex.getBitWidth()); 162034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(true); 162134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(true); 162205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 16231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 16254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this array element. 162634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits()) 16271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredList->resizeInits(SemaRef.Context, 162834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.getZExtValue() + 1); 162934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 163034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Repeatedly perform subobject initializations in the range 163134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // [DesignatedStartIndex, DesignatedEndIndex]. 163234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 163334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next designator 163434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned ElementIndex = DesignatedStartIndex.getZExtValue(); 163534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned OldIndex = Index; 16369a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 16379a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity ElementEntity = 16388ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 16399a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 164034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor while (DesignatedStartIndex <= DesignatedEndIndex) { 164134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Recurse to check later designated subobjects. 164234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor QualType ElementType = AT->getElementType(); 164334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor Index = OldIndex; 16449a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 16459a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementEntity.setElementIndex(ElementIndex); 16468ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (CheckDesignatedInitializer(ElementEntity, IList, DIE, DesigIdx + 1, 16479a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementType, 0, 0, Index, 16489a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, ElementIndex, 1649eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor (DesignatedStartIndex == DesignatedEndIndex), 1650eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) 165134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return true; 165287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 165334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next index in the array that we'll be initializing. 165434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ++DesignatedStartIndex; 165534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ElementIndex = DesignatedStartIndex.getZExtValue(); 165634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } 165787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 165887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 165987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this array subobject. 166087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 166187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextElementIndex) 166234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor *NextElementIndex = DesignatedStartIndex; 16634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = ElementIndex; 166487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 166587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 16661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 166734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 166834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 166934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 167087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining elements within this array subobject. 167105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool prevHadError = hadError; 16728ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex, 1673784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 16744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, ElementIndex); 16751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return hadError && !prevHadError; 167605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 167705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 16784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// Get the structured initializer list for a subobject of type 16794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// @p CurrentObjectType. 16804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListExpr * 16814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 16824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType CurrentObjectType, 16834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 16844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredIndex, 16854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange InitRange) { 16864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *ExistingInit = 0; 16874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 16884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = SyntacticToSemantic[IList]; 16894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else if (StructuredIndex < StructuredList->getNumInits()) 16904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = StructuredList->getInit(StructuredIndex); 16911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit)) 16934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 16944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 16954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (ExistingInit) { 16964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We are creating an initializer list that initializes the 16974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobjects of the current object, but there was already an 16984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initialization that completely initialized the current 16994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject, e.g., by a compound literal: 17001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 17014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X { int a, b; }; 17024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 }; 17031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 17044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Here, xs[0].a == 0 and xs[0].b == 3, since the second, 17054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // designated initializer re-initializes the whole 17064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject [0], overwriting previous initializers. 17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(InitRange.getBegin(), 1708ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor diag::warn_subobject_initializer_overrides) 17094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << InitRange; 17101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(ExistingInit->getSourceRange().getBegin(), 17114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 171254f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 17134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << ExistingInit->getSourceRange(); 17144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 17154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *Result 1717709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek = new (SemaRef.Context) InitListExpr(SemaRef.Context, 1718709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitRange.getBegin(), 0, 0, 1719ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek InitRange.getEnd()); 1720ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor 17216398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor Result->setType(CurrentObjectType.getNonLValueExprType(SemaRef.Context)); 17224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1723fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Pre-allocate storage for the structured initializer list. 1724fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor unsigned NumElements = 0; 172508457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor unsigned NumInits = 0; 172608457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (!StructuredList) 172708457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = IList->getNumInits(); 172808457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor else if (Index < IList->getNumInits()) { 172908457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) 173008457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = SubList->getNumInits(); 173108457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor } 173208457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor 17331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ArrayType *AType 1734fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor = SemaRef.Context.getAsArrayType(CurrentObjectType)) { 1735fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) { 1736fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = CAType->getSize().getZExtValue(); 1737fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Simple heuristic so that we don't allocate a very large 1738fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // initializer with many empty entries at the end. 173908457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (NumInits && NumElements > NumInits) 1740fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 0; 1741fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 1742183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) 1743fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = VType->getNumElements(); 17446217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const RecordType *RType = CurrentObjectType->getAs<RecordType>()) { 1745fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor RecordDecl *RDecl = RType->getDecl(); 1746fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (RDecl->isUnion()) 1747fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 1; 1748fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor else 17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumElements = std::distance(RDecl->field_begin(), 175017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RDecl->field_end()); 1751fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 1752fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 175308457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (NumElements < NumInits) 1754fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = IList->getNumInits(); 1755fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 1756709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Result->reserveInits(SemaRef.Context, NumElements); 1757fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 17584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Link this new initializer list into the structured initializer 17594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // lists. 17604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (StructuredList) 1761709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result); 17624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else { 17634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Result->setSyntacticForm(IList); 17644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = Result; 17654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 17664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 17684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 17694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Update the initializer at index @p StructuredIndex within the 17714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// structured initializer list to the value @p expr. 17724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregorvoid InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, 17734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex, 17744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *expr) { 17754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // No structured initializer list to update 17764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 17774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 17784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1779709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, 1780709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredIndex, expr)) { 17814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // This initializer overwrites a previous initializer. Warn. 17821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(expr->getSourceRange().getBegin(), 17834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::warn_initializer_overrides) 17844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << expr->getSourceRange(); 17851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(PrevInit->getSourceRange().getBegin(), 17864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 178754f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 17884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << PrevInit->getSourceRange(); 17894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 17901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 17924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 17934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 179405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Check that the given Index expression is a valid array designator 179505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// value. This is essentailly just a wrapper around 17963bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner/// VerifyIntegerConstantExpression that also checks for negative values 179705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// and produces a reasonable diagnostic if there is a 179805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// failure. Returns true if there was an error, false otherwise. If 179905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// everything went okay, Value will receive the value of the constant 180005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// expression. 18011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool 18023bf6893b77c30cb774100e0fa7ae029331675ec1Chris LattnerCheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) { 180305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation Loc = Index->getSourceRange().getBegin(); 180405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 180505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Make sure this is an integer constant expression. 18063bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (S.VerifyIntegerConstantExpression(Index, &Value)) 18073bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return true; 18083bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 18093bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (Value.isSigned() && Value.isNegative()) 18103bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return S.Diag(Loc, diag::err_array_designator_negative) 181105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << Value.toString(10) << Index->getSourceRange(); 181205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 181353d3d8e0662197f7245d8f5ff697a72a2b4b3f54Douglas Gregor Value.setIsUnsigned(true); 181405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return false; 181505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 181605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 181760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, 181805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation Loc, 1819eeae8f072748affce25ab4064982626361293390Douglas Gregor bool GNUSyntax, 182060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Init) { 182105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef DesignatedInitExpr::Designator ASTDesignator; 182205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 182305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool Invalid = false; 182405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::SmallVector<ASTDesignator, 32> Designators; 182505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::SmallVector<Expr *, 32> InitExpressions; 182605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 182705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Build designators and check array designator expressions. 182805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) { 182905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor const Designator &D = Desig.getDesignator(Idx); 183005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor switch (D.getKind()) { 183105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::FieldDesignator: 18321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(), 183305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getFieldLoc())); 183405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 183505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 183605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayDesignator: { 183705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Index = static_cast<Expr *>(D.getArrayIndex()); 183805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt IndexValue; 18399ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (!Index->isTypeDependent() && 18409ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor !Index->isValueDependent() && 18419ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, Index, IndexValue)) 184205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 184305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else { 184405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 18451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 184605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getRBracketLoc())); 184705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor InitExpressions.push_back(Index); 184805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 184905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 185005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 185105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 185205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayRangeDesignator: { 185305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart()); 185405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd()); 185505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt StartValue; 185605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt EndValue; 18579ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool StartDependent = StartIndex->isTypeDependent() || 18589ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor StartIndex->isValueDependent(); 18599ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool EndDependent = EndIndex->isTypeDependent() || 18609ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor EndIndex->isValueDependent(); 18619ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if ((!StartDependent && 18629ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, StartIndex, StartValue)) || 18639ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor (!EndDependent && 18649ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, EndIndex, EndValue))) 186505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 1866d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else { 1867d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor // Make sure we're comparing values with the same bit width. 18689ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (StartDependent || EndDependent) { 18699ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Nothing to compute. 18709ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (StartValue.getBitWidth() > EndValue.getBitWidth()) 1871d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor EndValue.extend(StartValue.getBitWidth()); 1872d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else if (StartValue.getBitWidth() < EndValue.getBitWidth()) 1873d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor StartValue.extend(EndValue.getBitWidth()); 1874d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor 1875c4bb7bfe8328f79004517dd268f6146c8066c205Douglas Gregor if (!StartDependent && !EndDependent && EndValue < StartValue) { 1876d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range) 18771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << StartValue.toString(10) << EndValue.toString(10) 1878d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor << StartIndex->getSourceRange() << EndIndex->getSourceRange(); 1879d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Invalid = true; 1880d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } else { 1881d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 18821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 1883d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getEllipsisLoc(), 1884d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getRBracketLoc())); 1885d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(StartIndex); 1886d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(EndIndex); 1887d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } 188805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 188905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 189005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 189105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 189205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 189305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 189405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Invalid || Init.isInvalid()) 189505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return ExprError(); 189605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 189705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Clear out the expressions within the designation. 189805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Desig.ClearExprs(*this); 189905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 190005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor DesignatedInitExpr *DIE 1901beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad = DesignatedInitExpr::Create(Context, 1902beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Designators.data(), Designators.size(), 1903beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad InitExpressions.data(), InitExpressions.size(), 1904e9146f2e9f1c4e281544e8c080934c72d41012caAnders Carlsson Loc, GNUSyntax, Init.takeAs<Expr>()); 190505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return Owned(DIE); 190605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 1907c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 1908cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregorbool Sema::CheckInitList(const InitializedEntity &Entity, 1909cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *&InitList, QualType &DeclType) { 1910cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker CheckInitList(*this, Entity, InitList, DeclType); 1911c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor if (!CheckInitList.HadError()) 1912c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitList = CheckInitList.getFullyStructuredList(); 1913c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 1914c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor return CheckInitList.HadError(); 1915c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor} 191687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 1917cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 1918cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor// Initialization entity 1919cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 192039da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor 1921cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index, 1922cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor const InitializedEntity &Parent) 1923d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson : Parent(&Parent), Index(Index) 1924cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor{ 1925d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) { 1926d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_ArrayElement; 1927d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = AT->getElementType(); 1928d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } else { 1929d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_VectorElement; 1930d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = Parent.getType()->getAs<VectorType>()->getElementType(); 1931d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } 193220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 193320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 193420093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializedEntity InitializedEntity::InitializeBase(ASTContext &Context, 1935711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson CXXBaseSpecifier *Base, 1936711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson bool IsInheritedVirtualBase) 193720093b4bf698f292c664676987541d5103b65b15Douglas Gregor{ 193820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializedEntity Result; 193920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Kind = EK_Base; 1940711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base = reinterpret_cast<uintptr_t>(Base); 1941711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson if (IsInheritedVirtualBase) 1942711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base |= 0x01; 1943711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson 1944d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Result.Type = Base->getType(); 194520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 194620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 194720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 194899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas GregorDeclarationName InitializedEntity::getName() const { 194999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (getKind()) { 195099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Parameter: 1951a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor if (!VariableOrMember) 1952a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor return DeclarationName(); 1953a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor // Fall through 1954a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor 1955a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor case EK_Variable: 195699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Member: 195799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return VariableOrMember->getDeclName(); 195899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 195999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Result: 196099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Exception: 196118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case EK_New: 196299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Temporary: 196399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Base: 1964d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 1965d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 1966310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 196799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 196899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 196999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 197099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Silence GCC warning 197199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 197299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 197399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 19747abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas GregorDeclaratorDecl *InitializedEntity::getDecl() const { 19757abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor switch (getKind()) { 19767abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Variable: 19777abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Parameter: 19787abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Member: 19797abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return VariableOrMember; 19807abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 19817abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Result: 19827abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Exception: 19837abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_New: 19847abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Temporary: 19857abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Base: 1986d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 1987d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 1988310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 19897abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 19907abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor } 19917abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 19927abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor // Silence GCC warning 19937abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 19947abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor} 19957abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 19963c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregorbool InitializedEntity::allowsNRVO() const { 19973c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor switch (getKind()) { 19983c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Result: 19993c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Exception: 20003c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return LocAndNRVO.NRVO; 20013c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 20023c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Variable: 20033c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Parameter: 20043c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Member: 20053c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_New: 20063c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Temporary: 20073c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Base: 20083c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_ArrayElement: 20093c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_VectorElement: 2010310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 20113c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor break; 20123c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor } 20133c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 20143c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return false; 20153c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor} 20163c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 201720093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 201820093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Initialization sequence 201920093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 202020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 202120093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::Step::Destroy() { 202220093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Kind) { 202320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 202420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 2025906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 202620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: 202720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 202820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 2029523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 203020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: 203120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 2032906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 203320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 2034d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: 203551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: 203671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: 203718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 2038cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 2039569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 204020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 204120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 204220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 204320093b4bf698f292c664676987541d5103b65b15Douglas Gregor delete ICS; 204420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 204520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 204620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2047b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isDirectReferenceBinding() const { 2048b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return getKind() == ReferenceBinding && Steps.back().Kind == SK_BindReference; 2049b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2050b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2051b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isAmbiguous() const { 2052b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor if (getKind() != FailedSequence) 2053b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2054b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2055b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor switch (getFailureKind()) { 2056b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForReference: 2057b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitList: 2058b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 2059b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_AddressOfOverloadFailed: // FIXME: Could do better 2060b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 2061b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 2062b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_RValueReferenceBindingToLValue: 2063b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitDropsQualifiers: 2064b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitFailed: 2065b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConversionFailed: 2066b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForScalar: 2067b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceBindingToInitList: 2068b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_InitListBadDestinationType: 2069b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_DefaultInitOfConst: 207072a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 2071b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2072b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2073b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitOverloadFailed: 2074b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_UserConversionOverloadFailed: 2075b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConstructorOverloadFailed: 2076b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return FailedOverloadResult == OR_Ambiguous; 2077b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor } 2078b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2079b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2080b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2081b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2082d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregorbool InitializationSequence::isConstructorInitialization() const { 2083d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization; 2084d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor} 2085d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor 208620093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddAddressOverloadResolutionStep( 20876bb8017bb9e828d118e15e59d71c66bba323c364John McCall FunctionDecl *Function, 20886bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found) { 208920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 209020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ResolveAddressOfOverloadedFunction; 209120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Function->getType(); 20929aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 20936bb8017bb9e828d118e15e59d71c66bba323c364John McCall S.Function.FoundDecl = Found; 209420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 209520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 209620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 209720093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType, 2098906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::ResultCategory Category) { 209920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 2100906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl switch (Category) { 2101906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case ImplicitCastExpr::RValue: S.Kind = SK_CastDerivedToBaseRValue; break; 2102906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case ImplicitCastExpr::XValue: S.Kind = SK_CastDerivedToBaseXValue; break; 2103906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case ImplicitCastExpr::LValue: S.Kind = SK_CastDerivedToBaseLValue; break; 2104906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl default: llvm_unreachable("No such category"); 2105906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 210620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = BaseType; 210720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 210820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 210920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 211020093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddReferenceBindingStep(QualType T, 211120093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool BindingTemporary) { 211220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 211320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference; 211420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 211520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 211620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 211720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2118523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregorvoid InitializationSequence::AddExtraneousCopyToTemporary(QualType T) { 2119523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Step S; 2120523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Kind = SK_ExtraneousCopyToTemporary; 2121523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Type = T; 2122523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Steps.push_back(S); 2123523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor} 2124523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 212503981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedmanvoid InitializationSequence::AddUserConversionStep(FunctionDecl *Function, 21269aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl, 212703981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman QualType T) { 212820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 212920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_UserConversion; 213003981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman S.Type = T; 21319aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 21329aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = FoundDecl; 213320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 213420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 213520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 213620093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddQualificationConversionStep(QualType Ty, 2137906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::ResultCategory Category) { 213820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 2139906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl switch (Category) { 2140906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case ImplicitCastExpr::RValue: 2141906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionRValue; 2142906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 2143906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case ImplicitCastExpr::XValue: 2144906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionXValue; 2145906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 2146906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case ImplicitCastExpr::LValue: 2147906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionLValue; 2148906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 2149906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl default: llvm_unreachable("No such category"); 2150906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 215120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Ty; 215220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 215320093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 215420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 215520093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddConversionSequenceStep( 215620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const ImplicitConversionSequence &ICS, 215720093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T) { 215820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 215920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ConversionSequence; 216020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 216120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ICS = new ImplicitConversionSequence(ICS); 216220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 216320093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 216420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2165d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorvoid InitializationSequence::AddListInitializationStep(QualType T) { 2166d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Step S; 2167d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Kind = SK_ListInitialization; 2168d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Type = T; 2169d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Steps.push_back(S); 2170d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor} 2171d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 217251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregorvoid 217351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas GregorInitializationSequence::AddConstructorInitializationStep( 217451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor, 2175b13b737a2450167c82e148590e8019b839ce6b98John McCall AccessSpecifier Access, 217651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor QualType T) { 217751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Step S; 217851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Kind = SK_ConstructorInitialization; 217951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Type = T; 21809aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Constructor; 21819aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = DeclAccessPair::make(Constructor, Access); 218251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Steps.push_back(S); 218351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor} 218451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 218571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorvoid InitializationSequence::AddZeroInitializationStep(QualType T) { 218671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Step S; 218771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Kind = SK_ZeroInitialization; 218871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Type = T; 218971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Steps.push_back(S); 219071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 219171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 219218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorvoid InitializationSequence::AddCAssignmentStep(QualType T) { 219318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step S; 219418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Kind = SK_CAssignment; 219518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Type = T; 219618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Steps.push_back(S); 219718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 219818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 2199cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedmanvoid InitializationSequence::AddStringInitStep(QualType T) { 2200cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Step S; 2201cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Kind = SK_StringInit; 2202cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Type = T; 2203cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Steps.push_back(S); 2204cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman} 2205cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2206569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorvoid InitializationSequence::AddObjCObjectConversionStep(QualType T) { 2207569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Step S; 2208569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Kind = SK_ObjCObjectConversion; 2209569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Type = T; 2210569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Steps.push_back(S); 2211569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 2212569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 221320093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::SetOverloadFailure(FailureKind Failure, 221420093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Result) { 221520093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = FailedSequence; 221620093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->Failure = Failure; 221720093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->FailedOverloadResult = Result; 221820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 221920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 222020093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 222120093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Attempt initialization 222220093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 222320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 222420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt list initialization (C++0x [dcl.init.list]) 2225d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorstatic void TryListInitialization(Sema &S, 222620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 222720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 222820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitListExpr *InitList, 222920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2230d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We only perform rudimentary checking of list 2231d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // initializations at this point, then assume that any list 2232d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // initialization of an array, aggregate, or scalar will be 223336c28db83d2141ca4e74c4d2e92be5a3a772e2c3Sebastian Redl // well-formed. When we actually "perform" list initialization, we'll 2234d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // do all of the necessary checking. C++0x initializer lists will 2235d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // force us to perform more checking here. 2236d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ListInitialization); 2237d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2238d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 2239d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2240d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // C++ [dcl.init]p13: 2241d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If T is a scalar type, then a declaration of the form 2242d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2243d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // T x = { a }; 2244d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2245d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // is equivalent to 2246d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2247d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // T x = a; 2248d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (DestType->isScalarType()) { 2249d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (InitList->getNumInits() > 1 && S.getLangOptions().CPlusPlus) { 2250d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar); 2251d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 2252d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 2253d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2254d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume scalar initialization from a single value works. 2255d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isAggregateType()) { 2256d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume aggregate initialization works. 2257d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isVectorType()) { 2258d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume vector initialization works. 2259d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isReferenceType()) { 2260d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: C++0x defines behavior for this. 2261d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList); 2262d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 2263d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isRecordType()) { 2264d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: C++0x defines behavior for this 2265d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType); 2266d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 2267d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2268d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Add a general "list initialization" step. 2269d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.AddListInitializationStep(DestType); 227020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 227120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 227220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Try a reference initialization that involves calling a conversion 227320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// function. 227420093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic OverloadingResult TryRefInitWithConversionFunction(Sema &S, 227520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 227620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 227720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 227820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowRValues, 227920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2280d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 228120093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 228220093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T1 = cv1T1.getUnqualifiedType(); 228320093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 228420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T2 = cv2T2.getUnqualifiedType(); 228520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 228620093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase; 2287569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion; 228820093b4bf698f292c664676987541d5103b65b15Douglas Gregor assert(!S.CompareReferenceRelationship(Initializer->getLocStart(), 2289569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T1, T2, DerivedToBase, 2290569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor ObjCConversion) && 229120093b4bf698f292c664676987541d5103b65b15Douglas Gregor "Must have incompatible references when binding via conversion"); 229260cfcecaf48e4310339dcfbdb0e3f0e6d2853855Chandler Carruth (void)DerivedToBase; 2293569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor (void)ObjCConversion; 229420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 229520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the candidate set directly in the initialization sequence 229620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // structure, so that it will persist if we fail. 229720093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 229820093b4bf698f292c664676987541d5103b65b15Douglas Gregor CandidateSet.clear(); 229920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 230020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 230120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 230220093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 230320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 230420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const RecordType *T1RecordType = 0; 23056b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) && 23066b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T1, 0)) { 230720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 230820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to see if there is a suitable conversion. 230920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl()); 2310572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall 231120093b4bf698f292c664676987541d5103b65b15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 2312e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(T1RecordDecl); 231320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Con != ConEnd; ++Con) { 23149aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 23159aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 23169aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 231720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Find the constructor (which may be a template). 231820093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConstructorDecl *Constructor = 0; 23199aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 232020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 232120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 232220093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 232320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 23249aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 232520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 232620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Constructor->isInvalidDecl() && 232720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 232820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 23299aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 233086820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 233120093b4bf698f292c664676987541d5103b65b15Douglas Gregor &Initializer, 1, CandidateSet); 233220093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 23339aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 233486820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall &Initializer, 1, CandidateSet); 233520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 233620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 233720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2338572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl()) 2339572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 234020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 23416b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor const RecordType *T2RecordType = 0; 23426b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if ((T2RecordType = T2->getAs<RecordType>()) && 23436b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T2, 0)) { 234420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting from is a class type, enumerate its conversion 234520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions. 234620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl()); 234720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 234820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the type we are converting to. If we are allowed to 234920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // convert to an rvalue, take the type that the destination type 235020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // refers to. 235120093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType ToType = AllowRValues? cv1T1 : DestType; 235220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2353eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 235420093b4bf698f292c664676987541d5103b65b15Douglas Gregor = T2RecordDecl->getVisibleConversionFunctions(); 2355eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 2356eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall E = Conversions->end(); I != E; ++I) { 235720093b4bf698f292c664676987541d5103b65b15Douglas Gregor NamedDecl *D = *I; 235820093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 235920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<UsingShadowDecl>(D)) 236020093b4bf698f292c664676987541d5103b65b15Douglas Gregor D = cast<UsingShadowDecl>(D)->getTargetDecl(); 236120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 236220093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 236320093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConversionDecl *Conv; 236420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 236520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 236620093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 23674680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Conv = cast<CXXConversionDecl>(D); 236820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 236920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the conversion function doesn't return a reference type, 237020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // it can't be considered for this conversion unless we're allowed to 237120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // consider rvalues. 237220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Do we need to make sure that we only consider conversion 237320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // candidates with reference-compatible results? That might be needed to 237420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // break recursion. 237520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if ((AllowExplicit || !Conv->isExplicit()) && 237620093b4bf698f292c664676987541d5103b65b15Douglas Gregor (AllowRValues || Conv->getConversionType()->isLValueReferenceType())){ 237720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 23789aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 237986820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, 238020093b4bf698f292c664676987541d5103b65b15Douglas Gregor ToType, CandidateSet); 238120093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 23829aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 2383692f85c1d217c8c3cdc06d884ad61b101c75c856Douglas Gregor Initializer, ToType, CandidateSet); 238420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 238520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 238620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2387572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl()) 2388572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 238920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 239020093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 239120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 239220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform overload resolution. If it fails, return the failed result. 239320093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 239420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (OverloadingResult Result 239520093b4bf698f292c664676987541d5103b65b15Douglas Gregor = S.BestViableFunction(CandidateSet, DeclLoc, Best)) 239620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 239703981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 239820093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function = Best->Function; 239903981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 240003981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Compute the returned type of the conversion. 240120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<CXXConversionDecl>(Function)) 240220093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = Function->getResultType(); 240320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 240420093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv1T1; 240503981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 240603981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Add the user-defined conversion step. 24079aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, 24086398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor T2.getNonLValueExprType(S.Context)); 240903981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 241003981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Determine whether we need to perform derived-to-base or 241103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // cv-qualification adjustments. 2412906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::ResultCategory Category = ImplicitCastExpr::RValue; 2413906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl if (T2->isLValueReferenceType()) 2414906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Category = ImplicitCastExpr::LValue; 2415906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl else if (const RValueReferenceType *RRef = T2->getAs<RValueReferenceType>()) 2416906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Category = RRef->getPointeeType()->isFunctionType() ? 241766d0acd5f1010625df9987a89b8cc4df3d378d5eSebastian Redl ImplicitCastExpr::LValue : ImplicitCastExpr::XValue; 2418906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 241920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool NewDerivedToBase = false; 2420569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool NewObjCConversion = false; 242120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult NewRefRelationship 24226398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor = S.CompareReferenceRelationship(DeclLoc, T1, 24236398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor T2.getNonLValueExprType(S.Context), 2424569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor NewDerivedToBase, NewObjCConversion); 2425a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor if (NewRefRelationship == Sema::Ref_Incompatible) { 2426a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // If the type we've converted to is not reference-related to the 2427a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // type we're looking for, then there is another conversion step 2428a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // we need to perform to produce a temporary of the right type 2429a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // that we'll be binding to. 2430a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ImplicitConversionSequence ICS; 2431a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.setStandard(); 2432a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.Standard = Best->FinalConversion; 2433a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor T2 = ICS.Standard.getToType(2); 2434a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor Sequence.AddConversionSequenceStep(ICS, T2); 2435a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor } else if (NewDerivedToBase) 243620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 243720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getQualifiedType(T1, 243820093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2.getNonReferenceType().getQualifiers()), 2439569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Category); 2440569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (NewObjCConversion) 2441569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 2442569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, 2443569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T2.getNonReferenceType().getQualifiers())); 2444569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 244520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (cv1T1.getQualifiers() != T2.getNonReferenceType().getQualifiers()) 2446906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Sequence.AddQualificationConversionStep(cv1T1, Category); 244720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 244820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, !T2->isReferenceType()); 244920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return OR_Success; 245020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 245120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 24524680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl/// \brief Attempt reference initialization (C++0x [dcl.init.ref]) 245320093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryReferenceInitialization(Sema &S, 245420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 245520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 245620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 245720093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 245820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ReferenceBinding); 24594680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 2460d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 246120093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 24625535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T1Quals; 24635535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 246420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 24655535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T2Quals; 24665535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 246720093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 24684680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 246920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the initializer is the address of an overloaded function, try 247020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to resolve the overloaded function. If all goes well, T2 is the 247120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type of the resulting function. 247220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) { 24736bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found; 247420093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Fn = S.ResolveAddressOfOverloadedFunction(Initializer, 247520093b4bf698f292c664676987541d5103b65b15Douglas Gregor T1, 24766bb8017bb9e828d118e15e59d71c66bba323c364John McCall false, 24776bb8017bb9e828d118e15e59d71c66bba323c364John McCall Found); 247820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Fn) { 247920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 248020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 248120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 24824680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 24836bb8017bb9e828d118e15e59d71c66bba323c364John McCall Sequence.AddAddressOverloadResolutionStep(Fn, Found); 248420093b4bf698f292c664676987541d5103b65b15Douglas Gregor cv2T2 = Fn->getType(); 248520093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv2T2.getUnqualifiedType(); 248620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 24874680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 248820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Compute some basic properties of the types and the initializer. 248920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isLValueRef = DestType->isLValueReferenceType(); 249020093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isRValueRef = !isLValueRef; 249120093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase = false; 2492569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion = false; 24934680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Expr::Classification InitCategory = Initializer->Classify(S.Context); 249420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult RefRelationship 2495569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase, 2496569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor ObjCConversion); 24974680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 249820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p5: 249920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A reference to type "cv1 T1" is initialized by an expression of type 250020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // "cv2 T2" as follows: 250120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 250220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the reference is an lvalue reference and the initializer 250320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // expression 25044680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // Note the analogous bullet points for rvlaue refs to functions. Because 25054680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // there are no function rvalues in C++, rvalue refs to functions are treated 25064680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // like lvalue refs. 250720093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult ConvOvlResult = OR_Success; 25084680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl bool T1Function = T1->isFunctionType(); 25094680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (isLValueRef || T1Function) { 25104680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (InitCategory.isLValue() && 251120093b4bf698f292c664676987541d5103b65b15Douglas Gregor RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification) { 251220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - is an lvalue (but is not a bit-field), and "cv1 T1" is 251320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2," or 251420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 2515de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // Per C++ [over.best.ics]p2, we don't diagnose whether the lvalue is a 251620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // bit-field when we're determining whether the reference initialization 2517de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // can occur. However, we do pay attention to whether it is a bit-field 2518de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // to decide whether we're actually binding to a temporary created from 2519de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // the bit-field. 252020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 252120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 25225535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth S.Context.getQualifiedType(T1, T2Quals), 2523906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::LValue); 2524569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (ObjCConversion) 2525569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 2526569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 2527569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 25285535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 2529906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Sequence.AddQualificationConversionStep(cv1T1,ImplicitCastExpr::LValue); 2530de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor bool BindingTemporary = T1Quals.hasConst() && !T1Quals.hasVolatile() && 2531093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson (Initializer->getBitField() || Initializer->refersToVectorElement()); 2532de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, BindingTemporary); 253320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 253420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 253520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 253620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - has a class type (i.e., T2 is a class type), where T1 is not 253720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-related to T2, and can be implicitly converted to an 253820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible 253920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // with "cv3 T3" (this conversion is selected by enumerating the 254020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // applicable conversion functions (13.3.1.6) and choosing the best 254120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // one through overload resolution (13.3)), 25424680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // If we have an rvalue ref to function type here, the rhs must be 25434680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // an rvalue. 25444680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() && 25454680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl (isLValueRef || InitCategory.isRValue())) { 254620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, Kind, 254720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer, 25484680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl /*AllowRValues=*/isRValueRef, 254920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 255020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult == OR_Success) 255120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 25521d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ConvOvlResult != OR_No_Viable_Function) { 25531d31833450e6d2947a33cb0840d87661d92eec07John McCall Sequence.SetOverloadFailure( 25541d31833450e6d2947a33cb0840d87661d92eec07John McCall InitializationSequence::FK_ReferenceInitOverloadFailed, 25551d31833450e6d2947a33cb0840d87661d92eec07John McCall ConvOvlResult); 25561d31833450e6d2947a33cb0840d87661d92eec07John McCall } 255720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 255820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 25594680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 256020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the reference shall be an lvalue reference to a 256120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // non-volatile const type (i.e., cv1 shall be const), or the reference 256220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // shall be an rvalue reference and the initializer expression shall 25634680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // be an rvalue or have a function type. 25644680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // We handled the function type stuff above. 2565ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor if (!((isLValueRef && T1Quals.hasConst() && !T1Quals.hasVolatile()) || 25664680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl (isRValueRef && InitCategory.isRValue()))) { 256720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 256820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 256920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 257020093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 257120093b4bf698f292c664676987541d5103b65b15Douglas Gregor else if (isLValueRef) 25724680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Sequence.SetFailed(InitCategory.isLValue() 257320093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? (RefRelationship == Sema::Ref_Related 257420093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? InitializationSequence::FK_ReferenceInitDropsQualifiers 257520093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToUnrelated) 257620093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 257720093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 257820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed( 257920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_RValueReferenceBindingToLValue); 25804680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 258120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 258220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 25834680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 25844680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // - [If T1 is not a function type], if T2 is a class type and 25854680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (!T1Function && T2->isRecordType()) { 258666d0acd5f1010625df9987a89b8cc4df3d378d5eSebastian Redl bool isXValue = InitCategory.isXValue(); 258720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - the initializer expression is an rvalue and "cv1 T1" is 258820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2", or 25894680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (InitCategory.isRValue() && 259020093b4bf698f292c664676987541d5103b65b15Douglas Gregor RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification) { 2591523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the 2592523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // compiler the freedom to perform a copy here or bind to the 2593523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object, while C++0x requires that we bind directly to the 2594523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object. Hence, we always bind to the object without making an 2595523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // extra copy. However, in C++03 requires that we check for the 2596523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // presence of a suitable copy constructor: 2597523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // 2598523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The constructor that would be used to make the copy shall 2599523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // be callable whether or not the copy is actually done. 2600523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (!S.getLangOptions().CPlusPlus0x) 2601523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Sequence.AddExtraneousCopyToTemporary(cv2T2); 2602523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 260320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 260420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 26055535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth S.Context.getQualifiedType(T1, T2Quals), 260666d0acd5f1010625df9987a89b8cc4df3d378d5eSebastian Redl isXValue ? ImplicitCastExpr::XValue 260766d0acd5f1010625df9987a89b8cc4df3d378d5eSebastian Redl : ImplicitCastExpr::RValue); 2608569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (ObjCConversion) 2609569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 2610569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 2611569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 26125535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 261366d0acd5f1010625df9987a89b8cc4df3d378d5eSebastian Redl Sequence.AddQualificationConversionStep(cv1T1, 261466d0acd5f1010625df9987a89b8cc4df3d378d5eSebastian Redl isXValue ? ImplicitCastExpr::XValue 261566d0acd5f1010625df9987a89b8cc4df3d378d5eSebastian Redl : ImplicitCastExpr::RValue); 261666d0acd5f1010625df9987a89b8cc4df3d378d5eSebastian Redl Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/!isXValue); 261720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 261820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 26194680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 262020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - T1 is not reference-related to T2 and the initializer expression 262120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // can be implicitly converted to an rvalue of type "cv3 T3" (this 262220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversion is selected by enumerating the applicable conversion 262320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions (13.3.1.6) and choosing the best one through overload 262420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // resolution (13.3)), 262520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible) { 262620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, 262720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind, Initializer, 262820093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowRValues=*/true, 262920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 263020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult) 263120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 263220093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 263320093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 263420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 263520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 263620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 263720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 263820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 263920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 264020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 264120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 264220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer expression is an rvalue, with T2 an array type, 264320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // and "cv1 T1" is reference-compatible with "cv2 T2," the reference 264420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // is bound to the object represented by the rvalue (see 3.10). 264520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: How can an array type be reference-compatible with anything? 264620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Don't we mean the element types of T1 and T2? 264720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 264820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, a temporary of type “cv1 T1” is created and initialized 264920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // from the initializer expression using the rules for a non-reference 265020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // copy initialization (8.5). The reference is then bound to the 265120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // temporary. [...] 2652369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 265320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 265420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 265520093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct); 2656369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 2657369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 2658369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 2659369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall if (S.TryImplicitConversion(Sequence, TempEntity, Initializer, 2660369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*SuppressUserConversions*/ false, 2661369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall AllowExplicit, 2662369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*FIXME:InOverloadResolution=*/false)) { 266320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Use the conversion function set stored in ICS to turn 266420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // this into an overloading ambiguity diagnostic. However, we need 266520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to keep that set as an OverloadCandidateSet rather than as some 266620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // other kind of set. 266718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 266818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetOverloadFailure( 266918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 267018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor ConvOvlResult); 267118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 267218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed); 267320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 267420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 267520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 267620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // [...] If T1 is reference-related to T2, cv1 must be the 267720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // same cv-qualification as, or greater cv-qualification 267820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // than, cv2; otherwise, the program is ill-formed. 26795535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T1CVRQuals = T1Quals.getCVRQualifiers(); 26805535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T2CVRQuals = T2Quals.getCVRQualifiers(); 268120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Related && 26825535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth (T1CVRQuals | T2CVRQuals) != T1CVRQuals) { 268320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 268420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 268520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 268620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 268720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 268820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 268920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 269020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 269120093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt character array initialization from a string literal 269220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// (C++ [dcl.init.string], C99 6.7.8). 269320093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryStringLiteralInitialization(Sema &S, 269420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 269520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 269620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 269720093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2698cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Sequence.setSequenceKind(InitializationSequence::StringInit); 2699d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddStringInitStep(Entity.getType()); 270020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 270120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 270220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt initialization by constructor (C++ [dcl.init]), which 270320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// enumerates the constructors of the initialized entity and performs overload 270420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// resolution to select the best. 270520093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryConstructorInitialization(Sema &S, 270620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 270720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 270820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs, 270971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor QualType DestType, 271020093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 27112f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ConstructorInitialization); 271251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 271351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build the candidate set directly in the initialization sequence 271451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // structure, so that it will persist if we fail. 271551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 271651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CandidateSet.clear(); 271751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 271851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 271951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // explicit conversion operators. 272051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct || 272151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getKind() == InitializationKind::IK_Value || 27222f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Kind.getKind() == InitializationKind::IK_Default); 2723087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor 2724087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // The type we're constructing needs to be complete. 2725087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 272672a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_Incomplete); 2727087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor return; 2728087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 272951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 273051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 273151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // to see if one is suitable. 273251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor const RecordType *DestRecordType = DestType->getAs<RecordType>(); 273351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor assert(DestRecordType && "Constructor initialization requires record type"); 273451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXRecordDecl *DestRecordDecl 273551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 273651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 273751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 2738e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl); 273951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Con != ConEnd; ++Con) { 27409aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 27419aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 2742d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor bool SuppressUserConversions = false; 2743d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor 274451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Find the constructor (which may be a template). 274551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor = 0; 27469aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 274751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 274851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 274951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 2750d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor else { 27519aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 2752d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor 2753d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor // If we're performing copy initialization using a copy constructor, we 2754d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor // suppress user-defined conversions on the arguments. 2755d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor // FIXME: Move constructors? 2756d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Copy && 2757d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Constructor->isCopyConstructor()) 2758d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions = true; 2759d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor } 276051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 276151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (!Constructor->isInvalidDecl() && 276299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (AllowExplicit || !Constructor->isExplicit())) { 276351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 27649aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 276586820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 2766d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Args, NumArgs, CandidateSet, 2767d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions); 276851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor else 27699aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 2770d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Args, NumArgs, CandidateSet, 2771d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions); 277251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 277351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 277451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 277551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceLocation DeclLoc = Kind.getLocation(); 277651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 277751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Perform overload resolution. If it fails, return the failed result. 277851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 277951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (OverloadingResult Result 278051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = S.BestViableFunction(CandidateSet, DeclLoc, Best)) { 278151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Sequence.SetOverloadFailure( 278251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor InitializationSequence::FK_ConstructorOverloadFailed, 278351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Result); 278451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return; 278551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 27869db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 27879db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // C++0x [dcl.init]p6: 27889db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // If a program calls for the default initialization of an object 27899db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // of a const-qualified type T, T shall be a class type with a 27909db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // user-provided default constructor. 27919db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 27929db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getType().isConstQualified() && 27939db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor cast<CXXConstructorDecl>(Best->Function)->isImplicit()) { 27949db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 27959db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor return; 27969db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 27979db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 279851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Add the constructor initialization step. Any cv-qualification conversion is 279951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // subsumed by the initialization. 28002f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Sequence.AddConstructorInitializationStep( 280151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor cast<CXXConstructorDecl>(Best->Function), 28029aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Best->FoundDecl.getAccess(), 280318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DestType); 280420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 280520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 280671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor/// \brief Attempt value initialization (C++ [dcl.init]p7). 280771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorstatic void TryValueInitialization(Sema &S, 280871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializedEntity &Entity, 280971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializationKind &Kind, 281071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor InitializationSequence &Sequence) { 281171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // C++ [dcl.init]p5: 281271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 281371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // To value-initialize an object of type T means: 2814d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType T = Entity.getType(); 281571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 281671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is an array type, then each element is value-initialized; 281771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor while (const ArrayType *AT = S.Context.getAsArrayType(T)) 281871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor T = AT->getElementType(); 281971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 282071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (const RecordType *RT = T->getAs<RecordType>()) { 282171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 282271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is a class type (clause 9) with a user-declared 282371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // constructor (12.1), then the default constructor for T is 282471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // called (and the initialization is ill-formed if T has no 282571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // accessible default constructor); 282671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 282771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // FIXME: we really want to refer to a single subobject of the array, 282871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // but Entity doesn't have a way to capture that (yet). 282971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (ClassDecl->hasUserDeclaredConstructor()) 283071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 283171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 283216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // -- if T is a (possibly cv-qualified) non-union class type 283316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // without a user-provided constructor, then the object is 283416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // zero-initialized and, if T’s implicitly-declared default 283516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // constructor is non-trivial, that constructor is called. 2836465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if ((ClassDecl->getTagKind() == TTK_Class || 2837ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor ClassDecl->getTagKind() == TTK_Struct)) { 2838d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 283916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 284016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 284171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 284271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 284371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 2844d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 284571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ZeroInitialization); 284671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 284771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 284899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor/// \brief Attempt default initialization (C++ [dcl.init]p6). 284999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregorstatic void TryDefaultInitialization(Sema &S, 285099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializedEntity &Entity, 285199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializationKind &Kind, 285299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitializationSequence &Sequence) { 285399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(Kind.getKind() == InitializationKind::IK_Default); 285499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 285599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // C++ [dcl.init]p6: 285699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // To default-initialize an object of type T means: 285799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is an array type, each element is default-initialized; 2858d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 285999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor while (const ArrayType *Array = S.Context.getAsArrayType(DestType)) 286099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor DestType = Array->getElementType(); 286199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 286299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is a (possibly cv-qualified) class type (Clause 9), the default 286399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // constructor for T is called (and the initialization is ill-formed if 286499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // T has no accessible default constructor); 286560c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (DestType->isRecordType() && S.getLangOptions().CPlusPlus) { 28664e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth TryConstructorInitialization(S, Entity, Kind, 0, 0, DestType, Sequence); 28674e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth return; 286899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 286999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 287099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - otherwise, no initialization is performed. 287199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.setSequenceKind(InitializationSequence::NoInitialization); 287299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 287399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // If a program calls for the default initialization of an object of 287499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // a const-qualified type T, T shall be a class type with a user-provided 287599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // default constructor. 287660c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (DestType.isConstQualified() && S.getLangOptions().CPlusPlus) 287799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 287899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 287999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 288020093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]), 288120093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// which enumerates all conversion functions and performs overload resolution 288220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// to select the best. 288320093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic void TryUserDefinedConversion(Sema &S, 288420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 288520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 288620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 288720093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 28884a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.setSequenceKind(InitializationSequence::UserDefinedConversion); 28894a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 2890d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 28914a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert(!DestType->isReferenceType() && "References are handled elsewhere"); 28924a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType SourceType = Initializer->getType(); 28934a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert((DestType->isRecordType() || SourceType->isRecordType()) && 28944a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor "Must have a class type to perform a user-defined conversion"); 28954a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 28964a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Build the candidate set directly in the initialization sequence 28974a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // structure, so that it will persist if we fail. 28984a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 28994a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CandidateSet.clear(); 29004a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 29014a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Determine whether we are allowed to call explicit constructors or 29024a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // explicit conversion operators. 29034a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 29044a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 29054a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) { 29064a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting to is a class type. Enumerate its constructors 29074a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // to see if there is a suitable conversion. 29084a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXRecordDecl *DestRecordDecl 29094a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 29104a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 2911087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Try to complete the type we're converting to. 2912087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (!S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 2913087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 2914e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl); 2915087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Con != ConEnd; ++Con) { 2916087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor NamedDecl *D = *Con; 2917087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 2918d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor 2919087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Find the constructor (which may be a template). 2920087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor CXXConstructorDecl *Constructor = 0; 2921087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor FunctionTemplateDecl *ConstructorTmpl 2922087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor = dyn_cast<FunctionTemplateDecl>(D); 29234a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 2924087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>( 2925087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 29264712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor else 2927087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>(D); 2928087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor 2929087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (!Constructor->isInvalidDecl() && 2930087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 2931087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (ConstructorTmpl) 2932087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 2933087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor /*ExplicitArgs*/ 0, 2934087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor &Initializer, 1, CandidateSet, 29354712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 2936087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor else 2937087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddOverloadCandidate(Constructor, FoundDecl, 2938087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor &Initializer, 1, CandidateSet, 29394712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 2940087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 2941087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 2942087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 29434a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 2944cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2945cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman SourceLocation DeclLoc = Initializer->getLocStart(); 2946cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 29474a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) { 29484a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting from is a class type, enumerate its conversion 29494a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // functions. 2950cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 295133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // We can only enumerate the conversion functions for a complete type; if 295233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // the type isn't complete, simply skip this step. 295333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (!S.RequireCompleteType(DeclLoc, SourceType, 0)) { 295433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *SourceRecordDecl 295533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = cast<CXXRecordDecl>(SourceRecordType->getDecl()); 29564a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 2957eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 295833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = SourceRecordDecl->getVisibleConversionFunctions(); 2959eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 296033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman E = Conversions->end(); 296133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman I != E; ++I) { 296233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman NamedDecl *D = *I; 296333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 296433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (isa<UsingShadowDecl>(D)) 296533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman D = cast<UsingShadowDecl>(D)->getTargetDecl(); 296633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman 296733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 296833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXConversionDecl *Conv; 29694a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConvTemplate) 297033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 29714a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 297232daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall Conv = cast<CXXConversionDecl>(D); 297333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman 297433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (AllowExplicit || !Conv->isExplicit()) { 297533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (ConvTemplate) 29769aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 297786820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, DestType, 297833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CandidateSet); 297933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman else 29809aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 298186820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Initializer, DestType, CandidateSet); 298233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman } 29834a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 29844a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 29854a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 29864a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 29874a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Perform overload resolution. If it fails, return the failed result. 29884a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet::iterator Best; 29891d31833450e6d2947a33cb0840d87661d92eec07John McCall if (OverloadingResult Result 29904a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = S.BestViableFunction(CandidateSet, DeclLoc, Best)) { 29914a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.SetOverloadFailure( 29924a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor InitializationSequence::FK_UserConversionOverloadFailed, 29934a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Result); 29944a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 29954a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 29961d31833450e6d2947a33cb0840d87661d92eec07John McCall 29974a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionDecl *Function = Best->Function; 29984a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 29994a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (isa<CXXConstructorDecl>(Function)) { 30004a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step. Any cv-qualification conversion is 30014a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // subsumed by the initialization. 30029aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType); 30034a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 30044a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 30054a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 30064a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step that calls the conversion function. 30075291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor QualType ConvType = Function->getCallResultType(); 30083fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor if (ConvType->getAs<RecordType>()) { 30093fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If we're converting to a class type, there may be an copy if 30103fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // the resulting temporary object (possible to create an object of 30113fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // a base class type). That copy is not a separate conversion, so 30123fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // we just make a note of the actual destination type (possibly a 30133fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // base class of the type returned by the conversion function) and 30143fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // let the user-defined conversion step handle the conversion. 30153fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType); 30163fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor return; 30173fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor } 30184a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 30193fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType); 30203fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 30213fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If the conversion following the call to the conversion function 30223fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // is interesting, add it as a separate step. 30234a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (Best->FinalConversion.First || Best->FinalConversion.Second || 30244a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Best->FinalConversion.Third) { 30254a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ImplicitConversionSequence ICS; 30261d31833450e6d2947a33cb0840d87661d92eec07John McCall ICS.setStandard(); 30274a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ICS.Standard = Best->FinalConversion; 30284a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.AddConversionSequenceStep(ICS, DestType); 30294a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 303020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 303120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3032369371ce0c2b0d8051a8089e620eb41513fce9a2John McCallbool Sema::TryImplicitConversion(InitializationSequence &Sequence, 3033369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall const InitializedEntity &Entity, 3034369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall Expr *Initializer, 3035369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall bool SuppressUserConversions, 3036369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall bool AllowExplicitConversions, 3037369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall bool InOverloadResolution) { 303820093b4bf698f292c664676987541d5103b65b15Douglas Gregor ImplicitConversionSequence ICS 3039369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall = TryImplicitConversion(Initializer, Entity.getType(), 3040369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall SuppressUserConversions, 3041369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall AllowExplicitConversions, 3042369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall InOverloadResolution); 3043369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall if (ICS.isBad()) return true; 3044369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 3045369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall // Perform the actual conversion. 3046d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddConversionSequenceStep(ICS, Entity.getType()); 3047369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall return false; 304820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 304920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 305020093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::InitializationSequence(Sema &S, 305120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 305220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 305320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, 30545769d6195087229770d7ac90449443e026c47103John McCall unsigned NumArgs) 30555769d6195087229770d7ac90449443e026c47103John McCall : FailedCandidateSet(Kind.getLocation()) { 305620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ASTContext &Context = S.Context; 305720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 305820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init]p16: 305920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The semantics of initializers are as follows. The destination type is 306020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // the type of the object or reference being initialized and the source 306120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type is the type of the initializer expression. The source type is not 306220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // defined when the initializer is a braced-init-list or when it is a 306320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // parenthesized list of expressions. 3064d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 306520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 306620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isDependentType() || 306720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 306820093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = DependentSequence; 306920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 307020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 307120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 307220093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType SourceType; 307320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer = 0; 307499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs == 1) { 307520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer = Args[0]; 307620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!isa<InitListExpr>(Initializer)) 307720093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceType = Initializer->getType(); 307820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 307920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 308020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is a braced-init-list, the object is 308120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // list-initialized (8.5.4). 308220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) { 308320093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryListInitialization(S, Entity, Kind, InitList, *this); 3084d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 308520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 308620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 308720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a reference type, see 8.5.3. 308820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isReferenceType()) { 308920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p1: 309020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A variable declared to be a T& or T&&, that is, "reference to type T" 309120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (8.3.2), shall be initialized by an object, or function, of type T or 309220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // by an object that can be converted into a T. 309320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (Therefore, multiple arguments are not permitted.) 309420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (NumArgs != 1) 309520093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_TooManyInitsForReference); 309620093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 309720093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryReferenceInitialization(S, Entity, Kind, Args[0], *this); 309820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 309920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 310020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 310120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is an array of characters, an array of 310220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // char16_t, an array of char32_t, or an array of wchar_t, and the 310320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer is a string literal, see 8.5.2. 310420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Initializer && IsStringInit(Initializer, DestType, Context)) { 310520093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this); 310620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 310720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 310820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 310920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is (), the object is value-initialized. 311099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Value || 311199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct && NumArgs == 0)) { 311220093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryValueInitialization(S, Entity, Kind, *this); 311320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 311420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 311520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 311699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Handle default initialization. 311799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Default){ 311899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor TryDefaultInitialization(S, Entity, Kind, *this); 311999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 312099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 312118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 312220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, if the destination type is an array, the program is 312320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // ill-formed. 312420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (const ArrayType *AT = Context.getAsArrayType(DestType)) { 312520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (AT->getElementType()->isAnyCharacterType()) 312620093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_ArrayNeedsInitListOrStringLiteral); 312720093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 312820093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_ArrayNeedsInitList); 312920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 313020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 313120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3132cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3133cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman // Handle initialization in C 3134cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman if (!S.getLangOptions().CPlusPlus) { 3135cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman setSequenceKind(CAssignment); 3136cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman AddCAssignmentStep(DestType); 3137cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman return; 3138cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 313920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 314020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a (possibly cv-qualified) class type: 314120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isRecordType()) { 314220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initialization is direct-initialization, or if it is 314320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // copy-initialization where the cv-unqualified version of the 314420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // source type is the same class as, or a derived class of, the 314520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // class of the destination, constructors are considered. [...] 314620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Direct || 314720093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Kind.getKind() == InitializationKind::IK_Copy && 314820093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Context.hasSameUnqualifiedType(SourceType, DestType) || 314920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.IsDerivedFrom(SourceType, DestType)))) 315071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor TryConstructorInitialization(S, Entity, Kind, Args, NumArgs, 3151d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(), *this); 315220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise (i.e., for the remaining copy-initialization cases), 315320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // user-defined conversion sequences that can convert from the source 315420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type to the destination type or (when a conversion function is 315520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // used) to a derived class thereof are enumerated as described in 315620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 13.3.1.4, and the best one is chosen through overload resolution 315720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (13.3). 315820093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 315920093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 316020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 316120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 316220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 316399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs > 1) { 316499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SetFailed(FK_TooManyInitsForScalar); 316599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 316699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 316799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(NumArgs == 1 && "Zero-argument case handled above"); 316899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 316920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, if the source type is a (possibly cv-qualified) class 317020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type, conversion functions are considered. 317199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (!SourceType.isNull() && SourceType->isRecordType()) { 317220093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 317320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 317420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 317520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 317620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the initial value of the object being initialized is the 31774a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // (possibly converted) value of the initializer expression. Standard 317820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversions (Clause 4) will be used, if necessary, to convert the 317920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer expression to the cv-unqualified version of the 318020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // destination type; no user-defined conversions are considered. 3181369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall if (S.TryImplicitConversion(*this, Entity, Initializer, 3182369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*SuppressUserConversions*/ true, 3183369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*AllowExplicitConversions*/ false, 3184369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*InOverloadResolution*/ false)) 3185369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall SetFailed(InitializationSequence::FK_ConversionFailed); 3186369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall else 3187369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall setSequenceKind(StandardConversion); 318820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 318920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 319020093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::~InitializationSequence() { 319120093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (llvm::SmallVectorImpl<Step>::iterator Step = Steps.begin(), 319220093b4bf698f292c664676987541d5103b65b15Douglas Gregor StepEnd = Steps.end(); 319320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) 319420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Destroy(); 319520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 319620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 319720093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 319820093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Perform initialization 319920093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 320018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorstatic Sema::AssignmentAction 320118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorgetAssignmentAction(const InitializedEntity &Entity) { 320218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch(Entity.getKind()) { 320318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 320418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 320518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 320618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 320718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 3208688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor if (Entity.getDecl() && 3209688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext())) 3210688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor return Sema::AA_Sending; 3211688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor 321218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Passing; 321318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 321418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 321518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Returning; 321618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 321718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Exception: 321818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 321918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("No assignment action for C++-specific initialization"); 322018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 322118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 322218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 322318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell apart casting vs. converting? 322418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Casting; 322518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 322618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Member: 3227d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_ArrayElement: 3228d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 3229310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 323018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 323118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 323218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 323318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Converting; 323418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 323518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 32364154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether we should binding a created object as a temporary when 32374154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// initializing the given entity. 32382f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregorstatic bool shouldBindAsTemporary(const InitializedEntity &Entity) { 323918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 32401b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 32411b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 32422f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor case InitializedEntity::EK_Result: 324318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 324418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 324518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 3246d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 3247a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson case InitializedEntity::EK_Exception: 3248310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 324918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return false; 325018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 325118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 325218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 325318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return true; 325418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 325518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 325618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("missed an InitializedEntity kind?"); 325718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 325818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 32594154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether the given entity, when initialized with an object 32604154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// created for that initialization, requires destruction. 32614154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregorstatic bool shouldDestroyTemporary(const InitializedEntity &Entity) { 32624154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor switch (Entity.getKind()) { 32634154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Member: 32644154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Result: 32654154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_New: 32664154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Base: 32674154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_VectorElement: 3268310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 32694154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return false; 32704154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 32714154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Variable: 32724154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Parameter: 32734154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Temporary: 32744154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_ArrayElement: 32754154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Exception: 32764154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return true; 32774154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 32784154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 32794154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor llvm_unreachable("missed an InitializedEntity kind?"); 32804154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor} 32814154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 3282523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \brief Make a (potentially elidable) temporary copy of the object 3283523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// provided by the given initializer by calling the appropriate copy 3284523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// constructor. 3285523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3286523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param S The Sema object used for type-checking. 3287523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3288523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param T The type of the temporary object, which must either by 3289523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// the type of the initializer expression or a superclass thereof. 3290523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3291523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param Enter The entity being initialized. 3292523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3293523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param CurInit The initializer expression. 3294523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3295523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param IsExtraneousCopy Whether this is an "extraneous" copy that 3296523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// is permitted in C++03 (but not C++0x) when binding a reference to 3297523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// an rvalue. 3298523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3299523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \returns An expression that copies the initializer expression into 3300523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// a temporary object, or an error expression if a copy could not be 3301523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// created. 330260d7b3a319d84d688752be3870615ac0f111fb16John McCallstatic ExprResult CopyObject(Sema &S, 3303523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor QualType T, 33042f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor const InitializedEntity &Entity, 330560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult CurInit, 3306523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor bool IsExtraneousCopy) { 33073fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine which class type we're copying to. 33081b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Expr *CurInitExpr = (Expr *)CurInit.get(); 33092f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor CXXRecordDecl *Class = 0; 3310523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) 33112f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Class = cast<CXXRecordDecl>(Record->getDecl()); 33122f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (!Class) 33132f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor return move(CurInit); 33142f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 33152f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // C++0x [class.copy]p34: 33162f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // When certain criteria are met, an implementation is allowed to 33172f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // omit the copy/move construction of a class object, even if the 33182f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // copy/move constructor and/or destructor for the object have 33192f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // side effects. [...] 33202f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // - when a temporary class object that has not been bound to a 33212f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // reference (12.2) would be copied/moved to a class object 33222f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // with the same cv-unqualified type, the copy/move operation 33232f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // can be omitted by constructing the temporary object 33242f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // directly into the target of the omitted copy/move 33252f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // 33262f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // Note that the other three bullets are handled elsewhere. Copy 33273c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // elision for return statements and throw expressions are handled as part 33283c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // of constructor initialization, while copy elision for exception handlers 33293c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // is handled by the run-time. 33302f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor bool Elidable = CurInitExpr->isTemporaryObject() && 3331523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Context.hasSameUnqualifiedType(T, CurInitExpr->getType()); 333218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation Loc; 333318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 333418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 333518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Loc = Entity.getReturnLoc(); 333618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 333718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 333818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Exception: 333918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Loc = Entity.getThrowLoc(); 334018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 334118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 334218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 33437abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor Loc = Entity.getDecl()->getLocation(); 33447abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor break; 33457abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 33461b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 33471b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 334818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 334918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 33502f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor case InitializedEntity::EK_New: 335118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 3352d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 3353310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 33542f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Loc = CurInitExpr->getLocStart(); 33552f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor break; 335618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 3357f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 3358f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor // Make sure that the type we are copying is complete. 3359f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor if (S.RequireCompleteType(Loc, T, S.PDiag(diag::err_temp_copy_incomplete))) 3360f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor return move(CurInit); 3361f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 336218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // Perform overload resolution using the class's copy constructors. 336318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DeclContext::lookup_iterator Con, ConEnd; 33645769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 3365e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(Class); 336618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Con != ConEnd; ++Con) { 33672f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // Only consider copy constructors. 336818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(*Con); 336918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (!Constructor || Constructor->isInvalidDecl() || 3370153b3ba7a61f3228fd3a8c67b9bff94db3e13a2eDouglas Gregor !Constructor->isCopyConstructor() || 3371153b3ba7a61f3228fd3a8c67b9bff94db3e13a2eDouglas Gregor !Constructor->isConvertingConstructor(/*AllowExplicit=*/false)) 337218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor continue; 33739aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 33749aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl 33759aa472c45d2bd81b7b52c225e8acc560d716db97John McCall = DeclAccessPair::make(Constructor, Constructor->getAccess()); 33769aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 337786820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall &CurInitExpr, 1, CandidateSet); 33782f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor } 337918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 338018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OverloadCandidateSet::iterator Best; 338118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (S.BestViableFunction(CandidateSet, Loc, Best)) { 338218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Success: 338318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 338418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 338518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_No_Viable_Function: 338657d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin S.Diag(Loc, IsExtraneousCopy && !S.isSFINAEContext() 338757d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin ? diag::ext_rvalue_to_reference_temp_copy_no_viable 338857d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin : diag::err_temp_copy_no_viable) 33897abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 339018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 3391cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(CandidateSet, Sema::OCD_AllCandidates, 3392cbce60633c9864261105b289473e5a3ed7b4a729John McCall &CurInitExpr, 1); 339357d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin if (!IsExtraneousCopy || S.isSFINAEContext()) 339457d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin return S.ExprError(); 339557d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin return move(CurInit); 339618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 339718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Ambiguous: 339818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_ambiguous) 33997abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 340018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 3401cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(CandidateSet, Sema::OCD_ViableCandidates, 3402cbce60633c9864261105b289473e5a3ed7b4a729John McCall &CurInitExpr, 1); 340318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 340418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 340518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Deleted: 340618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_deleted) 34077abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 340818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 340918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 341018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Best->Function->isDeleted(); 341118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 341218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 341318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 34143fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function); 3415ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 34163fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 3417523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 34189a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 341957d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin Best->FoundDecl.getAccess(), IsExtraneousCopy); 3420523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 3421523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (IsExtraneousCopy) { 3422523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // If this is a totally extraneous copy for C++03 reference 3423523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // binding purposes, just return the original initialization 34242559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // expression. We don't generate an (elided) copy operation here 34252559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // because doing so would require us to pass down a flag to avoid 34262559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // infinite recursion, where each step adds another extraneous, 34272559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // elidable copy. 34282559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 34292559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Instantiate the default arguments of any extra parameters in 34302559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // the selected copy constructor, as if we were going to create a 34312559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // proper call to the copy constructor. 34322559a7045a74679c80376305397a5953d038e1d0Douglas Gregor for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) { 34332559a7045a74679c80376305397a5953d038e1d0Douglas Gregor ParmVarDecl *Parm = Constructor->getParamDecl(I); 34342559a7045a74679c80376305397a5953d038e1d0Douglas Gregor if (S.RequireCompleteType(Loc, Parm->getType(), 34352559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.PDiag(diag::err_call_incomplete_argument))) 34362559a7045a74679c80376305397a5953d038e1d0Douglas Gregor break; 34372559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 34382559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Build the default argument expression; we don't actually care 34392559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if this succeeds or not, because this routine will complain 34402559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if there was a problem. 34412559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm); 34422559a7045a74679c80376305397a5953d038e1d0Douglas Gregor } 3443523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 3444523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor return S.Owned(CurInitExpr); 3445523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor } 34463fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 34473fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine the arguments required to actually perform the 3448523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // constructor call (we might have derived-to-base conversions, or 3449523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // the copy constructor may have default arguments). 34503fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor if (S.CompleteConstructorCall(Constructor, 3451ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall Sema::MultiExprArg(S, &CurInitExpr, 1), 34523fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Loc, ConstructorArgs)) 34533fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor return S.ExprError(); 34543fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 3455b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // Actually perform the constructor call. 3456b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, T, Constructor, Elidable, 34577a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall move_arg(ConstructorArgs), 34587a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 34597a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall CXXConstructExpr::CK_Complete); 3460b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor 3461b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // If we're supposed to bind temporaries, do so. 3462b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity)) 3463b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 3464b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor return move(CurInit); 346518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 346620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3467a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregorvoid InitializationSequence::PrintInitLocationNote(Sema &S, 3468a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor const InitializedEntity &Entity) { 3469a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Parameter && Entity.getDecl()) { 3470a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getLocation().isInvalid()) 3471a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor return; 3472a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 3473a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getDeclName()) 3474a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here) 3475a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor << Entity.getDecl()->getDeclName(); 3476a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor else 3477a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here); 3478a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } 3479a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor} 3480a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 348160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 348220093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::Perform(Sema &S, 348320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 348420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 3485d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Action::MultiExprArg Args, 3486d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType *ResultType) { 348720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind == FailedSequence) { 348820093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 348920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Diagnose(S, Entity, Kind, (Expr **)Args.release(), NumArgs); 349020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 349120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 349220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 349320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind == DependentSequence) { 3494d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If the declaration is a non-dependent, incomplete array type 3495d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // that has an initializer, then its type will be completed once 3496d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // the initializer is instantiated. 3497d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (ResultType && !Entity.getType()->isDependentType() && 3498d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Args.size() == 1) { 3499d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DeclType = Entity.getType(); 3500d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (const IncompleteArrayType *ArrayT 3501d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getAsIncompleteArrayType(DeclType)) { 3502d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We don't currently have the ability to accurately 3503d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // compute the length of an initializer list without 3504d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // performing full type-checking of the initializer list 3505d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // (since we have to determine where braces are implicitly 3506d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // introduced and such). So, we fall back to making the array 3507d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // type a dependently-sized array type with no specified 3508d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // bound. 3509d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (isa<InitListExpr>((Expr *)Args.get()[0])) { 3510d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor SourceRange Brackets; 3511d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor 3512d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Scavange the location of the brackets from the entity, if we can. 3513d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (DeclaratorDecl *DD = Entity.getDecl()) { 3514d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) { 3515d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor TypeLoc TL = TInfo->getTypeLoc(); 3516d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (IncompleteArrayTypeLoc *ArrayLoc 3517d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor = dyn_cast<IncompleteArrayTypeLoc>(&TL)) 3518d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Brackets = ArrayLoc->getBracketsRange(); 3519d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor } 3520d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3521d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3522d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor *ResultType 3523d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getDependentSizedArrayType(ArrayT->getElementType(), 3524d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor /*NumElts=*/0, 3525d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getSizeModifier(), 3526d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getIndexTypeCVRQualifiers(), 3527d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Brackets); 3528d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3529d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3530d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3531d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3532d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3533085446216a198ced4183ec1571e1ae51c2920e98Eli Friedman if (Kind.getKind() == InitializationKind::IK_Copy || Kind.isExplicitCast()) 353460d7b3a319d84d688752be3870615ac0f111fb16John McCall return ExprResult(Args.release()[0]); 353520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 353667fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor if (Args.size() == 0) 353767fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor return S.Owned((Expr *)0); 353867fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor 353920093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 354020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.Owned(new (S.Context) ParenListExpr(S.Context, 354120093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation(), 354220093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Expr **)Args.release(), 354320093b4bf698f292c664676987541d5103b65b15Douglas Gregor NumArgs, 354420093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation())); 354520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 354620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 354799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (SequenceKind == NoInitialization) 354899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return S.Owned((Expr *)0); 354999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 3550d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType().getNonReferenceType(); 3551d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor // FIXME: Ugly hack around the fact that Entity.getType() is not 3552a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // the same as Entity.getDecl()->getType() in cases involving type merging, 3553a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // and we want latter when it makes sense. 3554d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (ResultType) 3555a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() : 3556d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(); 355720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 355860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult CurInit = S.Owned((Expr *)0); 355999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 356099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(!Steps.empty() && "Cannot have an empty initialization sequence"); 356199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 356299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // For initialization steps that start with a single initializer, 356399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // grab the only argument out the Args and place it into the "current" 356499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // initializer. 356599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (Steps.front().Kind) { 356618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ResolveAddressOfOverloadedFunction: 356718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseRValue: 3568906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 356918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseLValue: 357018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReference: 357118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReferenceToTemporary: 3572523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 357318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_UserConversion: 357418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionLValue: 3575906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 357618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionRValue: 357718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConversionSequence: 357818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ListInitialization: 357918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 3580cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 3581569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 358218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(Args.size() == 1); 358360d7b3a319d84d688752be3870615ac0f111fb16John McCall CurInit = ExprResult(((Expr **)(Args.get()))[0]->Retain()); 358418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (CurInit.isInvalid()) 358518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 358618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 358718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 358818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConstructorInitialization: 358918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ZeroInitialization: 359018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 359120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 359220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 359320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Walk through the computed steps for the initialization sequence, 359420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // performing the specified conversions along the way. 359516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool ConstructorInitRequiresZeroInit = false; 359620093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (step_iterator Step = step_begin(), StepEnd = step_end(); 359720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) { 359820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 359920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 360020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 360120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *CurInitExpr = (Expr *)CurInit.get(); 360299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor QualType SourceType = CurInitExpr? CurInitExpr->getType() : QualType(); 360320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 360420093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Step->Kind) { 360520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 360620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Overload resolution determined which function invoke; update the 360720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer to reflect that choice. 36086bb8017bb9e828d118e15e59d71c66bba323c364John McCall S.CheckAddressOfMemberAccess(CurInitExpr, Step->Function.FoundDecl); 3609b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()); 3610b13b737a2450167c82e148590e8019b839ce6b98John McCall CurInit = S.FixOverloadedFunctionReference(move(CurInit), 36116bb8017bb9e828d118e15e59d71c66bba323c364John McCall Step->Function.FoundDecl, 36129aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.Function); 361320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 361420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 361520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 3616906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 361720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: { 361820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a derived-to-base cast that produces either an rvalue or an 361920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue. Perform that cast. 362020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3621f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 36225cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 362320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Casts to inaccessible base classes are allowed with C-style casts. 362420093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast(); 362520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckDerivedToBaseConversion(SourceType, Step->Type, 362620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr->getLocStart(), 36275cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson CurInitExpr->getSourceRange(), 36285cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson &BasePath, IgnoreBaseAccess)) 362920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 363020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 36316fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (S.BasePathInvolvesVirtualBase(BasePath)) { 36326fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor QualType T = SourceType; 36336fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) 36346fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor T = Pointer->getPointeeType(); 36356fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const RecordType *RecordTy = T->getAs<RecordType>()) 36366fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor S.MarkVTableUsed(CurInitExpr->getLocStart(), 36376fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor cast<CXXRecordDecl>(RecordTy->getDecl())); 36386fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor } 36396fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 3640906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::ResultCategory Category = 3641906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_CastDerivedToBaseLValue ? 3642906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::LValue : 3643906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_CastDerivedToBaseXValue ? 3644906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::XValue : 3645906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::RValue); 3646f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 3647f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Step->Type, 3648f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastExpr::CK_DerivedToBase, 3649f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall (Expr*)CurInit.release(), 3650f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall &BasePath, Category)); 365120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 365220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 365320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 365420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 365520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (FieldDecl *BitField = CurInitExpr->getBitField()) { 365620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // References cannot bind to bit fields (C++ [dcl.init.ref]p5). 365720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield) 3658d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor << Entity.getType().isVolatileQualified() 365920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << BitField->getDeclName() 366020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << CurInitExpr->getSourceRange(); 366120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(BitField->getLocation(), diag::note_bitfield_decl); 366220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 366320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3664a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 3665093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson if (CurInitExpr->refersToVectorElement()) { 366641593e3b7da967b52bc3c7f488b8752dee63f38eJohn McCall // References cannot bind to vector elements. 3667093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element) 3668093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << Entity.getType().isVolatileQualified() 3669093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << CurInitExpr->getSourceRange(); 3670a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 3671093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson return S.ExprError(); 3672093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson } 3673093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson 367420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Reference binding does not have any corresponding ASTs. 367520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 367620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 367720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckExceptionSpecCompatibility(CurInitExpr, DestType)) 367820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 36793aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 368020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 36813aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 368220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 3683a64a869312066ff6119d1d7ae03f88ce499e3f82Anders Carlsson // Reference binding does not have any corresponding ASTs. 3684a64a869312066ff6119d1d7ae03f88ce499e3f82Anders Carlsson 368520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 368620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckExceptionSpecCompatibility(CurInitExpr, DestType)) 368720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 368820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 368920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 369020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3691523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 3692523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor CurInit = CopyObject(S, Step->Type, Entity, move(CurInit), 3693523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor /*IsExtraneousCopy=*/true); 3694523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 3695523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 369620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: { 369720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a user-defined conversion that invokes either a constructor 369820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // or a conversion function. 369920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastExpr::CastKind CastKind = CastExpr::CK_Unknown; 370018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy = false; 37019aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionDecl *Fn = Step->Function.Function; 37029aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundFn = Step->Function.FoundDecl; 37034154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor bool CreatedObject = false; 3704f0e0b17d0504d25b4673de015cf7401e2296323cDouglas Gregor bool IsLvalue = false; 3705b13b737a2450167c82e148590e8019b839ce6b98John McCall if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) { 370620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the selected constructor. 3707ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 370820093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation Loc = CurInitExpr->getLocStart(); 370920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 3710b13b737a2450167c82e148590e8019b839ce6b98John McCall 371120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the arguments required to actually perform the constructor 371220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // call. 371320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CompleteConstructorCall(Constructor, 3714ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall Sema::MultiExprArg(S, &CurInitExpr, 1), 371520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Loc, ConstructorArgs)) 371620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 371720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 371820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the an expression that constructs a temporary. 371920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Step->Type, Constructor, 37207a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall move_arg(ConstructorArgs), 37217a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 37227a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall CXXConstructExpr::CK_Complete); 372320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 372420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 3725b13b737a2450167c82e148590e8019b839ce6b98John McCall 37269a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Kind.getLocation(), Constructor, Entity, 37279aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn.getAccess()); 3728b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 372920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 373020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastKind = CastExpr::CK_ConstructorConversion; 373118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType Class = S.Context.getTypeDeclType(Constructor->getParent()); 373218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.Context.hasSameUnqualifiedType(SourceType, Class) || 373318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.IsDerivedFrom(SourceType, Class)) 373418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor IsCopy = true; 37354154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 37364154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = true; 373720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 373820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the conversion function. 3739b13b737a2450167c82e148590e8019b839ce6b98John McCall CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn); 3740f0e0b17d0504d25b4673de015cf7401e2296323cDouglas Gregor IsLvalue = Conversion->getResultType()->isLValueReferenceType(); 374158e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall S.CheckMemberOperatorAccess(Kind.getLocation(), CurInitExpr, 0, 37429aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn); 3743b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 3744b13b737a2450167c82e148590e8019b839ce6b98John McCall 374520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Should we move this initialization into a separate 374620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // derived-to-base conversion? I believe the answer is "no", because 374720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // we don't want to turn off access control here for c-style casts. 37485fccd36204f11c8491325038e6ffcc784399098eDouglas Gregor if (S.PerformObjectArgumentInitialization(CurInitExpr, /*Qualifier=*/0, 37496bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundFn, Conversion)) 375020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 375120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 375220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Do a little dance to make sure that CurInit has the proper 375320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // pointer. 375420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 375520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 375620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the actual call to the conversion function. 37576bb8017bb9e828d118e15e59d71c66bba323c364John McCall CurInit = S.Owned(S.BuildCXXMemberCallExpr(CurInitExpr, FoundFn, 37586bb8017bb9e828d118e15e59d71c66bba323c364John McCall Conversion)); 375920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid() || !CurInit.get()) 376020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 376120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 376220093b4bf698f292c664676987541d5103b65b15Douglas Gregor CastKind = CastExpr::CK_UserDefinedConversion; 37634154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 37644154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = Conversion->getResultType()->isRecordType(); 376520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 376620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 37672f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor bool RequiresCopy = !IsCopy && 37682f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor getKind() != InitializationSequence::ReferenceBinding; 37692f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (RequiresCopy || shouldBindAsTemporary(Entity)) 377018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 37714154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor else if (CreatedObject && shouldDestroyTemporary(Entity)) { 37724154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CurInitExpr = static_cast<Expr *>(CurInit.get()); 37734154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor QualType T = CurInitExpr->getType(); 37744154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) { 3775db89f289a22897f1031c92f3e49f7a9ba7bae61eDouglas Gregor CXXDestructorDecl *Destructor 3776db89f289a22897f1031c92f3e49f7a9ba7bae61eDouglas Gregor = S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl())); 37774154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor S.CheckDestructorAccess(CurInitExpr->getLocStart(), Destructor, 37784154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor S.PDiag(diag::err_access_dtor_temp) << T); 37794154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor S.MarkDeclarationReferenced(CurInitExpr->getLocStart(), Destructor); 37804154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 37814154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 37824154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 378320093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr = CurInit.takeAs<Expr>(); 3784906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl // FIXME: xvalues 3785f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 3786f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInitExpr->getType(), 3787f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastKind, CurInitExpr, 0, 3788906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl IsLvalue ? ImplicitCastExpr::LValue : ImplicitCastExpr::RValue)); 378918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 37902f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (RequiresCopy) 3791523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor CurInit = CopyObject(S, Entity.getType().getNonReferenceType(), Entity, 3792523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor move(CurInit), /*IsExtraneousCopy=*/false); 3793906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 379420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 379520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3796906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 379720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 3798906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 3799906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionRValue: { 380020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform a qualification conversion; these can never go wrong. 3801906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::ResultCategory Category = 3802906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_QualificationConversionLValue ? 3803906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::LValue : 3804906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_QualificationConversionXValue ? 3805906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::XValue : 3806906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl ImplicitCastExpr::RValue); 3807906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.ImpCastExprToType(CurInitExpr, Step->Type, CastExpr::CK_NoOp, Category); 380820093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 380920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(CurInitExpr); 381020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 3811906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 3812906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 3813f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor case SK_ConversionSequence: { 3814f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast(); 3815f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor 3816f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor if (S.PerformImplicitConversion(CurInitExpr, Step->Type, *Step->ICS, 3817f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor Sema::AA_Converting, IgnoreBaseAccess)) 381820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.ExprError(); 381920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 382020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 3821f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor CurInit = S.Owned(CurInitExpr); 382220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 3823f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor } 3824f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor 3825d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: { 3826d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor InitListExpr *InitList = cast<InitListExpr>(CurInitExpr); 3827d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType Ty = Step->Type; 3828cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (S.CheckInitList(Entity, InitList, ResultType? *ResultType : Ty)) 3829d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return S.ExprError(); 3830d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3831d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit.release(); 3832d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit = S.Owned(InitList); 3833d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 3834d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 383551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 383651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: { 3837d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor unsigned NumArgs = Args.size(); 383851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor 38399aa472c45d2bd81b7b52c225e8acc560d716db97John McCall = cast<CXXConstructorDecl>(Step->Function.Function); 38403c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 384151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build a call to the selected constructor. 3842ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 38430a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid()) 38440a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian ? Kind.getEqualLoc() 38450a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian : Kind.getLocation(); 38464e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth 38474e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth if (Kind.getKind() == InitializationKind::IK_Default) { 38484e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // Force even a trivial, implicit default constructor to be 38494e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // semantically checked. We do this explicitly because we don't build 38504e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // the definition for completely trivial constructors. 38514e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth CXXRecordDecl *ClassDecl = Constructor->getParent(); 38524e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth assert(ClassDecl && "No parent class for constructor."); 38534e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth if (Constructor->isImplicit() && Constructor->isDefaultConstructor() && 38544e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth ClassDecl->hasTrivialConstructor() && !Constructor->isUsed(false)) 38554e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth S.DefineImplicitDefaultConstructor(Loc, Constructor); 38564e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth } 38574e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth 385851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine the arguments required to actually perform the constructor 385951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // call. 386051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (S.CompleteConstructorCall(Constructor, move(Args), 386151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Loc, ConstructorArgs)) 386251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return S.ExprError(); 386351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 38644e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth 386591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor if (Entity.getKind() == InitializedEntity::EK_Temporary && 3866d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor NumArgs != 1 && // FIXME: Hack to work around cast weirdness 386791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct || 386891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Kind.getKind() == InitializationKind::IK_Value)) { 386991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor // An explicitly-constructed temporary, e.g., X(1, 2). 387091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor unsigned NumExprs = ConstructorArgs.size(); 387191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Expr **Exprs = (Expr **)ConstructorArgs.take(); 387210f8e319569c8b8b4603d8a72ce01a7a01502c85Fariborz Jahanian S.MarkDeclarationReferenced(Loc, Constructor); 387391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor CurInit = S.Owned(new (S.Context) CXXTemporaryObjectExpr(S.Context, 387491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Constructor, 387591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Entity.getType(), 387610f8e319569c8b8b4603d8a72ce01a7a01502c85Fariborz Jahanian Loc, 387791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Exprs, 387891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor NumExprs, 38791c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor Kind.getParenRange().getEnd(), 38801c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor ConstructorInitRequiresZeroInit)); 388172e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } else { 388272e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::ConstructionKind ConstructKind = 388372e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::CK_Complete; 388472e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson 388572e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson if (Entity.getKind() == InitializedEntity::EK_Base) { 388672e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson ConstructKind = Entity.getBaseSpecifier()->isVirtual() ? 388772e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::CK_VirtualBase : 388872e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::CK_NonVirtualBase; 388972e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } 38903c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 38913c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // If the entity allows NRVO, mark the construction as elidable 38923c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // unconditionally. 38933c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor if (Entity.allowsNRVO()) 38943c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 38953c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor Constructor, /*Elidable=*/true, 38963c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor move_arg(ConstructorArgs), 38973c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor ConstructorInitRequiresZeroInit, 38983c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor ConstructKind); 38993c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor else 39003c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 39013c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor Constructor, 39023c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor move_arg(ConstructorArgs), 39033c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor ConstructorInitRequiresZeroInit, 39043c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor ConstructKind); 390572e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } 390651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (CurInit.isInvalid()) 390751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return S.ExprError(); 3908b13b737a2450167c82e148590e8019b839ce6b98John McCall 3909b13b737a2450167c82e148590e8019b839ce6b98John McCall // Only check access if all of that succeeded. 39109a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 39119aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.FoundDecl.getAccess()); 3912b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Loc); 391318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 39142f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (shouldBindAsTemporary(Entity)) 391518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 39164154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 391751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 391851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 391971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 392071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: { 392116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor step_iterator NextStep = Step; 392216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ++NextStep; 392316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (NextStep != StepEnd && 392416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor NextStep->Kind == SK_ConstructorInitialization) { 392516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // The need for zero-initialization is recorded directly into 392616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // the call to the object's constructor within the next step. 392716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ConstructorInitRequiresZeroInit = true; 392816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else if (Kind.getKind() == InitializationKind::IK_Value && 392916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor S.getLangOptions().CPlusPlus && 393016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !Kind.isImplicitValueInit()) { 3931ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor CurInit = S.Owned(new (S.Context) CXXScalarValueInitExpr(Step->Type, 393271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getBegin(), 393371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getEnd())); 393416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else { 393571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitValueInitExpr(Step->Type)); 393616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 393771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor break; 393871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 393918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 394018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: { 394118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType SourceType = CurInitExpr->getType(); 394218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::AssignConvertType ConvTy = 394318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.CheckSingleAssignmentConstraints(Step->Type, CurInitExpr); 3944aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 3945aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor // If this is a call, allow conversion to a transparent union. 3946aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor if (ConvTy != Sema::Compatible && 3947aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor Entity.getKind() == InitializedEntity::EK_Parameter && 3948aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExpr) 3949aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor == Sema::Compatible) 3950aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor ConvTy = Sema::Compatible; 3951aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 3952a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor bool Complained; 395318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(), 395418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step->Type, SourceType, 3955a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor CurInitExpr, 3956a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor getAssignmentAction(Entity), 3957a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor &Complained)) { 3958a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 395918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return S.ExprError(); 3960a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } else if (Complained) 3961a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 396218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 396318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit.release(); 396418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.Owned(CurInitExpr); 396518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 396618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 3967cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3968cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: { 3969cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman QualType Ty = Step->Type; 3970cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman CheckStringInit(CurInitExpr, ResultType ? *ResultType : Ty, S); 3971cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman break; 3972cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 3973569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 3974569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 3975569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.ImpCastExprToType(CurInitExpr, Step->Type, 3976569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor CastExpr::CK_ObjCObjectLValueCast, 3977569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.CastCategory(CurInitExpr)); 3978569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor CurInit.release(); 3979569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor CurInit = S.Owned(CurInitExpr); 3980569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 398120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 398220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 398320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 398420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return move(CurInit); 398520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 398620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 398720093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 398820093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Diagnose initialization failures 398920093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 399020093b4bf698f292c664676987541d5103b65b15Douglas Gregorbool InitializationSequence::Diagnose(Sema &S, 399120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 399220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 399320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs) { 399420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind != FailedSequence) 399520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return false; 399620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3997d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 399820093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Failure) { 399920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_TooManyInitsForReference: 40009db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // FIXME: Customize for the initialized entity? 40019db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (NumArgs == 0) 40029db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_without_init) 40039db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType.getNonReferenceType(); 40049db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor else // FIXME: diagnostic below could be better! 40059db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits) 40069db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 400720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 400820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 400920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitList: 401020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 401120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) 401220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Failure == FK_ArrayNeedsInitListOrStringLiteral); 401320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 401420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 40156bb8017bb9e828d118e15e59d71c66bba323c364John McCall case FK_AddressOfOverloadFailed: { 40166bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found; 401720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ResolveAddressOfOverloadedFunction(Args[0], 401820093b4bf698f292c664676987541d5103b65b15Douglas Gregor DestType.getNonReferenceType(), 40196bb8017bb9e828d118e15e59d71c66bba323c364John McCall true, 40206bb8017bb9e828d118e15e59d71c66bba323c364John McCall Found); 402120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 40226bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 402320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 402420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitOverloadFailed: 40254a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor case FK_UserConversionOverloadFailed: 402620093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (FailedOverloadResult) { 402720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Ambiguous: 402818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Failure == FK_UserConversionOverloadFailed) 402918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_ambiguous_condition) 403018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getType() << DestType 403118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 403218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 403318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_ref_init_ambiguous) 403418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << DestType << Args[0]->getType() 403518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 403618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 4037cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(FailedCandidateSet, Sema::OCD_ViableCandidates, 4038cbce60633c9864261105b289473e5a3ed7b4a729John McCall Args, NumArgs); 403920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 404020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 404120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_No_Viable_Function: 404220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition) 404320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 404420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 4045cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(FailedCandidateSet, Sema::OCD_AllCandidates, 4046cbce60633c9864261105b289473e5a3ed7b4a729John McCall Args, NumArgs); 404720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 404820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 404920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Deleted: { 405020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function) 405120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 405220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 405320093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 405420093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Ovl = S.BestViableFunction(FailedCandidateSet, 405520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind.getLocation(), 405620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Best); 405720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Ovl == OR_Deleted) { 405820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 405920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Best->Function->isDeleted(); 406020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 40619f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Inconsistent overload resolution?"); 406220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 406320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 406420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 406520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 406620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Success: 40679f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Conversion did not fail!"); 406820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 406920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 407020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 407120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 407220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 407320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 407420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), 407520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Failure == FK_NonConstLValueReferenceBindingToTemporary 407620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? diag::err_lvalue_reference_bind_to_temporary 407720093b4bf698f292c664676987541d5103b65b15Douglas Gregor : diag::err_lvalue_reference_bind_to_unrelated) 4078ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor << DestType.getNonReferenceType().isVolatileQualified() 407920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 408020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 408120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 408220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 408320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 408420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_RValueReferenceBindingToLValue: 408520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref) 408620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 408720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 408820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 408920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitDropsQualifiers: 409020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) 409120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 409220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 409320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 409420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 409520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 409620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitFailed: 409720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_failed) 409820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 409920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Args[0]->isLvalue(S.Context) == Expr::LV_Valid) 410020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 410120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 410220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 410320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 410420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ConversionFailed: 410518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_init_conversion_failed) 410618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << (int)Entity.getKind() 410720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType 410820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Args[0]->isLvalue(S.Context) == Expr::LV_Valid) 410920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 411020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 4111d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4112d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4113d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_TooManyInitsForScalar: { 411499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceRange R; 411599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 411699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (InitListExpr *InitList = dyn_cast<InitListExpr>(Args[0])) 411799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor R = SourceRange(InitList->getInit(1)->getLocStart(), 411899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitList->getLocEnd()); 411999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor else 412099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor R = SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 4121d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4122d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_excess_initializers) 412399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor << /*scalar=*/2 << R; 4124d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4125d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4126d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4127d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_ReferenceBindingToInitList: 4128d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list) 4129d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getSourceRange(); 4130d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4131d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4132d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_InitListBadDestinationType: 4133d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type) 4134d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange(); 4135d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 413651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 413751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case FK_ConstructorOverloadFailed: { 413851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceRange ArgsRange; 413951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (NumArgs) 414051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ArgsRange = SourceRange(Args[0]->getLocStart(), 414151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Args[NumArgs - 1]->getLocEnd()); 414251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 414351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // FIXME: Using "DestType" for the entity we're printing is probably 414451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // bad. 414551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor switch (FailedOverloadResult) { 414651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Ambiguous: 414751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_ambiguous_init) 414851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 414981201626aa08bcc9d05c8b3c6a1d38a7d577c3ceJohn McCall S.PrintOverloadCandidates(FailedCandidateSet, 4150cbce60633c9864261105b289473e5a3ed7b4a729John McCall Sema::OCD_ViableCandidates, Args, NumArgs); 415151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 415251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 415351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_No_Viable_Function: 41549db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 41559db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor (Entity.getKind() == InitializedEntity::EK_Base || 41569db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Member) && 41579db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 41589db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default initialization of a member or 41599db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // base within a constructor. If no viable function was 41609db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // found, notify the user that she needs to explicitly 41619db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialize this base/member. 41629db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor 41639db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = cast<CXXConstructorDecl>(S.CurContext); 41649db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Base) { 41659db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 41669db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 41679db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 41689db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*base=*/0 41699db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getType(); 41709db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 41719db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor RecordDecl *BaseDecl 41729db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getBaseSpecifier()->getType()->getAs<RecordType>() 41739db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ->getDecl(); 41749db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(BaseDecl->getLocation(), diag::note_previous_decl) 41759db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(BaseDecl); 41769db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 41779db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 41789db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 41799db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 41809db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*member=*/1 41819db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 41829db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_field_decl); 41839db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 41849db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (const RecordType *Record 41859db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getType()->getAs<RecordType>()) 41869db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Record->getDecl()->getLocation(), 41879db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor diag::note_previous_decl) 41889db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(Record->getDecl()); 41899db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 41909db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor break; 41919db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 41929db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 419351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init) 419451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 4195cbce60633c9864261105b289473e5a3ed7b4a729John McCall S.PrintOverloadCandidates(FailedCandidateSet, Sema::OCD_AllCandidates, 4196cbce60633c9864261105b289473e5a3ed7b4a729John McCall Args, NumArgs); 419751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 419851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 419951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Deleted: { 420051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 420151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << true << DestType << ArgsRange; 420251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 420351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadingResult Ovl = S.BestViableFunction(FailedCandidateSet, 420451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getLocation(), 420551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Best); 420651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (Ovl == OR_Deleted) { 420751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 420851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << Best->Function->isDeleted(); 420951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } else { 421051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Inconsistent overload resolution?"); 421151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 421251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 421351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 421451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 421551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Success: 421651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Conversion did not fail!"); 421751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 421851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 421951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 422051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 422199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 422299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case FK_DefaultInitOfConst: 42239db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Member && 42249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 42259db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default-initialization of a const member in 42269db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // a constructor. Complain that it needs to be explicitly 42279db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialized. 42289db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext); 42299db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor) 42309db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 42319db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 42329db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*const=*/1 42339db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 42349db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl) 42359db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 42369db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 42379db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_default_init_const) 42389db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType << (bool)DestType->getAs<RecordType>(); 42399db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 424099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor break; 424172a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor 424272a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 424372a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor S.RequireCompleteType(Kind.getLocation(), DestType, 424472a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor diag::err_init_incomplete_type); 424572a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor break; 424620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 424720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 4248a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 424920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return true; 425020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 425118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 4252de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump(llvm::raw_ostream &OS) const { 4253de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (SequenceKind) { 4254de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FailedSequence: { 4255de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Failed sequence: "; 4256de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (Failure) { 4257de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForReference: 4258de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for reference"; 4259de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4260de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4261de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitList: 4262de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list"; 4263de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4264de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4265de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 4266de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list or string literal"; 4267de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4268de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4269de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_AddressOfOverloadFailed: 4270de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "address of overloaded function failed"; 4271de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4272de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4273de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitOverloadFailed: 4274de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overload resolution for reference initialization failed"; 4275de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4276de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4277de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 4278de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to temporary"; 4279de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4280de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4281de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 4282de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to unrelated type"; 4283de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4284de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4285de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_RValueReferenceBindingToLValue: 4286de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "rvalue reference bound to an lvalue"; 4287de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4288de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4289de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitDropsQualifiers: 4290de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization drops qualifiers"; 4291de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4292de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4293de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitFailed: 4294de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization failed"; 4295de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4296de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4297de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConversionFailed: 4298de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "conversion failed"; 4299de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4300de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4301de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForScalar: 4302de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for scalar"; 4303de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4304de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4305de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceBindingToInitList: 4306de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "referencing binding to initializer list"; 4307de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4308de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4309de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_InitListBadDestinationType: 4310de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "initializer list for non-aggregate, non-scalar type"; 4311de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4312de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4313de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_UserConversionOverloadFailed: 4314de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overloading failed for user-defined conversion"; 4315de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4316de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4317de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConstructorOverloadFailed: 4318de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor overloading failed"; 4319de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4320de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4321de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_DefaultInitOfConst: 4322de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "default initialization of a const variable"; 4323de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 432472a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor 432572a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 432672a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor OS << "initialization of incomplete type"; 432772a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor break; 4328de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4329de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << '\n'; 4330de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 4331de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4332de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4333de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case DependentSequence: 4334de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Dependent sequence: "; 4335de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 4336de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4337de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case UserDefinedConversion: 4338de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "User-defined conversion sequence: "; 4339de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4340de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4341de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ConstructorInitialization: 4342de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Constructor initialization sequence: "; 4343de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4344de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4345de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ReferenceBinding: 4346de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Reference binding: "; 4347de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4348de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4349de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ListInitialization: 4350de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "List initialization: "; 4351de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4352de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4353de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ZeroInitialization: 4354de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Zero initialization\n"; 4355de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 4356de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4357de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case NoInitialization: 4358de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "No initialization\n"; 4359de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 4360de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4361de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case StandardConversion: 4362de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Standard conversion: "; 4363de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4364de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4365de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case CAssignment: 4366de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment: "; 4367de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4368de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4369de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case StringInit: 4370de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "String initialization: "; 4371de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4372de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4373de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4374de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) { 4375de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor if (S != step_begin()) { 4376de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << " -> "; 4377de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4378de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4379de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (S->Kind) { 4380de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 4381de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "resolve address of overloaded function"; 4382de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4383de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4384de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseRValue: 4385de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (rvalue" << S->Type.getAsString() << ")"; 4386de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4387de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4388906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 4389906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "derived-to-base case (xvalue" << S->Type.getAsString() << ")"; 4390906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 4391906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 4392de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseLValue: 4393de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (lvalue" << S->Type.getAsString() << ")"; 4394de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4395de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4396de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReference: 4397de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to lvalue"; 4398de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4399de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4400de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReferenceToTemporary: 4401de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to a temporary"; 4402de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4403de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4404523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 4405523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor OS << "extraneous C++03 copy to temporary"; 4406523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 4407523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 4408de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_UserConversion: 4409900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << "user-defined conversion via " << S->Function.Function; 4410de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4411906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 4412de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionRValue: 4413de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (rvalue)"; 4414de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4415906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 4416906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "qualification conversion (xvalue)"; 4417906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 4418de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionLValue: 4419de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (lvalue)"; 4420de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4421de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4422de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConversionSequence: 4423de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "implicit conversion sequence ("; 4424de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor S->ICS->DebugPrint(); // FIXME: use OS 4425de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << ")"; 4426de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4427de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4428de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ListInitialization: 4429de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "list initialization"; 4430de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4431de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4432de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConstructorInitialization: 4433de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor initialization"; 4434de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4435de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4436de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ZeroInitialization: 4437de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "zero initialization"; 4438de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4439de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4440de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CAssignment: 4441de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment"; 4442de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4443de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4444de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_StringInit: 4445de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "string initialization"; 4446de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4447569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 4448569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 4449569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor OS << "Objective-C object conversion"; 4450569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 4451de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4452de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4453de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 4454de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4455de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump() const { 4456de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor dump(llvm::errs()); 4457de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 4458de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 445918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 446018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// Initialization helper functions 446118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 446260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 446318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::PerformCopyInitialization(const InitializedEntity &Entity, 446418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation EqualLoc, 446560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Init) { 446618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Init.isInvalid()) 446718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return ExprError(); 446818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 446918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Expr *InitE = (Expr *)Init.get(); 447018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(InitE && "No initialization expression?"); 447118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 447218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (EqualLoc.isInvalid()) 447318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc = InitE->getLocStart(); 447418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 447518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationKind Kind = InitializationKind::CreateCopy(InitE->getLocStart(), 447618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc); 447718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 447818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Init.release(); 4479ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall return Seq.Perform(*this, Entity, Kind, MultiExprArg(*this, &InitE, 1)); 448018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 4481