SemaInit.cpp revision 63e7d25d2e6036616b42f744fd4a39cd5f911960
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// 140cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===----------------------------------------------------------------------===// 150cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1619510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Designator.h" 17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Initialization.h" 18e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h" 192d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall#include "clang/Sema/SemaInternal.h" 201e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner#include "clang/Lex/Preprocessor.h" 210cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff#include "clang/AST/ASTContext.h" 227cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 232078bb9c9336da56ea521e98e718556b227541f6Anders Carlsson#include "clang/AST/ExprCXX.h" 2479e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner#include "clang/AST/ExprObjC.h" 25d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor#include "clang/AST/TypeLoc.h" 2620093b4bf698f292c664676987541d5103b65b15Douglas Gregor#include "llvm/Support/ErrorHandling.h" 27c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor#include <map> 2805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorusing namespace clang; 290cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 30dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 31dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Sema Initialization Checking 32dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 33dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 3479e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattnerstatic Expr *IsStringInit(Expr *Init, QualType DeclType, ASTContext &Context) { 358879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner const ArrayType *AT = Context.getAsArrayType(DeclType); 368879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (!AT) return 0; 378879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 388718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT)) 398718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman return 0; 408718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman 418879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // See if this is a string literal or @encode. 428879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner Init = Init->IgnoreParens(); 431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 448879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Handle @encode, which is a narrow string. 458879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType()) 468879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 478879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 488879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Otherwise we can only handle string literals. 498879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner StringLiteral *SL = dyn_cast<StringLiteral>(Init); 50220b6369d7717bfe6894b46cef055d3e763827f2Chris Lattner if (SL == 0) return 0; 51bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman 52bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman QualType ElemTy = Context.getCanonicalType(AT->getElementType()); 538879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // char array can be initialized with a narrow string. 548879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Only allow char x[] = "foo"; not char x[] = L"foo"; 558879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (!SL->isWide()) 56bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman return ElemTy->isCharType() ? Init : 0; 578879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 58bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // wchar_t array can be initialized with a wide string: C99 6.7.8p15 (with 59bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // correction from DR343): "An array with element type compatible with a 60bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // qualified or unqualified version of wchar_t may be initialized by a wide 61bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // string literal, optionally enclosed in braces." 62bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman if (Context.typesAreCompatible(Context.getWCharType(), 63bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman ElemTy.getUnqualifiedType())) 648879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner return 0; 67dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 68dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 6979e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattnerstatic void CheckStringInit(Expr *Str, QualType &DeclT, Sema &S) { 7079e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner // Get the length of the string as parsed. 7179e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner uint64_t StrLength = 7279e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner cast<ConstantArrayType>(Str->getType())->getSize().getZExtValue(); 7379e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7579e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner const ArrayType *AT = S.Context.getAsArrayType(DeclT); 76dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p14. We have an array of character type with unknown size 78dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // being initialized to a string literal. 79dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner llvm::APSInt ConstVal(32); 8019da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner ConstVal = StrLength; 81dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // Return a new array type (C99 6.7.8p22). 8246a617a792bfab0d9b1e057371ea3b9540802226John McCall DeclT = S.Context.getConstantArrayType(IAT->getElementType(), 8346a617a792bfab0d9b1e057371ea3b9540802226John McCall ConstVal, 8446a617a792bfab0d9b1e057371ea3b9540802226John McCall ArrayType::Normal, 0); 8519da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner return; 86dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner } 871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 888718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman const ConstantArrayType *CAT = cast<ConstantArrayType>(AT); 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 908718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // C99 6.7.8p14. We have an array of character type with known size. However, 918718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // the size may be smaller or larger than the string we are initializing. 928718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // FIXME: Avoid truncation for 64-bit length strings. 938718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (StrLength-1 > CAT->getSize().getZExtValue()) 948718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman S.Diag(Str->getSourceRange().getBegin(), 958718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman diag::warn_initializer_string_for_char_array_too_long) 968718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman << Str->getSourceRange(); 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 988718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // Set the type to the actual size that we are initializing. If we have 998718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // something like: 1008718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // char x[1] = "foo"; 1018718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // then this will set the string literal's type to char[1]. 1028718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman Str->setType(DeclT); 103dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 104dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 105dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 106dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Semantic checking for initializer lists. 107dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 108dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 1099e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// @brief Semantic checking for initializer lists. 1109e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1119e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// The InitListChecker class contains a set of routines that each 1129e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// handle the initialization of a certain kind of entity, e.g., 1139e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arrays, vectors, struct/union types, scalars, etc. The 1149e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// InitListChecker itself performs a recursive walk of the subobject 1159e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure of the type to be initialized, while stepping through 1169e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// the initializer list one element at a time. The IList and Index 1179e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// parameters to each of the Check* routines contain the active 1189e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// (syntactic) initializer list and the index into that initializer 1199e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list that represents the current initializer. Each routine is 1209e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// responsible for moving that Index forward as it consumes elements. 1219e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1229e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// Each Check* routine also has a StructuredList/StructuredIndex 12363e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// arguments, which contains the current "structured" (semantic) 1249e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initializer list and the index into that initializer list where we 1259e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// are copying initializers as we map them over to the semantic 1269e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. Once we have completed our recursive walk of the subobject 1279e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure, we will have constructed a full semantic initializer 1289e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. 1299e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1309e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// C99 designators cause changes in the initializer list traversal, 1319e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// because they make the initialization "jump" into a specific 1329e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// subobject and then continue the initialization from that 1339e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// point. CheckDesignatedInitializer() recursively steps into the 1349e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// designated subobject and manages backing out the recursion to 1359e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initialize the subobjects after the one designated. 1368b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattnernamespace { 137c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorclass InitListChecker { 1380820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner Sema &SemaRef; 139c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool hadError; 140c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor std::map<InitListExpr *, InitListExpr *> SyntacticToSemantic; 141c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *FullyStructuredList; 1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1438ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckImplicitInitList(const InitializedEntity &Entity, 144987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, QualType T, 1459e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 146eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 147eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1488ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckExplicitInitList(const InitializedEntity &Entity, 14946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 1509e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 151eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 152eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1538ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckListElementTypes(const InitializedEntity &Entity, 15446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &DeclType, 1551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 156c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1579e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 158eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 159eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1608ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckSubElementType(const InitializedEntity &Entity, 16146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType ElemType, 162c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1639e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1649e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1658ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckScalarType(const InitializedEntity &Entity, 16646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 167c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1689e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1699e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1708ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckReferenceType(const InitializedEntity &Entity, 1718ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 172930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 173930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 174930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex); 1758ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckVectorType(const InitializedEntity &Entity, 17646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, unsigned &Index, 1779e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1789e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1798ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckStructUnionTypes(const InitializedEntity &Entity, 1802bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, QualType DeclType, 1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator Field, 182c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 1839e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 184eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 185eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1868ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckArrayType(const InitializedEntity &Entity, 187784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::APSInt elementIndex, 189c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 1909e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1919e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1928ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson bool CheckDesignatedInitializer(const InitializedEntity &Entity, 1939a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, DesignatedInitExpr *DIE, 194711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &CurrentObjectType, 196c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor RecordDecl::field_iterator *NextField, 197c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor llvm::APSInt *NextElementIndex, 198c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 199c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 200c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &StructuredIndex, 201eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 202eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject); 203c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 204c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor QualType CurrentObjectType, 205c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 206c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned StructuredIndex, 207c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor SourceRange InitRange); 2089e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor void UpdateStructuredListElement(InitListExpr *StructuredList, 2099e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex, 210c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor Expr *expr); 211c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numArrayElements(QualType DeclType); 212c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numStructUnionElements(QualType DeclType); 213930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 214d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor void FillInValueInitForField(unsigned Init, FieldDecl *Field, 215d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 216d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 217cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor void FillInValueInitializations(const InitializedEntity &Entity, 218cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 219c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorpublic: 220cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker(Sema &S, const InitializedEntity &Entity, 221cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *IL, QualType &T); 222c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool HadError() { return hadError; } 223c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 224c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // @brief Retrieves the fully-structured initializer list used for 225c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // semantic analysis and code generation. 226c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } 227c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor}; 2288b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattner} // end anonymous namespace 22968355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 230d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregorvoid InitListChecker::FillInValueInitForField(unsigned Init, FieldDecl *Field, 231d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 232dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitListExpr *ILE, 233d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor bool &RequiresSecondPass) { 234d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 235d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned NumInits = ILE->getNumInits(); 236dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity MemberEntity 237d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitializedEntity::InitializeMember(Field, &ParentEntity); 238d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 239d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // FIXME: We probably don't need to handle references 240d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // specially here, since value-initialization of references is 241d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // handled in InitializationSequence. 242d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->getType()->isReferenceType()) { 243d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // C++ [dcl.init.aggr]p9: 244d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // If an incomplete or empty initializer-list leaves a 245d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // member of reference type uninitialized, the program is 246d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // ill-formed. 247d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized) 248d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << Field->getType() 249d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << ILE->getSyntacticForm()->getSourceRange(); 250d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Field->getLocation(), 251d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor diag::note_uninit_reference_member); 252d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 253d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 254d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 255dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 256d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 257d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor true); 258d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationSequence InitSeq(SemaRef, MemberEntity, Kind, 0, 0); 259d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (!InitSeq) { 260d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitSeq.Diagnose(SemaRef, MemberEntity, Kind, 0, 0); 261d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 262d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 263d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 264dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 26560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult MemberInit 266f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall = InitSeq.Perform(SemaRef, MemberEntity, Kind, MultiExprArg()); 267d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (MemberInit.isInvalid()) { 268d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 269d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 270d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 271dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 272d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) { 273d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Do nothing 274d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (Init < NumInits) { 275d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->setInit(Init, MemberInit.takeAs<Expr>()); 276d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitSeq.getKind() 277d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor == InitializationSequence::ConstructorInitialization) { 278d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Value-initialization requires a constructor call, so 279d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // extend the initializer list to include the constructor 280d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // call and make a note that we'll need to take another pass 281d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // through the initializer list. 282709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek ILE->updateInit(SemaRef.Context, Init, MemberInit.takeAs<Expr>()); 283d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass = true; 284d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 285d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitListExpr *InnerILE 286d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 287dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FillInValueInitializations(MemberEntity, InnerILE, 288dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi RequiresSecondPass); 289d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor} 290d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 2914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Recursively replaces NULL values within the given initializer list 2924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// with expressions that perform value-initialization of the 2934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// appropriate type. 294dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 295cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::FillInValueInitializations(const InitializedEntity &Entity, 296cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, 297cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool &RequiresSecondPass) { 2981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((ILE->getType() != SemaRef.Context.VoidTy) && 299930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor "Should not have void type"); 30087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 30187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (ILE->getSyntacticForm()) 30287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor Loc = ILE->getSyntacticForm()->getSourceRange().getBegin(); 3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3046217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) { 305d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion() && 306d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->getInitializedFieldInUnion()) 307d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(0, ILE->getInitializedFieldInUnion(), 308d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Entity, ILE, RequiresSecondPass); 309d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor else { 310d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned Init = 0; 311d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor for (RecordDecl::field_iterator 312d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field = RType->getDecl()->field_begin(), 313d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FieldEnd = RType->getDecl()->field_end(); 314d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field != FieldEnd; ++Field) { 315d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->isUnnamedBitfield()) 316d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor continue; 317d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 318d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 31987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 32087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 321d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(Init, *Field, Entity, ILE, RequiresSecondPass); 322d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 323cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 324cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 325d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ++Init; 326d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 327d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Only look at the first initialization of a union. 328d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion()) 329d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor break; 330d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 3314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 3324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 3341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType ElementType; 3371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 338cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializedEntity ElementEntity = Entity; 33987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumInits = ILE->getNumInits(); 34087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumElements = NumInits; 3410820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) { 3424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = AType->getElementType(); 34387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) 34487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = CAType->getSize().getZExtValue(); 345dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 346cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 347183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) { 3484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = VType->getElementType(); 34987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = VType->getNumElements(); 350dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 351cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 3521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else 3534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = ILE->getType(); 3541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 355dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 35687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor for (unsigned Init = 0; Init != NumElements; ++Init) { 35716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (hadError) 35816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return; 35916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 360d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement || 361d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson ElementEntity.getKind() == InitializedEntity::EK_VectorElement) 362cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity.setElementIndex(Init); 363cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 36487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 365cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 366cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor true); 367cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationSequence InitSeq(SemaRef, ElementEntity, Kind, 0, 0); 368cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!InitSeq) { 369cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitSeq.Diagnose(SemaRef, ElementEntity, Kind, 0, 0); 37087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor hadError = true; 37187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 37287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 37387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 37460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult ElementInit 375f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall = InitSeq.Perform(SemaRef, ElementEntity, Kind, MultiExprArg()); 376cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (ElementInit.isInvalid()) { 37716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor hadError = true; 378cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 379cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 380cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 381cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (hadError) { 382cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Do nothing 383cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (Init < NumInits) { 384cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ILE->setInit(Init, ElementInit.takeAs<Expr>()); 385cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (InitSeq.getKind() 386cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor == InitializationSequence::ConstructorInitialization) { 387cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Value-initialization requires a constructor call, so 388cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // extend the initializer list to include the constructor 389cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // call and make a note that we'll need to take another pass 390cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // through the initializer list. 391709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek ILE->updateInit(SemaRef.Context, Init, ElementInit.takeAs<Expr>()); 392cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass = true; 393cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 394ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else if (InitListExpr *InnerILE 395cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 396cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(ElementEntity, InnerILE, RequiresSecondPass); 3974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 3984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 3994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 40068355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 401cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity, 402cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *IL, QualType &T) 4030820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner : SemaRef(S) { 4040cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff hadError = false; 405c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 406b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman unsigned newIndex = 0; 4074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 4081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FullyStructuredList 409ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor = getStructuredSubobjectInit(IL, newIndex, T, 0, 0, IL->getSourceRange()); 410dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckExplicitInitList(Entity, IL, T, newIndex, 41146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson FullyStructuredList, newStructuredIndex, 412eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor /*TopLevelObject=*/true); 413c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 414cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!hadError) { 415cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool RequiresSecondPass = false; 416cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, RequiresSecondPass); 41716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (RequiresSecondPass && !hadError) 418dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FillInValueInitializations(Entity, FullyStructuredList, 419cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass); 420cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 4210cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4220cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4230cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numArrayElements(QualType DeclType) { 424638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // FIXME: use a proper constant 425638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman int maxElements = 0x7FFFFFFF; 426c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = 4270820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 4280cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = static_cast<int>(CAT->getSize().getZExtValue()); 4290cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 4300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return maxElements; 4310cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4320cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4330cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numStructUnionElements(QualType DeclType) { 4346217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl(); 4354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor int InitializableMembers = 0; 4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (RecordDecl::field_iterator 43717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = structDecl->field_begin(), 43817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = structDecl->field_end(); 4394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Field != FieldEnd; ++Field) { 4404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if ((*Field)->getIdentifier() || !(*Field)->isBitField()) 4414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++InitializableMembers; 4424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 44339ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (structDecl->isUnion()) 444f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return std::min(InitializableMembers, 1); 445f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return InitializableMembers - structDecl->hasFlexibleArrayMember(); 4460cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4470cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4488ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity, 449987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, 4504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType T, unsigned &Index, 4514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 452eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 453eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 4540cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff int maxElements = 0; 4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4560cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (T->isArrayType()) 4570cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numArrayElements(T); 458fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor else if (T->isRecordType()) 4590cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numStructUnionElements(T); 460b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman else if (T->isVectorType()) 461183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall maxElements = T->getAs<VectorType>()->getNumElements(); 4620cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else 4630cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff assert(0 && "CheckImplicitInitList(): Illegal type"); 464b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 465402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman if (maxElements == 0) { 4660820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(ParentIList->getInit(Index)->getLocStart(), 467402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman diag::err_implicit_empty_initializer); 4684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 469402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman hadError = true; 470402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman return; 471402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman } 472402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman 4734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Build a structured initializer list corresponding to this subobject. 4744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredSubobjectInitList 4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList, 4761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredIndex, 477ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor SourceRange(ParentIList->getInit(Index)->getSourceRange().getBegin(), 478ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor ParentIList->getSourceRange().getEnd())); 4794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredSubobjectInitIndex = 0; 4804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 4814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Check the element types and build the structural subobject. 48287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned StartIndex = Index; 483dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, ParentIList, T, 484987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredSubobjectInitList, 486eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredSubobjectInitIndex, 487eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 48887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1); 489a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor StructuredSubobjectInitList->setType(T); 490a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor 491ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor // Update the structured sub-object initializer so that it's ending 49287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor // range corresponds with the end of the last initializer it used. 49387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (EndIndex < ParentIList->getNumInits()) { 4941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation EndLoc 49587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor = ParentIList->getInit(EndIndex)->getSourceRange().getEnd(); 49687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor StructuredSubobjectInitList->setRBraceLoc(EndLoc); 49787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 498dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4991e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner // Warn about missing braces. 5001e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner if (T->isArrayType() || T->isRecordType()) { 50147f164e15b9358b51ae65f8249d56842f8750767Tanya Lattner SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), 50247f164e15b9358b51ae65f8249d56842f8750767Tanya Lattner diag::warn_missing_braces) 5031e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner << StructuredSubobjectInitList->getSourceRange() 504dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi << FixItHint::CreateInsertion(StructuredSubobjectInitList->getLocStart(), 505849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor "{") 506849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateInsertion(SemaRef.PP.getLocForEndOfToken( 507dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi StructuredSubobjectInitList->getLocEnd()), 508849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor "}"); 5091e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner } 5100cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5110cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5128ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, 51346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 5144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 516eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 517eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 518c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman assert(IList->isExplicit() && "Illegal Implicit InitListExpr"); 5194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = StructuredList; 5204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList->setSyntacticForm(IList); 521dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true, 52246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson Index, StructuredList, StructuredIndex, TopLevelObject); 5236398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor QualType ExprTy = T.getNonLValueExprType(SemaRef.Context); 5246398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor IList->setType(ExprTy); 5256398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor StructuredList->setType(ExprTy); 526638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (hadError) 527638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 528c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 529638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (Index < IList->getNumInits()) { 530c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman // We have leftover initializers 531e540858b289b23653bcb23646f135729203635cbEli Friedman if (StructuredIndex == 1 && 532e540858b289b23653bcb23646f135729203635cbEli Friedman IsStringInit(StructuredList->getInit(0), T, SemaRef.Context)) { 5337c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers_in_char_array_initializer; 534e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 5357c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor DK = diag::err_excess_initializers_in_char_array_initializer; 536e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 537e540858b289b23653bcb23646f135729203635cbEli Friedman } 538bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman // Special-case 5390820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 540dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getInit(Index)->getSourceRange(); 541d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman } else if (!T->isIncompleteType()) { 542b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // Don't complain for incomplete types, since we'll get an error 543b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // elsewhere 544eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType CurrentObjectType = StructuredList->getType(); 5451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int initKind = 546eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isArrayType()? 0 : 547eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isVectorType()? 1 : 548eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isScalarType()? 2 : 549eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isUnionType()? 3 : 550eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 4; 5517c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 5527c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers; 553e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 554e540858b289b23653bcb23646f135729203635cbEli Friedman DK = diag::err_excess_initializers; 5550863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman hadError = true; 5560863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman } 5570863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman if (SemaRef.getLangOptions().OpenCL && initKind == 1) { 5580863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman DK = diag::err_excess_initializers; 559e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 560e540858b289b23653bcb23646f135729203635cbEli Friedman } 5617c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 5620820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 563eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << initKind << IList->getInit(Index)->getSourceRange(); 564c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 565c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 566cda25a977e4b7fe4e080b87586410eaeab7b62f6Eli Friedman 567759f25237864f3a3cc23eb01f0c0ce6edcc9342dEli Friedman if (T->isScalarType() && !TopLevelObject) 5680820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::warn_braces_around_scalar_init) 569a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor << IList->getSourceRange() 570849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocStart()) 571849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocEnd()); 5720cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5730cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5748ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckListElementTypes(const InitializedEntity &Entity, 57546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 5761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &DeclType, 57787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool SubobjectIsDesignatorContext, 5784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 580eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 581eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 582c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (DeclType->isScalarType()) { 58346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, DeclType, Index, 58446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 585c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (DeclType->isVectorType()) { 586dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckVectorType(Entity, IList, DeclType, Index, 58746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 588d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor } else if (DeclType->isAggregateType()) { 589d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor if (DeclType->isRecordType()) { 5906217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 5912bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson CheckStructUnionTypes(Entity, IList, DeclType, RD->field_begin(), 5924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubobjectIsDesignatorContext, Index, 593eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 594eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 59587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } else if (DeclType->isArrayType()) { 596f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor llvm::APSInt Zero( 5970820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()), 598f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor false); 599dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckArrayType(Entity, IList, DeclType, Zero, 600784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson SubobjectIsDesignatorContext, Index, 6014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 602ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else 6034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor assert(0 && "Aggregate that isn't a structure or array?!"); 604613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff } else if (DeclType->isVoidType() || DeclType->isFunctionType()) { 605613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff // This type is invalid, issue a diagnostic. 6064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 6070820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 608d162584991885ab004a02573a73ce06422b921fcChris Lattner << DeclType; 609d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman hadError = true; 610930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isRecordType()) { 611930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init]p14: 612930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] If the class is an aggregate (8.5.1), and the initializer 613930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // is a brace-enclosed list, see 8.5.1. 614930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 615930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Note: 8.5.1 is handled below; here, we diagnose the case where 616930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // we have an initializer list and a destination type that is not 617930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an aggregate. 618930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // FIXME: In C++0x, this is yet another form of initialization. 6190820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 620930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType << IList->getSourceRange(); 621930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 622930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isReferenceType()) { 6238ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, DeclType, Index, 6248ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 625c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall } else if (DeclType->isObjCObjectType()) { 6264d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor SemaRef.Diag(IList->getLocStart(), diag::err_init_objc_class) 6274d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor << DeclType; 6284d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 6290cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } else { 6304d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 6314d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor << DeclType; 6324d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 6330cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 6340cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6350cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6368ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckSubElementType(const InitializedEntity &Entity, 63746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 6381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElemType, 6394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 6404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 6414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 6426fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 643c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) { 644c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman unsigned newIndex = 0; 6454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 6461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *newStructuredList 6474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor = getStructuredSubobjectInit(IList, Index, ElemType, 6484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex, 6494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubInitList->getSourceRange()); 65046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckExplicitInitList(Entity, SubInitList, ElemType, newIndex, 6514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor newStructuredList, newStructuredIndex); 6524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 6534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 65479e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner } else if (Expr *Str = IsStringInit(expr, ElemType, SemaRef.Context)) { 65579e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner CheckStringInit(Str, ElemType, SemaRef); 656f71ae8d8024561f92dd7916363e7a791684563ccChris Lattner UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 6574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 658c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (ElemType->isScalarType()) { 659dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckScalarType(Entity, IList, ElemType, Index, 66046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 661930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (ElemType->isReferenceType()) { 6628ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, ElemType, Index, 6638ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 664b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman } else { 6650820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (SemaRef.getLangOptions().CPlusPlus) { 666930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 667930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // All implicit type conversions (clause 4) are considered when 668930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // initializing the aggregate member with an ini- tializer from 669930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an initializer-list. If the initializer can initialize a 670930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // member, the member is initialized. [...] 6711b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson 6721b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson // FIXME: Better EqualLoc? 673dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializationKind Kind = 6741b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationKind::CreateCopy(expr->getLocStart(), SourceLocation()); 6751b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson InitializationSequence Seq(SemaRef, Entity, Kind, &expr, 1); 676dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 6771b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson if (Seq) { 678dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ExprResult Result = 679f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Seq.Perform(SemaRef, Entity, Kind, MultiExprArg(&expr, 1)); 6801b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson if (Result.isInvalid()) 681930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 682dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 683dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi UpdateStructuredListElement(StructuredList, StructuredIndex, 6841b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Result.takeAs<Expr>()); 685930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 686930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 687930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 688930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 689930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Fall through for subaggregate initialization 690930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 6911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p13: 692930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 693930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // The initializer for a structure or union object that has 694930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // automatic storage duration shall be either an initializer 695930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // list as described below, or a single expression that has 696930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // compatible structure or union type. In the latter case, the 697930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // initial value of the object, including unnamed members, is 698930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // that of the expression. 6996b5374f837f925d99b1a76bc2fe8c98c1698df7fEli Friedman if ((ElemType->isRecordType() || ElemType->isVectorType()) && 7008718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman SemaRef.Context.hasSameUnqualifiedType(expr->getType(), ElemType)) { 70174e40b70306b39d65fed16d474017df036ff3960John McCall SemaRef.DefaultFunctionArrayLvalueConversion(expr); 702930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 703930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 704930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 705930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 706930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 707930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Fall through for subaggregate initialization 708930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 709930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 710930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 7111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 712930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] Otherwise, if the member is itself a non-empty 713930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // subaggregate, brace elision is assumed and the initializer is 714930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // considered for the initialization of the first member of 715930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // the subaggregate. 716930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (ElemType->isAggregateType() || ElemType->isVectorType()) { 717987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList, 718930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor StructuredIndex); 719930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 720930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 721930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // We cannot initialize this element, so let 722930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // PerformCopyInitialization produce the appropriate diagnostic. 723dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.PerformCopyInitialization(Entity, SourceLocation(), 724ca755fe38f00d63363b3a3ac2a1ae6c1eb2957f9Anders Carlsson SemaRef.Owned(expr)); 725930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 726930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 727930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 728930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 729930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 730b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman} 731b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 7328ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckScalarType(const InitializedEntity &Entity, 73346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 7346fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned &Index, 7354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 7364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 737b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Index >= IList->getNumInits()) { 7380820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_empty_scalar_initializer) 739dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getSourceRange(); 740bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman hadError = true; 7414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 7424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 743bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 7440cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 745b934c2d77144471f35c5ebae9e925b056dac8112John McCall 746b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *expr = IList->getInit(Index); 747b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) { 748b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.Diag(SubIList->getLocStart(), 749b934c2d77144471f35c5ebae9e925b056dac8112John McCall diag::warn_many_braces_around_scalar_init) 750b934c2d77144471f35c5ebae9e925b056dac8112John McCall << SubIList->getSourceRange(); 751b934c2d77144471f35c5ebae9e925b056dac8112John McCall 752b934c2d77144471f35c5ebae9e925b056dac8112John McCall CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList, 753b934c2d77144471f35c5ebae9e925b056dac8112John McCall StructuredIndex); 754b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 755b934c2d77144471f35c5ebae9e925b056dac8112John McCall } else if (isa<DesignatedInitExpr>(expr)) { 756b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.Diag(expr->getSourceRange().getBegin(), 757b934c2d77144471f35c5ebae9e925b056dac8112John McCall diag::err_designator_for_scalar_init) 758b934c2d77144471f35c5ebae9e925b056dac8112John McCall << DeclType << expr->getSourceRange(); 759b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; 760b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 761b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 762b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 763b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 764b934c2d77144471f35c5ebae9e925b056dac8112John McCall 765b934c2d77144471f35c5ebae9e925b056dac8112John McCall ExprResult Result = 766b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 767b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.Owned(expr)); 768b934c2d77144471f35c5ebae9e925b056dac8112John McCall 769b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *ResultExpr = 0; 770b934c2d77144471f35c5ebae9e925b056dac8112John McCall 771b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Result.isInvalid()) 772b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; // types weren't compatible. 773b934c2d77144471f35c5ebae9e925b056dac8112John McCall else { 774b934c2d77144471f35c5ebae9e925b056dac8112John McCall ResultExpr = Result.takeAs<Expr>(); 775dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 776b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (ResultExpr != expr) { 777b934c2d77144471f35c5ebae9e925b056dac8112John McCall // The type was promoted, update initializer list. 778b934c2d77144471f35c5ebae9e925b056dac8112John McCall IList->setInit(Index, ResultExpr); 779b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 780b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 781b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (hadError) 782b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 783b934c2d77144471f35c5ebae9e925b056dac8112John McCall else 784b934c2d77144471f35c5ebae9e925b056dac8112John McCall UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 785b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 7860cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 7870cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 7888ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckReferenceType(const InitializedEntity &Entity, 7898ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 790930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 791930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 792930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex) { 793930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (Index < IList->getNumInits()) { 794930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor Expr *expr = IList->getInit(Index); 795930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (isa<InitListExpr>(expr)) { 7960820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 797930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType << IList->getSourceRange(); 798930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 799930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 800930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 801930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 8021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 803930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 80460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = 805a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 806a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson SemaRef.Owned(expr)); 807a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 808a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson if (Result.isInvalid()) 809930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 810a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 811a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson expr = Result.takeAs<Expr>(); 812a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson IList->setInit(Index, expr); 813a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 814930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (hadError) 815930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 816930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor else 817930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 818930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 819930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 820390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: It would be wonderful if we could point at the actual member. In 821390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // general, it would be useful to pass location information down the stack, 822390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // so that we know the location (or decl) of the "current object" being 823390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // initialized. 8241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getLocStart(), 825930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor diag::err_init_reference_member_uninitialized) 826930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType 827930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << IList->getSourceRange(); 828930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 829930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 830930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 831930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 832930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 833930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor} 834930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 8358ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckVectorType(const InitializedEntity &Entity, 83646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 8374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 8384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 8394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 84020e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Index >= IList->getNumInits()) 84120e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 84220e047abc5f19dc948436c0fb891450d9cd40667John McCall 84320e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *VT = DeclType->getAs<VectorType>(); 84420e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned maxElements = VT->getNumElements(); 84520e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numEltsInit = 0; 84620e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType elementType = VT->getElementType(); 84720e047abc5f19dc948436c0fb891450d9cd40667John McCall 84820e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!SemaRef.getLangOptions().OpenCL) { 84920e047abc5f19dc948436c0fb891450d9cd40667John McCall // If the initializing element is a vector, try to copy-initialize 85020e047abc5f19dc948436c0fb891450d9cd40667John McCall // instead of breaking it apart (which is doomed to failure anyway). 85120e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *Init = IList->getInit(Index); 85220e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) { 85320e047abc5f19dc948436c0fb891450d9cd40667John McCall ExprResult Result = 85420e047abc5f19dc948436c0fb891450d9cd40667John McCall SemaRef.PerformCopyInitialization(Entity, Init->getLocStart(), 85520e047abc5f19dc948436c0fb891450d9cd40667John McCall SemaRef.Owned(Init)); 85620e047abc5f19dc948436c0fb891450d9cd40667John McCall 85720e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *ResultExpr = 0; 85820e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Result.isInvalid()) 85920e047abc5f19dc948436c0fb891450d9cd40667John McCall hadError = true; // types weren't compatible. 86020e047abc5f19dc948436c0fb891450d9cd40667John McCall else { 86120e047abc5f19dc948436c0fb891450d9cd40667John McCall ResultExpr = Result.takeAs<Expr>(); 862dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 86320e047abc5f19dc948436c0fb891450d9cd40667John McCall if (ResultExpr != Init) { 86420e047abc5f19dc948436c0fb891450d9cd40667John McCall // The type was promoted, update initializer list. 86520e047abc5f19dc948436c0fb891450d9cd40667John McCall IList->setInit(Index, ResultExpr); 8662ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 8672ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 86820e047abc5f19dc948436c0fb891450d9cd40667John McCall if (hadError) 86920e047abc5f19dc948436c0fb891450d9cd40667John McCall ++StructuredIndex; 87020e047abc5f19dc948436c0fb891450d9cd40667John McCall else 87120e047abc5f19dc948436c0fb891450d9cd40667John McCall UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 87220e047abc5f19dc948436c0fb891450d9cd40667John McCall ++Index; 87320e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 8740cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 8751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 87620e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 87720e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 878dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 87920e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { 88020e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 88120e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Index >= IList->getNumInits()) 88220e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 883dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 88420e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 88520e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 88620e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 88720e047abc5f19dc948436c0fb891450d9cd40667John McCall } 88820e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 88920e047abc5f19dc948436c0fb891450d9cd40667John McCall } 89020e047abc5f19dc948436c0fb891450d9cd40667John McCall 89120e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 89220e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 893dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 89420e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL initializers allows vectors to be constructed from vectors. 89520e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i) { 89620e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 89720e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Index >= IList->getNumInits()) 89820e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 899dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 90020e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 90120e047abc5f19dc948436c0fb891450d9cd40667John McCall 90220e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType IType = IList->getInit(Index)->getType(); 90320e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!IType->isVectorType()) { 90420e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 90520e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 90620e047abc5f19dc948436c0fb891450d9cd40667John McCall ++numEltsInit; 90720e047abc5f19dc948436c0fb891450d9cd40667John McCall } else { 90820e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType VecType; 90920e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *IVT = IType->getAs<VectorType>(); 91020e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numIElts = IVT->getNumElements(); 911dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 91220e047abc5f19dc948436c0fb891450d9cd40667John McCall if (IType->isExtVectorType()) 91320e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getExtVectorType(elementType, numIElts); 91420e047abc5f19dc948436c0fb891450d9cd40667John McCall else 91520e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getVectorType(elementType, numIElts, 916e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson IVT->getVectorKind()); 91720e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, VecType, Index, 91820e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 91920e047abc5f19dc948436c0fb891450d9cd40667John McCall numEltsInit += numIElts; 92020e047abc5f19dc948436c0fb891450d9cd40667John McCall } 9210cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 92220e047abc5f19dc948436c0fb891450d9cd40667John McCall 92320e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL requires all elements to be initialized. 92420e047abc5f19dc948436c0fb891450d9cd40667John McCall if (numEltsInit != maxElements) 92520e047abc5f19dc948436c0fb891450d9cd40667John McCall if (SemaRef.getLangOptions().OpenCL) 92620e047abc5f19dc948436c0fb891450d9cd40667John McCall SemaRef.Diag(IList->getSourceRange().getBegin(), 92720e047abc5f19dc948436c0fb891450d9cd40667John McCall diag::err_vector_incorrect_num_initializers) 92820e047abc5f19dc948436c0fb891450d9cd40667John McCall << (numEltsInit < maxElements) << maxElements << numEltsInit; 9290cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 9300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 9318ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckArrayType(const InitializedEntity &Entity, 932784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 93387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt elementIndex, 9341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 9354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 9364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 9374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 9380cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // Check for the special-case of initializing an array with a string. 9390cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 94079e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner if (Expr *Str = IsStringInit(IList->getInit(Index), DeclType, 94179e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner SemaRef.Context)) { 94279e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner CheckStringInit(Str, DeclType, SemaRef); 9434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We place the string literal directly into the resulting 9444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initializer list. This is the only place where the structure 9454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // of the structured initializer list doesn't match exactly, 9464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // because doing so would involve allocating one character 9474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // constant for each string. 948f71ae8d8024561f92dd7916363e7a791684563ccChris Lattner UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 9490820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner StructuredList->resizeInits(SemaRef.Context, StructuredIndex); 9500cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 9510cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return; 9520cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 9530cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 954c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const VariableArrayType *VAT = 9550820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsVariableArrayType(DeclType)) { 956638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // Check for VLAs; in standard C it would be possible to check this 957638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // earlier, but I don't know where clang accepts VLAs (gcc accepts 958638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // them in all sorts of strange places). 9590820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(VAT->getSizeExpr()->getLocStart(), 960dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner diag::err_variable_object_no_init) 961dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << VAT->getSizeExpr()->getSourceRange(); 962638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman hadError = true; 9634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 9644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 965638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 966638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman } 967638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman 96805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We might know the maximum number of elements in advance. 9694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor llvm::APSInt maxElements(elementIndex.getBitWidth(), 9704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor elementIndex.isUnsigned()); 97105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool maxElementsKnown = false; 97205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (const ConstantArrayType *CAT = 9730820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 97405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = CAT->getSize(); 9759f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth()); 976e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 97705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElementsKnown = true; 97805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 97905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 9800820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner QualType elementType = SemaRef.Context.getAsArrayType(DeclType) 981c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner ->getElementType(); 98205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 98305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 98405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 98587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 98687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 98787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 98887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 98987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 99087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 99187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. elementIndex will be 99287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // updated to be the next array element we'll initialize. 9939a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 9944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, 0, &elementIndex, Index, 995eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, true, 996eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) { 99705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 99887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor continue; 99987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 100087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 1001f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor if (elementIndex.getBitWidth() > maxElements.getBitWidth()) 10029f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad maxElements = maxElements.extend(elementIndex.getBitWidth()); 1003f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor else if (elementIndex.getBitWidth() < maxElements.getBitWidth()) 10049f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extend(maxElements.getBitWidth()); 1005e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 1006f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor 100787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If the array is of incomplete type, keep track of the number of 100887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // elements in the initializer. 100987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 101087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor maxElements = elementIndex; 101105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 101205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 101305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 101405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 101505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we know the maximum number of elements, and we've already 101605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // hit it, stop consuming elements in the initializer list. 101705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElementsKnown && elementIndex == maxElements) 10180cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff break; 101905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 10208ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 1021dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex, 10228ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson Entity); 10238ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Check this element. 10248ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 10258ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 102605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++elementIndex; 102705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 102805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If the array is of incomplete type, keep track of the number of 102905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // elements in the initializer. 103005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 103105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = elementIndex; 10320cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1033587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman if (!hadError && DeclType->isIncompleteArrayType()) { 10340cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // If this is an incomplete array type, the actual type needs to 1035396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // be calculated here. 1036e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned()); 103705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElements == Zero) { 1038396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // Sizing an array implicitly to zero is not allowed by ISO C, 1039396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // but is supported by GNU. 10400820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 1041396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar diag::ext_typecheck_zero_array_size); 10420cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1043396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar 10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements, 1045396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar ArrayType::Normal, 0); 10460cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 10470cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 10480cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 10498ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, 10502bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, 10511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType DeclType, 105287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator Field, 10531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 10544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 10554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 1056eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 1057eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 10586217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl* structDecl = DeclType->getAs<RecordType>()->getDecl(); 10591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1060b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // If the record is invalid, some of it's members are invalid. To avoid 1061b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // confusion, we forgo checking the intializer for the entire record. 1062b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman if (structDecl->isInvalidDecl()) { 1063b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman hadError = true; 1064b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman return; 10651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 10663498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 10673498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (DeclType->isUnionType() && IList->getNumInits() == 0) { 10683498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor // Value-initialize the first named member of the union. 10696217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 107017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator FieldEnd = RD->field_end(); 10713498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor Field != FieldEnd; ++Field) { 10723498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (Field->getDeclName()) { 10733498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 10743498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor break; 10753498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10763498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10773498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return; 10783498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 10793498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 108005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If structDecl is a forward declaration, this loop won't do 108105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // anything except look at designated initializers; That's okay, 108205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // because an error should get printed out elsewhere. It might be 108305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // worthwhile to skip over the rest of the initializer, though. 10846217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 108517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RecordDecl::field_iterator FieldEnd = RD->field_end(); 1086dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor bool InitializedSomething = false; 108780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall bool CheckForMissingFields = true; 108805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 108905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 109005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 109105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 109287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 109387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 109487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 109587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 109687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 109787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 109887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. Field will be updated to 109987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the next field that we'll be initializing. 11009a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 11014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, &Field, 0, Index, 1102eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 1103eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, TopLevelObject)) 110405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 110505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1106dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 110780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 110880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Disable check for missing fields when designators are used. 110980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // This matches gcc behaviour. 111080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall CheckForMissingFields = false; 111105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 111205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 111305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 111405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field == FieldEnd) { 111505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We've run out of fields. We're done. 111644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor break; 111705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 111844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1119dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor // We've already initialized a member of a union. We're done. 1120dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor if (InitializedSomething && DeclType->isUnionType()) 1121dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor break; 1122dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor 112305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we've hit the flexible array member at the end, we're done. 112405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field->getType()->isIncompleteArrayType()) 1125b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman break; 112644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 11270bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (Field->isUnnamedBitfield()) { 11284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Don't initialize unnamed bitfields, e.g. "int : 20;" 112905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 1130b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman continue; 11310cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 113244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 11338ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 11348ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 11358ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 11368ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 1137dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 11380bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 11390bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (DeclType->isUnionType()) { 11400bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor // Initialize the first field within the union. 11410bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 11420bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 114305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 114405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 11450cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 114644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 114780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Emit warnings for missing struct field initializers. 1148dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (InitializedSomething && CheckForMissingFields && Field != FieldEnd && 114980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall !Field->getType()->isIncompleteArrayType() && !DeclType->isUnionType()) { 115080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // It is possible we have one or more unnamed bitfields remaining. 115180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Find first (if any) named field and emit warning. 115280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall for (RecordDecl::field_iterator it = Field, end = RD->field_end(); 115380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall it != end; ++it) { 115480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall if (!it->isUnnamedBitfield()) { 115580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall SemaRef.Diag(IList->getSourceRange().getEnd(), 115680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall diag::warn_missing_field_initializers) << it->getName(); 115780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall break; 115880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 115980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 116080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 116180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 11621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() || 1163a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor Index >= IList->getNumInits()) 1164eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return; 1165eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1166eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Handle GNU flexible array initializers. 11671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!TopLevelObject && 1168a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor (!isa<InitListExpr>(IList->getInit(Index)) || 1169a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor cast<InitListExpr>(IList->getInit(Index))->getNumInits() > 0)) { 11701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getInit(Index)->getSourceRange().getBegin(), 1171eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_nonempty) 1172eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << IList->getInit(Index)->getSourceRange().getBegin(); 11730820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1174eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1175eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor hadError = true; 1176a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor ++Index; 1177a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor return; 1178a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor } else { 11791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getInit(Index)->getSourceRange().getBegin(), 1180a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor diag::ext_flexible_array_init) 1181a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor << IList->getInit(Index)->getSourceRange().getBegin(); 1182a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1183a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor << *Field; 1184eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1185eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 11868ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 11878ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1188dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 11898ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (isa<InitListExpr>(IList->getInit(Index))) 1190dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 11918ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 11928ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson else 1193dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index, 1194987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson StructuredList, StructuredIndex); 11950cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 11960cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1197ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Expand a field designator that refers to a member of an 1198ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// anonymous struct or union into a series of field designators that 1199ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// refers to the field within the appropriate subobject. 1200ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// 1201ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorstatic void ExpandAnonymousFieldDesignator(Sema &SemaRef, 12021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 12031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned DesigIdx, 1204a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IndirectFieldDecl *IndirectField) { 1205ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor typedef DesignatedInitExpr::Designator Designator; 1206ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1207ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the replacement designators. 1208ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor llvm::SmallVector<Designator, 4> Replacements; 1209a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(), 1210a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet PE = IndirectField->chain_end(); PI != PE; ++PI) { 1211a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (PI + 1 == PE) 12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Replacements.push_back(Designator((IdentifierInfo *)0, 1213ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getDotLoc(), 1214ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getFieldLoc())); 1215ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor else 1216ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.push_back(Designator((IdentifierInfo *)0, SourceLocation(), 1217ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SourceLocation())); 1218a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(isa<FieldDecl>(*PI)); 1219a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Replacements.back().setField(cast<FieldDecl>(*PI)); 1220ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1221ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1222ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Expand the current designator into the set of replacement 1223ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // designators, so we have a full subobject path down to where the 1224ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // member of the anonymous struct/union is actually stored. 1225319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0], 1226ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor &Replacements[0] + Replacements.size()); 1227a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet} 12281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1229dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Given an implicit anonymous field, search the IndirectField that 1230a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet/// corresponds to FieldName. 1231a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichetstatic IndirectFieldDecl *FindIndirectFieldDesignator(FieldDecl *AnonField, 1232a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IdentifierInfo *FieldName) { 1233a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(AnonField->isAnonymousStructOrUnion()); 1234a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Decl *NextDecl = AnonField->getNextDeclInContext(); 1235a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet while (IndirectFieldDecl *IF = dyn_cast<IndirectFieldDecl>(NextDecl)) { 1236a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (FieldName && FieldName == IF->getAnonField()->getIdentifier()) 1237a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet return IF; 1238a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet NextDecl = NextDecl->getNextDeclInContext(); 1239ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1240a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet return 0; 1241ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 1242ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 124305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Check the well-formedness of a C99 designated initializer. 124405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 124505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Determines whether the designated initializer @p DIE, which 124605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// resides at the given @p Index within the initializer list @p 124705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// IList, is well-formed for a current object of type @p DeclType 124805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// (C99 6.7.8). The actual subobject that this designator refers to 12491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// within the current subobject is returned in either 12504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @p NextField or @p NextElementIndex (whichever is appropriate). 125105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 125205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param IList The initializer list in which this designated 125305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// initializer occurs. 125405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 1255711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DIE The designated initializer expression. 1256711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// 1257711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DesigIdx The index of the current designator. 125805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 125905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param DeclType The type of the "current object" (C99 6.7.8p17), 126005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// into which the designation in @p DIE should refer. 126105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 126287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextField If non-NULL and the first designator in @p DIE is 126387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// a field, this will be set to the field declaration corresponding 126487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// to the field named by the designator. 126505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 126687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextElementIndex If non-NULL and the first designator in @p 126787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// DIE is an array designator or GNU array-range designator, this 126887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// will be set to the last index initialized by this designator. 126905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 127005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param Index Index into @p IList where the designated initializer 127105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @p DIE occurs. 127205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 12734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @param StructuredList The initializer list expression that 12744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// describes all of the subobject initializers in the order they'll 12754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// actually be initialized. 12764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 127705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @returns true if there was an error, false otherwise. 12781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 12798ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders CarlssonInitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 12809a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, 12811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 1282711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 128387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor QualType &CurrentObjectType, 128487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator *NextField, 128587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt *NextElementIndex, 12864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 12874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 128834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned &StructuredIndex, 1289eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 1290eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 1291711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if (DesigIdx == DIE->size()) { 129287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the actual initialization for the designated object type. 129387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 12946fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 12956fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Temporarily remove the designator expression from the 12966fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // initializer list that the child calls see, so that we don't try 12976fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // to re-process the designator. 12986fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned OldIndex = Index; 12996fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE->getInit()); 13006fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 13019a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson CheckSubElementType(Entity, IList, CurrentObjectType, Index, 13024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 13036fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 13046fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Restore the designated initializer expression in the syntactic 13056fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // form of the initializer list. 13066fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor if (IList->getInit(OldIndex) != DIE->getInit()) 13076fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor DIE->setInit(IList->getInit(OldIndex)); 13086fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE); 13096fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 131087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 131187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 131205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1313711997184366d584c9c437102cae1e9d9927b986Douglas Gregor bool IsFirstDesignator = (DesigIdx == 0); 13141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((IsFirstDesignator || StructuredList) && 13154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor "Need a non-designated initializer list to start from"); 13164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1317711997184366d584c9c437102cae1e9d9927b986Douglas Gregor DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx); 13184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Determine the structural initializer list that corresponds to the 13194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // current subobject. 13204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList = IsFirstDesignator? SyntacticToSemantic[IList] 13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : getStructuredSubobjectInit(IList, Index, CurrentObjectType, 1322ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor StructuredList, StructuredIndex, 13234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange(D->getStartLocation(), 13244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DIE->getSourceRange().getEnd())); 13254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor assert(StructuredList && "Expected a structured initializer list"); 13264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 132787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (D->isFieldDesignator()) { 132887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p7: 132987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 133087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 133187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 133287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // . identifier 133387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 133487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have 133587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // structure or union type and the identifier shall be the 13361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // name of a member of that type. 13376217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = CurrentObjectType->getAs<RecordType>(); 133887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!RT) { 133987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation Loc = D->getDotLoc(); 134087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (Loc.isInvalid()) 134187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Loc = D->getFieldLoc(); 13420820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Loc, diag::err_field_designator_non_aggr) 13430820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner << SemaRef.getLangOptions().CPlusPlus << CurrentObjectType; 134487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 134587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 134687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 134787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 13484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Note: we perform a linear search of the fields here, despite 13494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the fact that we have a faster lookup method, because we always 13504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // need to compute the field's index. 1351ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *KnownField = D->getField(); 135287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IdentifierInfo *FieldName = D->getFieldName(); 13534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned FieldIndex = 0; 13541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator 135517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = RT->getDecl()->field_begin(), 135617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RT->getDecl()->field_end(); 13574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (; Field != FieldEnd; ++Field) { 13584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field->isUnnamedBitfield()) 13594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor continue; 1360dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1361a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet // If we find a field representing an anonymous field, look in the 1362a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet // IndirectFieldDecl that follow for the designated initializer. 1363a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (!KnownField && Field->isAnonymousStructOrUnion()) { 1364a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (IndirectFieldDecl *IF = 1365a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet FindIndirectFieldDesignator(*Field, FieldName)) { 1366a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IF); 1367a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet D = DIE->getDesignator(DesigIdx); 1368a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet break; 1369a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1370a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1371022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor if (KnownField && KnownField == *Field) 1372022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor break; 1373022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor if (FieldName && FieldName == Field->getIdentifier()) 13744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor break; 13754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 13764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 137787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 137887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 13794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field == FieldEnd) { 1380ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // There was no normal field in the struct with the designated 1381ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // name. Perform another lookup for this name, which may find 1382ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // something that we can't designate (e.g., a member function), 1383ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // may find nothing, or may find a member of an anonymous 13841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // struct/union. 138517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName); 1386c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldDecl *ReplacementField = 0; 13874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Lookup.first == Lookup.second) { 1388c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Name lookup didn't find anything. Determine whether this 1389c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // was a typo for another field name. 1390dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi LookupResult R(SemaRef, FieldName, D->getFieldLoc(), 1391c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Sema::LookupMemberName); 1392aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (SemaRef.CorrectTypo(R, /*Scope=*/0, /*SS=*/0, RT->getDecl(), false, 1393dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Sema::CTC_NoKeywords) && 1394c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor (ReplacementField = R.getAsSingle<FieldDecl>()) && 13957a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl ReplacementField->getDeclContext()->getRedeclContext() 1396c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ->Equals(RT->getDecl())) { 1397dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.Diag(D->getFieldLoc(), 1398c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor diag::err_field_designator_unknown_suggest) 1399c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType << R.getLookupName() 1400849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateReplacement(D->getFieldLoc(), 1401849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor R.getLookupName().getAsString()); 1402dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.Diag(ReplacementField->getLocation(), 140367dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor diag::note_previous_decl) 140467dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor << ReplacementField->getDeclName(); 1405c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else { 1406c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown) 1407c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType; 1408c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++Index; 1409c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor return true; 1410c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1411c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1412dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1413c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!ReplacementField) { 14144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Name lookup found something, but it wasn't a field. 14150820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield) 14164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << FieldName; 14171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag((*Lookup.first)->getLocation(), 14184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_field_designator_found); 1419ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman ++Index; 1420ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman return true; 1421ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1422c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1423a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (!KnownField) { 1424c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // The replacement field comes from typo correction; find it 1425c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // in the list of fields. 1426c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldIndex = 0; 1427c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field = RT->getDecl()->field_begin(); 1428c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor for (; Field != FieldEnd; ++Field) { 1429c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (Field->isUnnamedBitfield()) 1430c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor continue; 1431c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1432dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (ReplacementField == *Field || 1433c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field->getIdentifier() == ReplacementField->getIdentifier()) 1434c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor break; 1435c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1436c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++FieldIndex; 1437c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1438c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 143987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 14404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 14414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // All of the fields of a union are located at the same place in 14424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the initializer list. 14430bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (RT->getDecl()->isUnion()) { 14444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor FieldIndex = 0; 14450bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 14460bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 14474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 144887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Update the designator with the field declaration. 14494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor D->setField(*Field); 14501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 14524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this field. 14534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (FieldIndex >= StructuredList->getNumInits()) 14540820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1); 14554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1456eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // This designator names a flexible array member. 1457eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Field->getType()->isIncompleteArrayType()) { 1458eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool Invalid = false; 1459711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if ((DesigIdx + 1) != DIE->size()) { 1460eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // We can't designate an object within the flexible array 1461eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // member (because GCC doesn't allow it). 14621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr::Designator *NextD 1463711997184366d584c9c437102cae1e9d9927b986Douglas Gregor = DIE->getDesignator(DesigIdx + 1); 14641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(NextD->getStartLocation(), 1465eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_designator_into_flexible_array_member) 14661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << SourceRange(NextD->getStartLocation(), 1467eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor DIE->getSourceRange().getEnd()); 14680820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1469eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1470eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1471eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1472eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 14739046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner if (!hadError && !isa<InitListExpr>(DIE->getInit()) && 14749046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner !isa<StringLiteral>(DIE->getInit())) { 1475eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // The initializer is not an initializer list. 14760820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(DIE->getInit()->getSourceRange().getBegin(), 1477eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_needs_braces) 1478eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << DIE->getInit()->getSourceRange(); 14790820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1480eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1481eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1482eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1483eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1484eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Handle GNU flexible array initializers. 14851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Invalid && !TopLevelObject && 1486eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor cast<InitListExpr>(DIE->getInit())->getNumInits() > 0) { 14871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(DIE->getSourceRange().getBegin(), 1488eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_nonempty) 1489eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << DIE->getSourceRange().getBegin(); 14900820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1491eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1492eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1493eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1494eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1495eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Invalid) { 1496eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Index; 1497eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1498eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1499eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1500eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Initialize the array. 1501eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool prevHadError = hadError; 1502eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1503eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned OldIndex = Index; 1504eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(Index, DIE->getInit()); 15058ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 15068ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 15078ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 15088ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 1509eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, newStructuredIndex); 15108ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 1511eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(OldIndex, DIE); 1512eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (hadError && !prevHadError) { 1513eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Field; 1514eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++FieldIndex; 1515eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (NextField) 1516eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor *NextField = Field; 1517eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredIndex = FieldIndex; 1518eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1519eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1520eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } else { 1521eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Recurse to check later designated subobjects. 1522eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType FieldType = (*Field)->getType(); 1523eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1524dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 15259a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity MemberEntity = 15268ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1527dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1, 1528dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FieldType, 0, 0, Index, 15299a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, newStructuredIndex, 1530eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, false)) 1531eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1532eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 153387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 153487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Find the position of the next field to be initialized in this 153587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // subobject. 153687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Field; 15374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 153805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 153987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 154087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this struct/class/union subobject. 154187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 154287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextField) 154387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor *NextField = Field; 15444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = FieldIndex; 154587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 154687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 154705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 154834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 154934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 155034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1551ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // We've already initialized something in the union; we're done. 1552ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (RT->getDecl()->isUnion()) 1553ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return hadError; 1554ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 155587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining fields within this class/struct/union subobject. 155687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 1557dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 15588ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckStructUnionTypes(Entity, IList, CurrentObjectType, Field, false, Index, 15594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, FieldIndex); 156087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 156187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 156205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 156387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p6: 156487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 156587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 156687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 156787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ] 156887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 156987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have array 157087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // type and the expression shall be an integer constant 157187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // expression. If the array is of unknown size, any 157287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // nonnegative value is valid. 157387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 157487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Additionally, cope with the GNU extension that permits 157587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designators of the form 157687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 157787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ... constant-expression ] 15780820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType); 157987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!AT) { 15800820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array) 158187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor << CurrentObjectType; 158287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 158387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 158487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 158505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 158687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Expr *IndexExpr = 0; 158734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor llvm::APSInt DesignatedStartIndex, DesignatedEndIndex; 158834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (D->isArrayDesignator()) { 158987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayIndex(*D); 15903bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedStartIndex = IndexExpr->EvaluateAsInt(SemaRef.Context); 159134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex = DesignatedStartIndex; 159234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 159387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(D->isArrayRangeDesignator() && "Need array-range designator"); 15943bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 15951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedStartIndex = 15973bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DIE->getArrayRangeStart(*D)->EvaluateAsInt(SemaRef.Context); 15981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedEndIndex = 15993bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DIE->getArrayRangeEnd(*D)->EvaluateAsInt(SemaRef.Context); 160087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayRangeEnd(*D); 160134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 16023bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (DesignatedStartIndex.getZExtValue() !=DesignatedEndIndex.getZExtValue()) 1603a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor FullyStructuredList->sawArrayRangeDesignator(); 160487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 160505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 160687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (isa<ConstantArrayType>(AT)) { 160787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false); 16089f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 16099f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth()); 161034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned()); 16119f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 16129f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth()); 161334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned()); 161434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex >= MaxElements) { 16150820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IndexExpr->getSourceRange().getBegin(), 161687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor diag::err_array_designator_too_large) 161734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor << DesignatedEndIndex.toString(10) << MaxElements.toString(10) 161887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor << IndexExpr->getSourceRange(); 161987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 162087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 162105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 162234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 162334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Make sure the bit-widths and signedness match. 162434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedStartIndex.getBitWidth() > DesignatedEndIndex.getBitWidth()) 16259f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 16269f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extend(DesignatedStartIndex.getBitWidth()); 16273bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner else if (DesignatedStartIndex.getBitWidth() < 16283bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedEndIndex.getBitWidth()) 16299f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 16309f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extend(DesignatedEndIndex.getBitWidth()); 163134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(true); 163234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(true); 163305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 16341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 16364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this array element. 163734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits()) 16381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredList->resizeInits(SemaRef.Context, 163934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.getZExtValue() + 1); 164034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 164134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Repeatedly perform subobject initializations in the range 164234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // [DesignatedStartIndex, DesignatedEndIndex]. 164334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 164434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next designator 164534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned ElementIndex = DesignatedStartIndex.getZExtValue(); 164634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned OldIndex = Index; 1647dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 16489a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity ElementEntity = 16498ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 16509a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 165134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor while (DesignatedStartIndex <= DesignatedEndIndex) { 165234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Recurse to check later designated subobjects. 165334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor QualType ElementType = AT->getElementType(); 165434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor Index = OldIndex; 1655dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 16569a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementEntity.setElementIndex(ElementIndex); 1657dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(ElementEntity, IList, DIE, DesigIdx + 1, 1658dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementType, 0, 0, Index, 16599a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, ElementIndex, 1660eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor (DesignatedStartIndex == DesignatedEndIndex), 1661eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) 166234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return true; 166387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 166434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next index in the array that we'll be initializing. 166534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ++DesignatedStartIndex; 166634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ElementIndex = DesignatedStartIndex.getZExtValue(); 166734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } 166887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 166987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 167087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this array subobject. 167187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 167287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextElementIndex) 167334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor *NextElementIndex = DesignatedStartIndex; 16744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = ElementIndex; 167587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 167687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 16771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 167934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 168034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 168187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining elements within this array subobject. 168205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool prevHadError = hadError; 1683dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex, 1684784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 16854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, ElementIndex); 16861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return hadError && !prevHadError; 168705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 168805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 16894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// Get the structured initializer list for a subobject of type 16904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// @p CurrentObjectType. 16914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListExpr * 16924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 16934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType CurrentObjectType, 16944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 16954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredIndex, 16964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange InitRange) { 16974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *ExistingInit = 0; 16984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 16994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = SyntacticToSemantic[IList]; 17004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else if (StructuredIndex < StructuredList->getNumInits()) 17014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = StructuredList->getInit(StructuredIndex); 17021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit)) 17044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 17054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (ExistingInit) { 17074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We are creating an initializer list that initializes the 17084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobjects of the current object, but there was already an 17094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initialization that completely initialized the current 17104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject, e.g., by a compound literal: 17111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 17124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X { int a, b; }; 17134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 }; 17141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 17154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Here, xs[0].a == 0 and xs[0].b == 3, since the second, 17164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // designated initializer re-initializes the whole 17174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject [0], overwriting previous initializers. 17181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(InitRange.getBegin(), 1719ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor diag::warn_subobject_initializer_overrides) 17204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << InitRange; 17211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(ExistingInit->getSourceRange().getBegin(), 17224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 172354f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 17244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << ExistingInit->getSourceRange(); 17254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 17264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *Result 1728709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek = new (SemaRef.Context) InitListExpr(SemaRef.Context, 1729709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitRange.getBegin(), 0, 0, 1730ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek InitRange.getEnd()); 1731ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor 17326398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor Result->setType(CurrentObjectType.getNonLValueExprType(SemaRef.Context)); 17334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1734fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Pre-allocate storage for the structured initializer list. 1735fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor unsigned NumElements = 0; 173608457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor unsigned NumInits = 0; 173708457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (!StructuredList) 173808457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = IList->getNumInits(); 173908457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor else if (Index < IList->getNumInits()) { 174008457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) 174108457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = SubList->getNumInits(); 174208457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor } 174308457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor 17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ArrayType *AType 1745fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor = SemaRef.Context.getAsArrayType(CurrentObjectType)) { 1746fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) { 1747fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = CAType->getSize().getZExtValue(); 1748fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Simple heuristic so that we don't allocate a very large 1749fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // initializer with many empty entries at the end. 175008457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (NumInits && NumElements > NumInits) 1751fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 0; 1752fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 1753183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) 1754fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = VType->getNumElements(); 17556217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const RecordType *RType = CurrentObjectType->getAs<RecordType>()) { 1756fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor RecordDecl *RDecl = RType->getDecl(); 1757fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (RDecl->isUnion()) 1758fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 1; 1759fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor else 17601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumElements = std::distance(RDecl->field_begin(), 176117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RDecl->field_end()); 1762fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 1763fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 176408457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (NumElements < NumInits) 1765fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = IList->getNumInits(); 1766fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 1767709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Result->reserveInits(SemaRef.Context, NumElements); 1768fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 17694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Link this new initializer list into the structured initializer 17704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // lists. 17714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (StructuredList) 1772709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result); 17734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else { 17744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Result->setSyntacticForm(IList); 17754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = Result; 17764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 17774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 17794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 17804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Update the initializer at index @p StructuredIndex within the 17824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// structured initializer list to the value @p expr. 17834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregorvoid InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, 17844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex, 17854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *expr) { 17864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // No structured initializer list to update 17874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 17884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 17894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1790709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, 1791709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredIndex, expr)) { 17924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // This initializer overwrites a previous initializer. Warn. 17931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(expr->getSourceRange().getBegin(), 17944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::warn_initializer_overrides) 17954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << expr->getSourceRange(); 17961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(PrevInit->getSourceRange().getBegin(), 17974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 179854f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 17994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << PrevInit->getSourceRange(); 18004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 18011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 18034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 18044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 180505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Check that the given Index expression is a valid array designator 180605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// value. This is essentailly just a wrapper around 18073bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner/// VerifyIntegerConstantExpression that also checks for negative values 180805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// and produces a reasonable diagnostic if there is a 180905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// failure. Returns true if there was an error, false otherwise. If 181005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// everything went okay, Value will receive the value of the constant 181105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// expression. 18121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool 18133bf6893b77c30cb774100e0fa7ae029331675ec1Chris LattnerCheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) { 181405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation Loc = Index->getSourceRange().getBegin(); 181505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 181605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Make sure this is an integer constant expression. 18173bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (S.VerifyIntegerConstantExpression(Index, &Value)) 18183bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return true; 18193bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 18203bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (Value.isSigned() && Value.isNegative()) 18213bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return S.Diag(Loc, diag::err_array_designator_negative) 182205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << Value.toString(10) << Index->getSourceRange(); 182305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 182453d3d8e0662197f7245d8f5ff697a72a2b4b3f54Douglas Gregor Value.setIsUnsigned(true); 182505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return false; 182605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 182705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 182860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, 18297663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky SourceLocation Loc, 18307663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky bool GNUSyntax, 18317663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky ExprResult Init) { 183205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef DesignatedInitExpr::Designator ASTDesignator; 183305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 183405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool Invalid = false; 183505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::SmallVector<ASTDesignator, 32> Designators; 183605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::SmallVector<Expr *, 32> InitExpressions; 183705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 183805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Build designators and check array designator expressions. 183905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) { 184005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor const Designator &D = Desig.getDesignator(Idx); 184105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor switch (D.getKind()) { 184205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::FieldDesignator: 18431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(), 184405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getFieldLoc())); 184505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 184605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 184705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayDesignator: { 184805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Index = static_cast<Expr *>(D.getArrayIndex()); 184905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt IndexValue; 18509ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (!Index->isTypeDependent() && 18519ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor !Index->isValueDependent() && 18529ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, Index, IndexValue)) 185305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 185405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else { 185505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 18561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 185705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getRBracketLoc())); 185805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor InitExpressions.push_back(Index); 185905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 186005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 186105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 186205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 186305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayRangeDesignator: { 186405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart()); 186505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd()); 186605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt StartValue; 186705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt EndValue; 18689ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool StartDependent = StartIndex->isTypeDependent() || 18699ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor StartIndex->isValueDependent(); 18709ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool EndDependent = EndIndex->isTypeDependent() || 18719ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor EndIndex->isValueDependent(); 18729ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if ((!StartDependent && 18739ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, StartIndex, StartValue)) || 18749ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor (!EndDependent && 18759ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, EndIndex, EndValue))) 187605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 1877d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else { 1878d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor // Make sure we're comparing values with the same bit width. 18799ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (StartDependent || EndDependent) { 18809ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Nothing to compute. 18819ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (StartValue.getBitWidth() > EndValue.getBitWidth()) 18829f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad EndValue = EndValue.extend(StartValue.getBitWidth()); 1883d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else if (StartValue.getBitWidth() < EndValue.getBitWidth()) 18849f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad StartValue = StartValue.extend(EndValue.getBitWidth()); 1885d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor 1886c4bb7bfe8328f79004517dd268f6146c8066c205Douglas Gregor if (!StartDependent && !EndDependent && EndValue < StartValue) { 1887d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range) 18881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << StartValue.toString(10) << EndValue.toString(10) 1889d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor << StartIndex->getSourceRange() << EndIndex->getSourceRange(); 1890d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Invalid = true; 1891d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } else { 1892d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 18931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 1894d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getEllipsisLoc(), 1895d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getRBracketLoc())); 1896d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(StartIndex); 1897d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(EndIndex); 1898d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } 189905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 190005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 190105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 190205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 190305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 190405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 190505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Invalid || Init.isInvalid()) 190605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return ExprError(); 190705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 190805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Clear out the expressions within the designation. 190905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Desig.ClearExprs(*this); 191005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 191105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor DesignatedInitExpr *DIE 1912beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad = DesignatedInitExpr::Create(Context, 1913beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Designators.data(), Designators.size(), 1914beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad InitExpressions.data(), InitExpressions.size(), 1915e9146f2e9f1c4e281544e8c080934c72d41012caAnders Carlsson Loc, GNUSyntax, Init.takeAs<Expr>()); 1916dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 19172d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor if (getLangOptions().CPlusPlus) 19182d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor Diag(DIE->getLocStart(), diag::ext_designated_init) 19192d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor << DIE->getSourceRange(); 1920dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 192105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return Owned(DIE); 192205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 1923c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 1924cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregorbool Sema::CheckInitList(const InitializedEntity &Entity, 1925cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *&InitList, QualType &DeclType) { 1926cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker CheckInitList(*this, Entity, InitList, DeclType); 1927c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor if (!CheckInitList.HadError()) 1928c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitList = CheckInitList.getFullyStructuredList(); 1929c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 1930c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor return CheckInitList.HadError(); 1931c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor} 193287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 1933cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 1934cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor// Initialization entity 1935cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 193639da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor 1937dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index, 1938cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor const InitializedEntity &Parent) 1939dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi : Parent(&Parent), Index(Index) 1940cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor{ 1941d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) { 1942d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_ArrayElement; 1943d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = AT->getElementType(); 1944d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } else { 1945d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_VectorElement; 1946d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = Parent.getType()->getAs<VectorType>()->getElementType(); 1947d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } 194820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 194920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 1950dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity InitializedEntity::InitializeBase(ASTContext &Context, 1951711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson CXXBaseSpecifier *Base, 1952711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson bool IsInheritedVirtualBase) 195320093b4bf698f292c664676987541d5103b65b15Douglas Gregor{ 195420093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializedEntity Result; 195520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Kind = EK_Base; 1956711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base = reinterpret_cast<uintptr_t>(Base); 1957711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson if (IsInheritedVirtualBase) 1958711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base |= 0x01; 1959dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1960d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Result.Type = Base->getType(); 196120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 196220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 196320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 196499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas GregorDeclarationName InitializedEntity::getName() const { 196599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (getKind()) { 196699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Parameter: 1967a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor if (!VariableOrMember) 1968a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor return DeclarationName(); 1969a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor // Fall through 1970a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor 1971a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor case EK_Variable: 197299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Member: 197399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return VariableOrMember->getDeclName(); 197499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 197599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Result: 197699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Exception: 197718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case EK_New: 197899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Temporary: 197999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Base: 1980d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 1981d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 1982310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 198399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 198499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 1985dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 198699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Silence GCC warning 198799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 198899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 198999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 19907abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas GregorDeclaratorDecl *InitializedEntity::getDecl() const { 19917abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor switch (getKind()) { 19927abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Variable: 19937abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Parameter: 19947abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Member: 19957abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return VariableOrMember; 19967abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 19977abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Result: 19987abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Exception: 19997abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_New: 20007abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Temporary: 20017abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Base: 2002d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2003d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 2004310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 20057abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 20067abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor } 2007dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 20087abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor // Silence GCC warning 20097abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 20107abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor} 20117abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 20123c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregorbool InitializedEntity::allowsNRVO() const { 20133c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor switch (getKind()) { 20143c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Result: 20153c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Exception: 20163c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return LocAndNRVO.NRVO; 2017dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 20183c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Variable: 20193c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Parameter: 20203c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Member: 20213c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_New: 20223c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Temporary: 20233c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Base: 20243c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_ArrayElement: 20253c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_VectorElement: 2026310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 20273c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor break; 20283c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor } 20293c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 20303c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return false; 20313c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor} 20323c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 203320093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 203420093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Initialization sequence 203520093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 203620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 203720093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::Step::Destroy() { 203820093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Kind) { 203920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 204020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 2041906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 204220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: 204320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 204420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 2045523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 204620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: 204720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 2048906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 204920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 2050d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: 205151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: 205271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: 205318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 2054cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 2055569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 205620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 2057dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 205820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 205920093b4bf698f292c664676987541d5103b65b15Douglas Gregor delete ICS; 206020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 206120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 206220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2063b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isDirectReferenceBinding() const { 2064b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return getKind() == ReferenceBinding && Steps.back().Kind == SK_BindReference; 2065b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2066b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2067b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isAmbiguous() const { 2068b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor if (getKind() != FailedSequence) 2069b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2070dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2071b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor switch (getFailureKind()) { 2072b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForReference: 2073b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitList: 2074b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 2075b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_AddressOfOverloadFailed: // FIXME: Could do better 2076b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 2077b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 2078b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_RValueReferenceBindingToLValue: 2079b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitDropsQualifiers: 2080b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitFailed: 2081b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConversionFailed: 2082b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForScalar: 2083b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceBindingToInitList: 2084b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_InitListBadDestinationType: 2085b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_DefaultInitOfConst: 208672a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 2087b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2088dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2089b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitOverloadFailed: 2090b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_UserConversionOverloadFailed: 2091b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConstructorOverloadFailed: 2092b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return FailedOverloadResult == OR_Ambiguous; 2093b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor } 2094dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2095b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2096b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2097b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2098d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregorbool InitializationSequence::isConstructorInitialization() const { 2099d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization; 2100d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor} 2101d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor 210220093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddAddressOverloadResolutionStep( 21036bb8017bb9e828d118e15e59d71c66bba323c364John McCall FunctionDecl *Function, 21046bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found) { 210520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 210620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ResolveAddressOfOverloadedFunction; 210720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Function->getType(); 21089aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 21096bb8017bb9e828d118e15e59d71c66bba323c364John McCall S.Function.FoundDecl = Found; 211020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 211120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 211220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2113dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType, 21145baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 211520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 21165baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 21175baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: S.Kind = SK_CastDerivedToBaseRValue; break; 21185baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break; 21195baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break; 2120906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl default: llvm_unreachable("No such category"); 2121906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 212220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = BaseType; 212320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 212420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 212520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2126dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddReferenceBindingStep(QualType T, 212720093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool BindingTemporary) { 212820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 212920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference; 213020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 213120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 213220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 213320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2134523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregorvoid InitializationSequence::AddExtraneousCopyToTemporary(QualType T) { 2135523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Step S; 2136523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Kind = SK_ExtraneousCopyToTemporary; 2137523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Type = T; 2138523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Steps.push_back(S); 2139523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor} 2140523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 214103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedmanvoid InitializationSequence::AddUserConversionStep(FunctionDecl *Function, 21429aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl, 214303981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman QualType T) { 214420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 214520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_UserConversion; 214603981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman S.Type = T; 21479aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 21489aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = FoundDecl; 214920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 215020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 215120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 215220093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddQualificationConversionStep(QualType Ty, 21535baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 215420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 215538a4ffe5244e6be46f1b1f8394342a77836be776John McCall S.Kind = SK_QualificationConversionRValue; // work around a gcc warning 21565baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 21575baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: 2158906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionRValue; 2159906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 21605baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: 2161906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionXValue; 2162906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 21635baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: 2164906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionLValue; 2165906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 2166906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 216720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Ty; 216820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 216920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 217020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 217120093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddConversionSequenceStep( 217220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const ImplicitConversionSequence &ICS, 217320093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T) { 217420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 217520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ConversionSequence; 217620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 217720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ICS = new ImplicitConversionSequence(ICS); 217820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 217920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 218020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2181d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorvoid InitializationSequence::AddListInitializationStep(QualType T) { 2182d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Step S; 2183d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Kind = SK_ListInitialization; 2184d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Type = T; 2185d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Steps.push_back(S); 2186d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor} 2187d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2188dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 218951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas GregorInitializationSequence::AddConstructorInitializationStep( 219051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor, 2191b13b737a2450167c82e148590e8019b839ce6b98John McCall AccessSpecifier Access, 219251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor QualType T) { 219351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Step S; 219451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Kind = SK_ConstructorInitialization; 219551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Type = T; 21969aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Constructor; 21979aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = DeclAccessPair::make(Constructor, Access); 219851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Steps.push_back(S); 219951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor} 220051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 220171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorvoid InitializationSequence::AddZeroInitializationStep(QualType T) { 220271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Step S; 220371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Kind = SK_ZeroInitialization; 220471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Type = T; 220571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Steps.push_back(S); 220671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 220771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 220818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorvoid InitializationSequence::AddCAssignmentStep(QualType T) { 220918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step S; 221018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Kind = SK_CAssignment; 221118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Type = T; 221218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Steps.push_back(S); 221318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 221418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 2215cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedmanvoid InitializationSequence::AddStringInitStep(QualType T) { 2216cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Step S; 2217cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Kind = SK_StringInit; 2218cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Type = T; 2219cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Steps.push_back(S); 2220cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman} 2221cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2222569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorvoid InitializationSequence::AddObjCObjectConversionStep(QualType T) { 2223569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Step S; 2224569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Kind = SK_ObjCObjectConversion; 2225569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Type = T; 2226569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Steps.push_back(S); 2227569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 2228569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 2229dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::SetOverloadFailure(FailureKind Failure, 223020093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Result) { 223120093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = FailedSequence; 223220093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->Failure = Failure; 223320093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->FailedOverloadResult = Result; 223420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 223520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 223620093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 223720093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Attempt initialization 223820093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 223920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2240dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Attempt list initialization (C++0x [dcl.init.list]) 2241dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryListInitialization(Sema &S, 224220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 224320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 224420093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitListExpr *InitList, 224520093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2246d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We only perform rudimentary checking of list 2247d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // initializations at this point, then assume that any list 2248d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // initialization of an array, aggregate, or scalar will be 224936c28db83d2141ca4e74c4d2e92be5a3a772e2c3Sebastian Redl // well-formed. When we actually "perform" list initialization, we'll 2250d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // do all of the necessary checking. C++0x initializer lists will 2251d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // force us to perform more checking here. 2252d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ListInitialization); 2253d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2254d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 2255d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2256d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // C++ [dcl.init]p13: 2257dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // If T is a scalar type, then a declaration of the form 2258d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2259d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // T x = { a }; 2260d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2261d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // is equivalent to 2262d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // 2263d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // T x = a; 2264d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (DestType->isScalarType()) { 2265d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (InitList->getNumInits() > 1 && S.getLangOptions().CPlusPlus) { 2266d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar); 2267d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 2268d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 2269d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2270d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume scalar initialization from a single value works. 2271d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isAggregateType()) { 2272d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume aggregate initialization works. 2273d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isVectorType()) { 2274d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Assume vector initialization works. 2275d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isReferenceType()) { 2276d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: C++0x defines behavior for this. 2277d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList); 2278d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 2279d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } else if (DestType->isRecordType()) { 2280d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: C++0x defines behavior for this 2281d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType); 2282d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 2283d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2284d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Add a general "list initialization" step. 2285d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Sequence.AddListInitializationStep(DestType); 228620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 228720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 228820093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Try a reference initialization that involves calling a conversion 228920093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// function. 229020093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic OverloadingResult TryRefInitWithConversionFunction(Sema &S, 229120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 229220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 229320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 229420093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowRValues, 229520093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2296d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 229720093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 229820093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T1 = cv1T1.getUnqualifiedType(); 229920093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 230020093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T2 = cv2T2.getUnqualifiedType(); 230120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 230220093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase; 2303569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion; 2304dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi assert(!S.CompareReferenceRelationship(Initializer->getLocStart(), 2305569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T1, T2, DerivedToBase, 2306569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor ObjCConversion) && 230720093b4bf698f292c664676987541d5103b65b15Douglas Gregor "Must have incompatible references when binding via conversion"); 230860cfcecaf48e4310339dcfbdb0e3f0e6d2853855Chandler Carruth (void)DerivedToBase; 2309569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor (void)ObjCConversion; 231020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 231120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the candidate set directly in the initialization sequence 231220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // structure, so that it will persist if we fail. 231320093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 231420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CandidateSet.clear(); 231520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 231620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 231720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 231820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 2319dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 232020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const RecordType *T1RecordType = 0; 23216b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) && 23226b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T1, 0)) { 232320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 232420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to see if there is a suitable conversion. 232520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl()); 2326572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall 232720093b4bf698f292c664676987541d5103b65b15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 2328e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(T1RecordDecl); 232920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Con != ConEnd; ++Con) { 23309aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 23319aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 23329aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 233320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Find the constructor (which may be a template). 233420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConstructorDecl *Constructor = 0; 23359aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 233620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 233720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 233820093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 233920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 23409aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 2341dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 234220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Constructor->isInvalidDecl() && 234320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 234420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 23459aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 234686820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 2347b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis &Initializer, 1, CandidateSet, 2348b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 234920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 23509aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 2351b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis &Initializer, 1, CandidateSet, 2352b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 235320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2354dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 235520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2356572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl()) 2357572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 2358dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23596b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor const RecordType *T2RecordType = 0; 23606b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if ((T2RecordType = T2->getAs<RecordType>()) && 23616b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T2, 0)) { 236220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting from is a class type, enumerate its conversion 236320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions. 236420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl()); 236520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2366eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 236720093b4bf698f292c664676987541d5103b65b15Douglas Gregor = T2RecordDecl->getVisibleConversionFunctions(); 2368eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 2369eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall E = Conversions->end(); I != E; ++I) { 237020093b4bf698f292c664676987541d5103b65b15Douglas Gregor NamedDecl *D = *I; 237120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 237220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<UsingShadowDecl>(D)) 237320093b4bf698f292c664676987541d5103b65b15Douglas Gregor D = cast<UsingShadowDecl>(D)->getTargetDecl(); 2374dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 237520093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 237620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConversionDecl *Conv; 237720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 237820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 237920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 23804680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Conv = cast<CXXConversionDecl>(D); 2381dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 238220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the conversion function doesn't return a reference type, 238320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // it can't be considered for this conversion unless we're allowed to 238420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // consider rvalues. 2385dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Do we need to make sure that we only consider conversion 2386dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // candidates with reference-compatible results? That might be needed to 238720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // break recursion. 238820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if ((AllowExplicit || !Conv->isExplicit()) && 238920093b4bf698f292c664676987541d5103b65b15Douglas Gregor (AllowRValues || Conv->getConversionType()->isLValueReferenceType())){ 239020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 23919aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 239286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, 2393564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor DestType, CandidateSet); 239420093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 23959aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 2396564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor Initializer, DestType, CandidateSet); 239720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 239820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 239920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2400572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl()) 2401572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 2402dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 240320093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 240420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2405dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 240620093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 2407dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (OverloadingResult Result 24088fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) 240920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 241003981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 241120093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function = Best->Function; 241203981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 241303981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Compute the returned type of the conversion. 241420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<CXXConversionDecl>(Function)) 241520093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = Function->getResultType(); 241620093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 241720093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv1T1; 241803981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 241903981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Add the user-defined conversion step. 24209aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, 24216398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor T2.getNonLValueExprType(S.Context)); 242203981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 2423dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Determine whether we need to perform derived-to-base or 242403981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // cv-qualification adjustments. 24255baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = VK_RValue; 2426906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl if (T2->isLValueReferenceType()) 24275baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = VK_LValue; 2428906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl else if (const RValueReferenceType *RRef = T2->getAs<RValueReferenceType>()) 24295baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue; 2430906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 243120093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool NewDerivedToBase = false; 2432569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool NewObjCConversion = false; 243320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult NewRefRelationship 2434dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi = S.CompareReferenceRelationship(DeclLoc, T1, 24356398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor T2.getNonLValueExprType(S.Context), 2436569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor NewDerivedToBase, NewObjCConversion); 2437a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor if (NewRefRelationship == Sema::Ref_Incompatible) { 2438a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // If the type we've converted to is not reference-related to the 2439a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // type we're looking for, then there is another conversion step 2440a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // we need to perform to produce a temporary of the right type 2441a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // that we'll be binding to. 2442a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ImplicitConversionSequence ICS; 2443a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.setStandard(); 2444a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.Standard = Best->FinalConversion; 2445a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor T2 = ICS.Standard.getToType(2); 2446a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor Sequence.AddConversionSequenceStep(ICS, T2); 2447a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor } else if (NewDerivedToBase) 244820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 244920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getQualifiedType(T1, 2450dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi T2.getNonReferenceType().getQualifiers()), 24515baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK); 2452569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (NewObjCConversion) 2453569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 2454569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, 2455569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T2.getNonReferenceType().getQualifiers())); 2456569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 245720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (cv1T1.getQualifiers() != T2.getNonReferenceType().getQualifiers()) 24585baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK); 2459dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 246020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, !T2->isReferenceType()); 246120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return OR_Success; 246220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 2463dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2464dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Attempt reference initialization (C++0x [dcl.init.ref]) 2465dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryReferenceInitialization(Sema &S, 246620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 246720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 246820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 246920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 247020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ReferenceBinding); 24714680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 2472d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 247320093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 24745535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T1Quals; 24755535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 247620093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 24775535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T2Quals; 24785535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 247920093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 24804680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 248120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the initializer is the address of an overloaded function, try 248220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to resolve the overloaded function. If all goes well, T2 is the 248320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type of the resulting function. 248420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) { 24856bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found; 2486dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (FunctionDecl *Fn = S.ResolveAddressOfOverloadedFunction(Initializer, 24873afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor T1, 24883afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor false, 24893afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Found)) { 24903afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.AddAddressOverloadResolutionStep(Fn, Found); 24913afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor cv2T2 = Fn->getType(); 24923afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor T2 = cv2T2.getUnqualifiedType(); 24933afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor } else if (!T1->isRecordType()) { 249420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 249520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 249620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 249720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 24984680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 249920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Compute some basic properties of the types and the initializer. 250020093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isLValueRef = DestType->isLValueReferenceType(); 250120093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isRValueRef = !isLValueRef; 250220093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase = false; 2503569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion = false; 25044680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Expr::Classification InitCategory = Initializer->Classify(S.Context); 250520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult RefRelationship 2506569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase, 2507569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor ObjCConversion); 25084680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 250920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p5: 2510dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // A reference to type "cv1 T1" is initialized by an expression of type 251120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // "cv2 T2" as follows: 251220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 2513dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the reference is an lvalue reference and the initializer 251420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // expression 25154680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // Note the analogous bullet points for rvlaue refs to functions. Because 25164680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // there are no function rvalues in C++, rvalue refs to functions are treated 25174680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // like lvalue refs. 251820093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult ConvOvlResult = OR_Success; 25194680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl bool T1Function = T1->isFunctionType(); 25204680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (isLValueRef || T1Function) { 2521dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (InitCategory.isLValue() && 252214d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 2523dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 252414d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related))) { 2525dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - is an lvalue (but is not a bit-field), and "cv1 T1" is 252620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2," or 252720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 2528dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Per C++ [over.best.ics]p2, we don't diagnose whether the lvalue is a 252920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // bit-field when we're determining whether the reference initialization 2530de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // can occur. However, we do pay attention to whether it is a bit-field 2531de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // to decide whether we're actually binding to a temporary created from 2532de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // the bit-field. 253320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 253420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 2535dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Context.getQualifiedType(T1, T2Quals), 25365baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue); 2537569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (ObjCConversion) 2538569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 2539569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 2540569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 25415535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 25425baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK_LValue); 2543de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor bool BindingTemporary = T1Quals.hasConst() && !T1Quals.hasVolatile() && 2544093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson (Initializer->getBitField() || Initializer->refersToVectorElement()); 2545de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, BindingTemporary); 254620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 254720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2548dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2549dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 2550dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 2551dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible 2552dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // with "cv3 T3" (this conversion is selected by enumerating the 255320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // applicable conversion functions (13.3.1.6) and choosing the best 255420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // one through overload resolution (13.3)), 25554680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // If we have an rvalue ref to function type here, the rhs must be 25564680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // an rvalue. 25574680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() && 25584680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl (isLValueRef || InitCategory.isRValue())) { 2559dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, Kind, 256020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer, 25614680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl /*AllowRValues=*/isRValueRef, 256220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 256320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult == OR_Success) 256420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 25651d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ConvOvlResult != OR_No_Viable_Function) { 25661d31833450e6d2947a33cb0840d87661d92eec07John McCall Sequence.SetOverloadFailure( 25671d31833450e6d2947a33cb0840d87661d92eec07John McCall InitializationSequence::FK_ReferenceInitOverloadFailed, 25681d31833450e6d2947a33cb0840d87661d92eec07John McCall ConvOvlResult); 25691d31833450e6d2947a33cb0840d87661d92eec07John McCall } 257020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 257120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 25724680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 2573dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, the reference shall be an lvalue reference to a 257420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // non-volatile const type (i.e., cv1 shall be const), or the reference 257569d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor // shall be an rvalue reference. 2576b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile())) { 25773afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 25783afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 25793afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 258020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 258120093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 258220093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 2583b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor else 25844680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Sequence.SetFailed(InitCategory.isLValue() 258520093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? (RefRelationship == Sema::Ref_Related 258620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? InitializationSequence::FK_ReferenceInitDropsQualifiers 258720093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToUnrelated) 258820093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 25894680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 259020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 259120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 25924680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 2593c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - If the initializer expression 2594c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - is an xvalue, class prvalue, array prvalue, or function lvalue and 2595c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // "cv1 T1" is reference-compatible with "cv2 T2" 2596c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // Note: functions are handled below. 2597c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (!T1Function && 259814d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 2599dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 260014d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related)) && 2601c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isXValue() || 2602c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isRecordType()) || 2603c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isArrayType()))) { 2604c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ExprValueKind ValueKind = InitCategory.isXValue()? VK_XValue : VK_RValue; 2605c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (InitCategory.isPRValue() && T2->isRecordType()) { 2606523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the 2607523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // compiler the freedom to perform a copy here or bind to the 2608523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object, while C++0x requires that we bind directly to the 2609523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object. Hence, we always bind to the object without making an 2610523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // extra copy. However, in C++03 requires that we check for the 2611523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // presence of a suitable copy constructor: 2612523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // 2613523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The constructor that would be used to make the copy shall 2614523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // be callable whether or not the copy is actually done. 2615f57258bb96799957085080027a9c9eefe36c3417Francois Pichet if (!S.getLangOptions().CPlusPlus0x && !S.getLangOptions().Microsoft) 2616523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Sequence.AddExtraneousCopyToTemporary(cv2T2); 261720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2618dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2619c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (DerivedToBase) 2620c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddDerivedToBaseCastStep(S.Context.getQualifiedType(T1, T2Quals), 2621c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ValueKind); 2622c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor else if (ObjCConversion) 2623c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddObjCObjectConversionStep( 2624c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 2625dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2626c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T1Quals != T2Quals) 2627c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddQualificationConversionStep(cv1T1, ValueKind); 2628dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Sequence.AddReferenceBindingStep(cv1T1, 2629c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor /*bindingTemporary=*/(InitCategory.isPRValue() && !T2->isArrayType())); 2630dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi return; 2631c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor } 2632dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2633dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 2634dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 2635c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // xvalue, class prvalue, or function lvalue of type "cv3 T3", 2636c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // where "cv1 T1" is reference-compatible with "cv3 T3", 2637c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T2->isRecordType()) { 263820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible) { 263920093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, 264020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind, Initializer, 264120093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowRValues=*/true, 264220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 264320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult) 264420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 264520093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 264620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 2647dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 264820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 264920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2650dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 265120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 265220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 265320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 26540099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi 26550099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi // - Otherwise, a temporary of type "cv1 T1" is created and initialized 265620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // from the initializer expression using the rules for a non-reference 2657dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy initialization (8.5). The reference is then bound to the 265820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // temporary. [...] 2659369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 266020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 266120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 266220093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct); 2663369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 2664369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 2665369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 2666369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall if (S.TryImplicitConversion(Sequence, TempEntity, Initializer, 2667369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*SuppressUserConversions*/ false, 2668369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall AllowExplicit, 266914d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*FIXME:InOverloadResolution=*/false, 267014d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*CStyle=*/Kind.isCStyleOrFunctionalCast())) { 267120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Use the conversion function set stored in ICS to turn 267220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // this into an overloading ambiguity diagnostic. However, we need 267320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to keep that set as an OverloadCandidateSet rather than as some 267420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // other kind of set. 267518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 267618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetOverloadFailure( 267718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 267818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor ConvOvlResult); 26793afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 26803afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 268118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 268218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed); 268320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 268420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 268520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 268620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // [...] If T1 is reference-related to T2, cv1 must be the 268720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // same cv-qualification as, or greater cv-qualification 268820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // than, cv2; otherwise, the program is ill-formed. 26895535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T1CVRQuals = T1Quals.getCVRQualifiers(); 26905535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T2CVRQuals = T2Quals.getCVRQualifiers(); 2691dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship == Sema::Ref_Related && 26925535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth (T1CVRQuals | T2CVRQuals) != T1CVRQuals) { 269320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 269420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 269520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 269620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2697dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // [...] If T1 is reference-related to T2 and the reference is an rvalue 2698b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor // reference, the initializer expression shall not be an lvalue. 2699dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship >= Sema::Ref_Related && !isLValueRef && 2700b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitCategory.isLValue()) { 2701b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor Sequence.SetFailed( 2702b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitializationSequence::FK_RValueReferenceBindingToLValue); 2703b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor return; 2704b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor } 2705dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 270620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 270720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 270820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 270920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 271020093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt character array initialization from a string literal 2711dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// (C++ [dcl.init.string], C99 6.7.8). 2712dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryStringLiteralInitialization(Sema &S, 271320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 271420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 271520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 271620093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2717cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Sequence.setSequenceKind(InitializationSequence::StringInit); 2718d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddStringInitStep(Entity.getType()); 271920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 272020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 272120093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt initialization by constructor (C++ [dcl.init]), which 272220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// enumerates the constructors of the initialized entity and performs overload 272320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// resolution to select the best. 2724dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryConstructorInitialization(Sema &S, 272520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 272620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 272720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs, 272871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor QualType DestType, 272920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 27302f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ConstructorInitialization); 2731dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 273251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build the candidate set directly in the initialization sequence 273351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // structure, so that it will persist if we fail. 273451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 273551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CandidateSet.clear(); 2736dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 273751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 273851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // explicit conversion operators. 273951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct || 274051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getKind() == InitializationKind::IK_Value || 27412f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Kind.getKind() == InitializationKind::IK_Default); 2742087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor 2743087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // The type we're constructing needs to be complete. 2744087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 274572a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_Incomplete); 2746087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor return; 2747087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 2748dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 274951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 275051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // to see if one is suitable. 275151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor const RecordType *DestRecordType = DestType->getAs<RecordType>(); 2752dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi assert(DestRecordType && "Constructor initialization requires record type"); 275351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXRecordDecl *DestRecordDecl 275451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 2755dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 275651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 2757e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl); 275851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Con != ConEnd; ++Con) { 27599aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 27609aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 2761d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor bool SuppressUserConversions = false; 2762dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 276351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Find the constructor (which may be a template). 276451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor = 0; 27659aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 276651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 276751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 276851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 2769d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor else { 27709aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 2771d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor 2772dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // If we're performing copy initialization using a copy constructor, we 2773d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor // suppress user-defined conversions on the arguments. 2774d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor // FIXME: Move constructors? 2775d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Copy && 2776d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Constructor->isCopyConstructor()) 2777d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions = true; 2778d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor } 2779dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 278051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (!Constructor->isInvalidDecl() && 278199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (AllowExplicit || !Constructor->isExplicit())) { 278251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 27839aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 278486820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 2785d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Args, NumArgs, CandidateSet, 2786d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions); 278751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor else 27889aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 2789d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Args, NumArgs, CandidateSet, 2790d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions); 279151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 2792dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 2793dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 279451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceLocation DeclLoc = Kind.getLocation(); 2795dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2796dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 279751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 2798dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (OverloadingResult Result 2799120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall = CandidateSet.BestViableFunction(S, DeclLoc, Best)) { 280051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Sequence.SetOverloadFailure( 2801dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializationSequence::FK_ConstructorOverloadFailed, 280251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Result); 280351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return; 280451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 28059db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 28069db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // C++0x [dcl.init]p6: 28079db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // If a program calls for the default initialization of an object 28089db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // of a const-qualified type T, T shall be a class type with a 28099db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // user-provided default constructor. 28109db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 28119db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getType().isConstQualified() && 28129db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor cast<CXXConstructorDecl>(Best->Function)->isImplicit()) { 28139db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 28149db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor return; 28159db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 28169db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 281751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Add the constructor initialization step. Any cv-qualification conversion is 281851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // subsumed by the initialization. 28192f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Sequence.AddConstructorInitializationStep( 2820dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi cast<CXXConstructorDecl>(Best->Function), 28219aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Best->FoundDecl.getAccess(), 282218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DestType); 282320093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 282420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 282571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor/// \brief Attempt value initialization (C++ [dcl.init]p7). 2826dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryValueInitialization(Sema &S, 282771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializedEntity &Entity, 282871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializationKind &Kind, 282971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor InitializationSequence &Sequence) { 283071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // C++ [dcl.init]p5: 283171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 283271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // To value-initialize an object of type T means: 2833d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType T = Entity.getType(); 2834dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 283571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is an array type, then each element is value-initialized; 283671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor while (const ArrayType *AT = S.Context.getAsArrayType(T)) 283771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor T = AT->getElementType(); 2838dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 283971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (const RecordType *RT = T->getAs<RecordType>()) { 284071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 284171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is a class type (clause 9) with a user-declared 284271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // constructor (12.1), then the default constructor for T is 284371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // called (and the initialization is ill-formed if T has no 284471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // accessible default constructor); 284571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 284671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // FIXME: we really want to refer to a single subobject of the array, 284771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // but Entity doesn't have a way to capture that (yet). 284871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (ClassDecl->hasUserDeclaredConstructor()) 284971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 2850dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 285116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // -- if T is a (possibly cv-qualified) non-union class type 285216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // without a user-provided constructor, then the object is 28530099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi // zero-initialized and, if T's implicitly-declared default 285416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // constructor is non-trivial, that constructor is called. 2855465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if ((ClassDecl->getTagKind() == TTK_Class || 2856ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor ClassDecl->getTagKind() == TTK_Struct)) { 2857d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 2858dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 285916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 286071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 286171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 286271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 2863d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 286471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Sequence.setSequenceKind(InitializationSequence::ZeroInitialization); 286571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 286671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 286799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor/// \brief Attempt default initialization (C++ [dcl.init]p6). 286899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregorstatic void TryDefaultInitialization(Sema &S, 286999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializedEntity &Entity, 287099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializationKind &Kind, 287199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitializationSequence &Sequence) { 287299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(Kind.getKind() == InitializationKind::IK_Default); 2873dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 287499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // C++ [dcl.init]p6: 287599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // To default-initialize an object of type T means: 287699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is an array type, each element is default-initialized; 2877d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 287899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor while (const ArrayType *Array = S.Context.getAsArrayType(DestType)) 287999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor DestType = Array->getElementType(); 2880dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 288199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is a (possibly cv-qualified) class type (Clause 9), the default 288299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // constructor for T is called (and the initialization is ill-formed if 288399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // T has no accessible default constructor); 288460c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (DestType->isRecordType() && S.getLangOptions().CPlusPlus) { 28854e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth TryConstructorInitialization(S, Entity, Kind, 0, 0, DestType, Sequence); 28864e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth return; 288799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 2888dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 288999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - otherwise, no initialization is performed. 289099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.setSequenceKind(InitializationSequence::NoInitialization); 2891dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 289299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // If a program calls for the default initialization of an object of 2893dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // a const-qualified type T, T shall be a class type with a user-provided 289499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // default constructor. 289560c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (DestType.isConstQualified() && S.getLangOptions().CPlusPlus) 289699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 289799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 289899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 289920093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]), 290020093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// which enumerates all conversion functions and performs overload resolution 290120093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// to select the best. 2902dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryUserDefinedConversion(Sema &S, 290320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 290420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 290520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 290620093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 29074a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.setSequenceKind(InitializationSequence::UserDefinedConversion); 2908dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2909d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 29104a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert(!DestType->isReferenceType() && "References are handled elsewhere"); 29114a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType SourceType = Initializer->getType(); 29124a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert((DestType->isRecordType() || SourceType->isRecordType()) && 29134a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor "Must have a class type to perform a user-defined conversion"); 2914dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 29154a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Build the candidate set directly in the initialization sequence 29164a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // structure, so that it will persist if we fail. 29174a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 29184a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CandidateSet.clear(); 2919dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 29204a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Determine whether we are allowed to call explicit constructors or 29214a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // explicit conversion operators. 29224a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 2923dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 29244a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) { 29254a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting to is a class type. Enumerate its constructors 29264a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // to see if there is a suitable conversion. 29274a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXRecordDecl *DestRecordDecl 29284a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 2929dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2930087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Try to complete the type we're converting to. 2931dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (!S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 2932087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 2933e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl); 2934087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Con != ConEnd; ++Con) { 2935087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor NamedDecl *D = *Con; 2936087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 2937dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2938087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Find the constructor (which may be a template). 2939087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor CXXConstructorDecl *Constructor = 0; 2940087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor FunctionTemplateDecl *ConstructorTmpl 2941087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor = dyn_cast<FunctionTemplateDecl>(D); 29424a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 2943087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>( 2944087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 29454712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor else 2946087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>(D); 2947dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2948087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (!Constructor->isInvalidDecl() && 2949087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 2950087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (ConstructorTmpl) 2951087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 2952087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor /*ExplicitArgs*/ 0, 2953087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor &Initializer, 1, CandidateSet, 29544712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 2955087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor else 2956087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddOverloadCandidate(Constructor, FoundDecl, 2957087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor &Initializer, 1, CandidateSet, 29584712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 2959087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 2960dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 2961087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 29624a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 2963cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2964cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman SourceLocation DeclLoc = Initializer->getLocStart(); 2965cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 29664a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) { 29674a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting from is a class type, enumerate its conversion 29684a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // functions. 2969cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 297033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // We can only enumerate the conversion functions for a complete type; if 297133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // the type isn't complete, simply skip this step. 297233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (!S.RequireCompleteType(DeclLoc, SourceType, 0)) { 297333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *SourceRecordDecl 297433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = cast<CXXRecordDecl>(SourceRecordType->getDecl()); 2975dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2976eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 297733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = SourceRecordDecl->getVisibleConversionFunctions(); 2978eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 2979dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi E = Conversions->end(); 298033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman I != E; ++I) { 298133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman NamedDecl *D = *I; 298233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 298333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (isa<UsingShadowDecl>(D)) 298433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman D = cast<UsingShadowDecl>(D)->getTargetDecl(); 2985dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 298633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 298733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXConversionDecl *Conv; 29884a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConvTemplate) 298933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 29904a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 299132daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall Conv = cast<CXXConversionDecl>(D); 2992dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 299333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (AllowExplicit || !Conv->isExplicit()) { 299433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (ConvTemplate) 29959aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 299686820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, DestType, 299733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CandidateSet); 299833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman else 29999aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 300086820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Initializer, DestType, CandidateSet); 300133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman } 30024a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 30034a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 30044a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 3005dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3006dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 30074a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet::iterator Best; 30081d31833450e6d2947a33cb0840d87661d92eec07John McCall if (OverloadingResult Result 30098fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) { 30104a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.SetOverloadFailure( 3011dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializationSequence::FK_UserConversionOverloadFailed, 30124a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Result); 30134a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 30144a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 30151d31833450e6d2947a33cb0840d87661d92eec07John McCall 30164a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionDecl *Function = Best->Function; 3017dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 30184a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (isa<CXXConstructorDecl>(Function)) { 30194a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step. Any cv-qualification conversion is 30204a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // subsumed by the initialization. 30219aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType); 30224a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 30234a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 30244a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 30254a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step that calls the conversion function. 30265291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor QualType ConvType = Function->getCallResultType(); 30273fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor if (ConvType->getAs<RecordType>()) { 30283fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If we're converting to a class type, there may be an copy if 30293fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // the resulting temporary object (possible to create an object of 30303fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // a base class type). That copy is not a separate conversion, so 30313fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // we just make a note of the actual destination type (possibly a 30323fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // base class of the type returned by the conversion function) and 30333fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // let the user-defined conversion step handle the conversion. 30343fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType); 30353fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor return; 30363fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor } 30374a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 30383fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType); 3039dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 30403fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If the conversion following the call to the conversion function 30413fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // is interesting, add it as a separate step. 30424a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (Best->FinalConversion.First || Best->FinalConversion.Second || 30434a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Best->FinalConversion.Third) { 30444a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ImplicitConversionSequence ICS; 30451d31833450e6d2947a33cb0840d87661d92eec07John McCall ICS.setStandard(); 30464a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ICS.Standard = Best->FinalConversion; 30474a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.AddConversionSequenceStep(ICS, DestType); 30484a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 304920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 305020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 305120093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::InitializationSequence(Sema &S, 305220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 305320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 305420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, 30555769d6195087229770d7ac90449443e026c47103John McCall unsigned NumArgs) 30565769d6195087229770d7ac90449443e026c47103John McCall : FailedCandidateSet(Kind.getLocation()) { 305720093b4bf698f292c664676987541d5103b65b15Douglas Gregor ASTContext &Context = S.Context; 3058dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 305920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init]p16: 3060dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // The semantics of initializers are as follows. The destination type is 3061dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // the type of the object or reference being initialized and the source 306220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type is the type of the initializer expression. The source type is not 3063dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // defined when the initializer is a braced-init-list or when it is a 306420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // parenthesized list of expressions. 3065d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 306620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 306720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isDependentType() || 306820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 306920093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = DependentSequence; 307020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 307120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 307220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3073241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall for (unsigned I = 0; I != NumArgs; ++I) 3074241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall if (Args[I]->getObjectKind() == OK_ObjCProperty) 3075241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall S.ConvertPropertyForRValue(Args[I]); 3076241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall 307720093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType SourceType; 307820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer = 0; 307999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs == 1) { 308020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer = Args[0]; 308120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!isa<InitListExpr>(Initializer)) 308220093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceType = Initializer->getType(); 308320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3084dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3085dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the initializer is a braced-init-list, the object is 308620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // list-initialized (8.5.4). 308720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) { 308820093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryListInitialization(S, Entity, Kind, InitList, *this); 3089d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 309020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3091dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 309220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a reference type, see 8.5.3. 309320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isReferenceType()) { 309420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p1: 309520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A variable declared to be a T& or T&&, that is, "reference to type T" 309620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (8.3.2), shall be initialized by an object, or function, of type T or 309720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // by an object that can be converted into a T. 309820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (Therefore, multiple arguments are not permitted.) 309920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (NumArgs != 1) 310020093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_TooManyInitsForReference); 310120093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 310220093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryReferenceInitialization(S, Entity, Kind, Args[0], *this); 310320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 310420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3105dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3106dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the destination type is an array of characters, an array of 3107dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // char16_t, an array of char32_t, or an array of wchar_t, and the 310820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer is a string literal, see 8.5.2. 310920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Initializer && IsStringInit(Initializer, DestType, Context)) { 311020093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this); 311120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 311220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3113dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 311420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is (), the object is value-initialized. 311599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Value || 311699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct && NumArgs == 0)) { 311720093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryValueInitialization(S, Entity, Kind, *this); 311820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 311920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3120dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 312199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Handle default initialization. 31227663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky if (Kind.getKind() == InitializationKind::IK_Default) { 312399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor TryDefaultInitialization(S, Entity, Kind, *this); 312499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 312599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 312618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 3127dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the destination type is an array, the program is 312820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // ill-formed. 312920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (const ArrayType *AT = Context.getAsArrayType(DestType)) { 313020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (AT->getElementType()->isAnyCharacterType()) 313120093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_ArrayNeedsInitListOrStringLiteral); 313220093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 313320093b4bf698f292c664676987541d5103b65b15Douglas Gregor SetFailed(FK_ArrayNeedsInitList); 3134dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 313520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 313620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3137cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3138cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman // Handle initialization in C 3139cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman if (!S.getLangOptions().CPlusPlus) { 3140cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman setSequenceKind(CAssignment); 3141cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman AddCAssignmentStep(DestType); 3142cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman return; 3143cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 3144dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 314520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a (possibly cv-qualified) class type: 314620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isRecordType()) { 3147dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the initialization is direct-initialization, or if it is 3148dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy-initialization where the cv-unqualified version of the 3149dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // source type is the same class as, or a derived class of, the 315020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // class of the destination, constructors are considered. [...] 315120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Direct || 315220093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Kind.getKind() == InitializationKind::IK_Copy && 315320093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Context.hasSameUnqualifiedType(SourceType, DestType) || 315420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.IsDerivedFrom(SourceType, DestType)))) 3155dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TryConstructorInitialization(S, Entity, Kind, Args, NumArgs, 3156d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(), *this); 3157dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise (i.e., for the remaining copy-initialization cases), 315820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // user-defined conversion sequences that can convert from the source 3159dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // type to the destination type or (when a conversion function is 316020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // used) to a derived class thereof are enumerated as described in 316120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 13.3.1.4, and the best one is chosen through overload resolution 316220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (13.3). 316320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 316420093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 316520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 316620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3167dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 316899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs > 1) { 316999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SetFailed(FK_TooManyInitsForScalar); 317099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 317199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 317299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(NumArgs == 1 && "Zero-argument case handled above"); 3173dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3174dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the source type is a (possibly cv-qualified) class 317520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type, conversion functions are considered. 317699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (!SourceType.isNull() && SourceType->isRecordType()) { 317720093b4bf698f292c664676987541d5103b65b15Douglas Gregor TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 317820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 317920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3180dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 318120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the initial value of the object being initialized is the 31824a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // (possibly converted) value of the initializer expression. Standard 318320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversions (Clause 4) will be used, if necessary, to convert the 3184dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // initializer expression to the cv-unqualified version of the 318520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // destination type; no user-defined conversions are considered. 3186369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall if (S.TryImplicitConversion(*this, Entity, Initializer, 3187369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*SuppressUserConversions*/ true, 3188369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*AllowExplicitConversions*/ false, 318914d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*InOverloadResolution*/ false, 319014d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*CStyle=*/Kind.isCStyleOrFunctionalCast())) 31918e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor { 3192241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall if (Initializer->getType() == Context.OverloadTy) 31938e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 31948e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor else 31958e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor SetFailed(InitializationSequence::FK_ConversionFailed); 31968e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor } 3197369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall else 3198369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall setSequenceKind(StandardConversion); 319920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 320020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 320120093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::~InitializationSequence() { 320220093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (llvm::SmallVectorImpl<Step>::iterator Step = Steps.begin(), 320320093b4bf698f292c664676987541d5103b65b15Douglas Gregor StepEnd = Steps.end(); 320420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) 320520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Destroy(); 320620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 320720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 320820093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 320920093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Perform initialization 321020093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 3211dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic Sema::AssignmentAction 321218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorgetAssignmentAction(const InitializedEntity &Entity) { 321318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch(Entity.getKind()) { 321418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 321518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 3216a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Exception: 3217a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Base: 321818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 321918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 322018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 3221dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (Entity.getDecl() && 3222688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext())) 3223688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor return Sema::AA_Sending; 3224688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor 322518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Passing; 322618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 322718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 322818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Returning; 322918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 323018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 323118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell apart casting vs. converting? 323218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Casting; 3233dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 323418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Member: 3235d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_ArrayElement: 3236d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 3237310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 323818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 323918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 324018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 324118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Converting; 324218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 324318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 32444154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether we should binding a created object as a temporary when 32454154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// initializing the given entity. 32462f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregorstatic bool shouldBindAsTemporary(const InitializedEntity &Entity) { 324718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 32481b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 32491b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 32502f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor case InitializedEntity::EK_Result: 325118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 325218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 325318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 3254d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 3255a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson case InitializedEntity::EK_Exception: 3256310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 325718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return false; 3258dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 325918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 326018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 326118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return true; 326218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 3263dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 326418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("missed an InitializedEntity kind?"); 326518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 326618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 32674154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether the given entity, when initialized with an object 32684154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// created for that initialization, requires destruction. 32694154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregorstatic bool shouldDestroyTemporary(const InitializedEntity &Entity) { 32704154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor switch (Entity.getKind()) { 32714154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Member: 32724154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Result: 32734154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_New: 32744154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Base: 32754154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_VectorElement: 3276310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 32774154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return false; 3278dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 32794154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Variable: 32804154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Parameter: 32814154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Temporary: 32824154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_ArrayElement: 32834154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Exception: 32844154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return true; 32854154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 3286dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3287dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi llvm_unreachable("missed an InitializedEntity kind?"); 32884154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor} 32894154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 3290523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \brief Make a (potentially elidable) temporary copy of the object 3291523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// provided by the given initializer by calling the appropriate copy 3292523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// constructor. 3293523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3294523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param S The Sema object used for type-checking. 3295523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 329663e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// \param T The type of the temporary object, which must either be 3297523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// the type of the initializer expression or a superclass thereof. 3298523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3299523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param Enter The entity being initialized. 3300523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3301523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param CurInit The initializer expression. 3302523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3303523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param IsExtraneousCopy Whether this is an "extraneous" copy that 3304523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// is permitted in C++03 (but not C++0x) when binding a reference to 3305523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// an rvalue. 3306523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3307523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \returns An expression that copies the initializer expression into 3308523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// a temporary object, or an error expression if a copy could not be 3309523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// created. 331060d7b3a319d84d688752be3870615ac0f111fb16John McCallstatic ExprResult CopyObject(Sema &S, 33118fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor QualType T, 33128fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor const InitializedEntity &Entity, 33138fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor ExprResult CurInit, 33148fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor bool IsExtraneousCopy) { 33153fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine which class type we're copying to. 33161b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Expr *CurInitExpr = (Expr *)CurInit.get(); 3317dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXRecordDecl *Class = 0; 3318523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) 33192f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Class = cast<CXXRecordDecl>(Record->getDecl()); 33202f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (!Class) 33212f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor return move(CurInit); 33222f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 3323f5d8f466c3eebaffc51468812bdcbe7f0fe4891aDouglas Gregor // C++0x [class.copy]p32: 33242f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // When certain criteria are met, an implementation is allowed to 33252f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // omit the copy/move construction of a class object, even if the 33262f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // copy/move constructor and/or destructor for the object have 33272f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // side effects. [...] 33282f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // - when a temporary class object that has not been bound to a 33292f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // reference (12.2) would be copied/moved to a class object 33302f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // with the same cv-unqualified type, the copy/move operation 33312f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // can be omitted by constructing the temporary object 33322f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // directly into the target of the omitted copy/move 3333dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // 33342f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // Note that the other three bullets are handled elsewhere. Copy 33353c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // elision for return statements and throw expressions are handled as part 3336dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // of constructor initialization, while copy elision for exception handlers 33373c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // is handled by the run-time. 3338558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall bool Elidable = CurInitExpr->isTemporaryObject(S.Context, Class); 333918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation Loc; 334018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 334118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 334218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Loc = Entity.getReturnLoc(); 334318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 3344dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 334518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Exception: 334618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Loc = Entity.getThrowLoc(); 334718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 3348dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 334918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 33507abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor Loc = Entity.getDecl()->getLocation(); 33517abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor break; 33527abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 33531b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 33541b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 335518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 335618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 33572f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor case InitializedEntity::EK_New: 335818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 3359d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 3360310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 33612f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Loc = CurInitExpr->getLocStart(); 33622f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor break; 336318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 3364f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 3365dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Make sure that the type we are copying is complete. 3366f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor if (S.RequireCompleteType(Loc, T, S.PDiag(diag::err_temp_copy_incomplete))) 3367f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor return move(CurInit); 3368f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 3369cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Perform overload resolution using the class's copy/move constructors. 337018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DeclContext::lookup_iterator Con, ConEnd; 33715769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 3372e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(Class); 337318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Con != ConEnd; ++Con) { 3374cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Only consider copy/move constructors and constructor templates. Per 33758ff338bfd8abd9ac5d0c1d89c1b05e2c02727174Douglas Gregor // C++0x [dcl.init]p16, second bullet to class types, this 33768ff338bfd8abd9ac5d0c1d89c1b05e2c02727174Douglas Gregor // initialization is direct-initialization. 33776493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor CXXConstructorDecl *Constructor = 0; 33786493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor 33796493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor if ((Constructor = dyn_cast<CXXConstructorDecl>(*Con))) { 3380cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Handle copy/moveconstructors, only. 33816493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor if (!Constructor || Constructor->isInvalidDecl() || 3382cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor !Constructor->isCopyOrMoveConstructor() || 33838ff338bfd8abd9ac5d0c1d89c1b05e2c02727174Douglas Gregor !Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 33846493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor continue; 33856493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor 33866493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor DeclAccessPair FoundDecl 33876493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor = DeclAccessPair::make(Constructor, Constructor->getAccess()); 33886493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor S.AddOverloadCandidate(Constructor, FoundDecl, 33896493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor &CurInitExpr, 1, CandidateSet); 33906493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor continue; 3391dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 33926493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor 33936493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor // Handle constructor templates. 33946493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor FunctionTemplateDecl *ConstructorTmpl = cast<FunctionTemplateDecl>(*Con); 33956493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor if (ConstructorTmpl->isInvalidDecl()) 33966493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor continue; 33976493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor 33986493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor Constructor = cast<CXXConstructorDecl>( 33996493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor ConstructorTmpl->getTemplatedDecl()); 34008ff338bfd8abd9ac5d0c1d89c1b05e2c02727174Douglas Gregor if (!Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 340118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor continue; 34029aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 34036493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor // FIXME: Do we need to limit this to copy-constructor-like 34046493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor // candidates? 34059aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl 34066493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor = DeclAccessPair::make(ConstructorTmpl, ConstructorTmpl->getAccess()); 34076493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 0, 34086493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor &CurInitExpr, 1, CandidateSet, true); 34092f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor } 3410dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 341118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OverloadCandidateSet::iterator Best; 3412120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall switch (CandidateSet.BestViableFunction(S, Loc, Best)) { 341318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Success: 341418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 3415dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 341618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_No_Viable_Function: 341757d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin S.Diag(Loc, IsExtraneousCopy && !S.isSFINAEContext() 341857d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin ? diag::ext_rvalue_to_reference_temp_copy_no_viable 341957d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin : diag::err_temp_copy_no_viable) 34207abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 342118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 3422120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall CandidateSet.NoteCandidates(S, OCD_AllCandidates, &CurInitExpr, 1); 342357d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin if (!IsExtraneousCopy || S.isSFINAEContext()) 3424f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 342557d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin return move(CurInit); 3426dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 342718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Ambiguous: 342818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_ambiguous) 34297abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 343018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 3431120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall CandidateSet.NoteCandidates(S, OCD_ViableCandidates, &CurInitExpr, 1); 3432f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3433dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 343418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Deleted: 343518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_deleted) 34367abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 343718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 343818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 343918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Best->Function->isDeleted(); 3440f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 344118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 344218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 34433fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function); 3444ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 34453fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 3446523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 34479a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 344857d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin Best->FoundDecl.getAccess(), IsExtraneousCopy); 3449523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 3450523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (IsExtraneousCopy) { 3451523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // If this is a totally extraneous copy for C++03 reference 3452523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // binding purposes, just return the original initialization 34532559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // expression. We don't generate an (elided) copy operation here 34542559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // because doing so would require us to pass down a flag to avoid 34552559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // infinite recursion, where each step adds another extraneous, 34562559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // elidable copy. 34572559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 34582559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Instantiate the default arguments of any extra parameters in 34592559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // the selected copy constructor, as if we were going to create a 34602559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // proper call to the copy constructor. 34612559a7045a74679c80376305397a5953d038e1d0Douglas Gregor for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) { 34622559a7045a74679c80376305397a5953d038e1d0Douglas Gregor ParmVarDecl *Parm = Constructor->getParamDecl(I); 34632559a7045a74679c80376305397a5953d038e1d0Douglas Gregor if (S.RequireCompleteType(Loc, Parm->getType(), 34642559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.PDiag(diag::err_call_incomplete_argument))) 34652559a7045a74679c80376305397a5953d038e1d0Douglas Gregor break; 34662559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 34672559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Build the default argument expression; we don't actually care 34682559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if this succeeds or not, because this routine will complain 34692559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if there was a problem. 34702559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm); 34712559a7045a74679c80376305397a5953d038e1d0Douglas Gregor } 3472523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 3473523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor return S.Owned(CurInitExpr); 3474523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor } 3475dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 34763fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine the arguments required to actually perform the 3477523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // constructor call (we might have derived-to-base conversions, or 3478523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // the copy constructor may have default arguments). 3479f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (S.CompleteConstructorCall(Constructor, MultiExprArg(&CurInitExpr, 1), 34803fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Loc, ConstructorArgs)) 3481f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 34823fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 3483b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // Actually perform the constructor call. 3484b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, T, Constructor, Elidable, 34857a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall move_arg(ConstructorArgs), 34867a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 3487428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 3488428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 3489dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3490b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // If we're supposed to bind temporaries, do so. 3491b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity)) 3492b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 3493b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor return move(CurInit); 349418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 349520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3496a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregorvoid InitializationSequence::PrintInitLocationNote(Sema &S, 3497a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor const InitializedEntity &Entity) { 3498a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Parameter && Entity.getDecl()) { 3499a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getLocation().isInvalid()) 3500a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor return; 3501a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 3502a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getDeclName()) 3503a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here) 3504a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor << Entity.getDecl()->getDeclName(); 3505a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor else 3506a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here); 3507a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } 3508a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor} 3509a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 3510dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 351120093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::Perform(Sema &S, 351220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 351320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 3514f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiExprArg Args, 3515d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType *ResultType) { 351620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind == FailedSequence) { 351720093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 351820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Diagnose(S, Entity, Kind, (Expr **)Args.release(), NumArgs); 3519f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 352020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3521dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 352220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind == DependentSequence) { 3523d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If the declaration is a non-dependent, incomplete array type 3524d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // that has an initializer, then its type will be completed once 3525d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // the initializer is instantiated. 3526d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (ResultType && !Entity.getType()->isDependentType() && 3527d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Args.size() == 1) { 3528d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DeclType = Entity.getType(); 3529d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (const IncompleteArrayType *ArrayT 3530d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getAsIncompleteArrayType(DeclType)) { 3531d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We don't currently have the ability to accurately 3532d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // compute the length of an initializer list without 3533d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // performing full type-checking of the initializer list 3534d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // (since we have to determine where braces are implicitly 3535d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // introduced and such). So, we fall back to making the array 3536d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // type a dependently-sized array type with no specified 3537d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // bound. 3538d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (isa<InitListExpr>((Expr *)Args.get()[0])) { 3539d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor SourceRange Brackets; 3540d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor 3541d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Scavange the location of the brackets from the entity, if we can. 3542d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (DeclaratorDecl *DD = Entity.getDecl()) { 3543d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) { 3544d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor TypeLoc TL = TInfo->getTypeLoc(); 3545d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (IncompleteArrayTypeLoc *ArrayLoc 3546d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor = dyn_cast<IncompleteArrayTypeLoc>(&TL)) 3547d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Brackets = ArrayLoc->getBracketsRange(); 3548d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor } 3549d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3550d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3551d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor *ResultType 3552d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getDependentSizedArrayType(ArrayT->getElementType(), 3553d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor /*NumElts=*/0, 3554d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getSizeModifier(), 3555d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getIndexTypeCVRQualifiers(), 3556d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Brackets); 3557d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3558d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3559d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3560d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3561d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3562085446216a198ced4183ec1571e1ae51c2920e98Eli Friedman if (Kind.getKind() == InitializationKind::IK_Copy || Kind.isExplicitCast()) 356360d7b3a319d84d688752be3870615ac0f111fb16John McCall return ExprResult(Args.release()[0]); 356420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 356567fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor if (Args.size() == 0) 356667fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor return S.Owned((Expr *)0); 356767fa05b9ed29923b7b905a09cfb95c2ac91b5835Douglas Gregor 356820093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 356920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return S.Owned(new (S.Context) ParenListExpr(S.Context, 357020093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation(), 3571dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Expr **)Args.release(), 357220093b4bf698f292c664676987541d5103b65b15Douglas Gregor NumArgs, 357320093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation())); 357420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 357520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 357699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (SequenceKind == NoInitialization) 357799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return S.Owned((Expr *)0); 3578dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3579d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType().getNonReferenceType(); 3580d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor // FIXME: Ugly hack around the fact that Entity.getType() is not 3581a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // the same as Entity.getDecl()->getType() in cases involving type merging, 3582a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // and we want latter when it makes sense. 3583d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (ResultType) 3584a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() : 3585d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(); 358620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 358760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult CurInit = S.Owned((Expr *)0); 3588dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 358999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(!Steps.empty() && "Cannot have an empty initialization sequence"); 3590dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3591dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // For initialization steps that start with a single initializer, 359299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // grab the only argument out the Args and place it into the "current" 359399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // initializer. 359499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (Steps.front().Kind) { 359518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ResolveAddressOfOverloadedFunction: 359618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseRValue: 3597906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 359818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseLValue: 359918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReference: 360018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReferenceToTemporary: 3601523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 360218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_UserConversion: 360318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionLValue: 3604906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 360518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionRValue: 360618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConversionSequence: 360718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ListInitialization: 360818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 3609cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 3610f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall case SK_ObjCObjectConversion: { 361118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(Args.size() == 1); 3612f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall Expr *CurInitExpr = Args.get()[0]; 3613f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall if (!CurInitExpr) return ExprError(); 3614f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 3615f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall // Read from a property when initializing something with it. 3616f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall if (CurInitExpr->getObjectKind() == OK_ObjCProperty) 3617f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall S.ConvertPropertyForRValue(CurInitExpr); 3618f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 3619f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall CurInit = ExprResult(CurInitExpr); 362018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 3621f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 3622dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 362318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConstructorInitialization: 362418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ZeroInitialization: 362518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 362620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3627dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3628dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Walk through the computed steps for the initialization sequence, 362920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // performing the specified conversions along the way. 363016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool ConstructorInitRequiresZeroInit = false; 363120093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (step_iterator Step = step_begin(), StepEnd = step_end(); 363220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) { 363320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 3634f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3635dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3636f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall Expr *CurInitExpr = CurInit.get(); 363799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor QualType SourceType = CurInitExpr? CurInitExpr->getType() : QualType(); 3638dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 363920093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Step->Kind) { 364020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 3641dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Overload resolution determined which function invoke; update the 364220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer to reflect that choice. 36436bb8017bb9e828d118e15e59d71c66bba323c364John McCall S.CheckAddressOfMemberAccess(CurInitExpr, Step->Function.FoundDecl); 3644b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()); 3645b13b737a2450167c82e148590e8019b839ce6b98John McCall CurInit = S.FixOverloadedFunctionReference(move(CurInit), 36466bb8017bb9e828d118e15e59d71c66bba323c364John McCall Step->Function.FoundDecl, 36479aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.Function); 364820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 3649dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 365020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 3651906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 365220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: { 365320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a derived-to-base cast that produces either an rvalue or an 365420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue. Perform that cast. 3655dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3656f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 36575cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 365820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Casts to inaccessible base classes are allowed with C-style casts. 365920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast(); 366020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckDerivedToBaseConversion(SourceType, Step->Type, 366120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr->getLocStart(), 3662dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInitExpr->getSourceRange(), 36635cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson &BasePath, IgnoreBaseAccess)) 3664f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3665dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 36666fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (S.BasePathInvolvesVirtualBase(BasePath)) { 36676fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor QualType T = SourceType; 36686fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) 36696fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor T = Pointer->getPointeeType(); 36706fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const RecordType *RecordTy = T->getAs<RecordType>()) 3671dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.MarkVTableUsed(CurInitExpr->getLocStart(), 36726fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor cast<CXXRecordDecl>(RecordTy->getDecl())); 36736fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor } 36746fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 36755baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 3676906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_CastDerivedToBaseLValue ? 36775baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 3678906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_CastDerivedToBaseXValue ? 36795baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 36805baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 3681f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 3682f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Step->Type, 36832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_DerivedToBase, 36845baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall CurInit.get(), 36855baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall &BasePath, VK)); 368620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 368720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3688dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 368920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 369020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (FieldDecl *BitField = CurInitExpr->getBitField()) { 369120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // References cannot bind to bit fields (C++ [dcl.init.ref]p5). 369220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield) 3693d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor << Entity.getType().isVolatileQualified() 369420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << BitField->getDeclName() 369520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << CurInitExpr->getSourceRange(); 369620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(BitField->getLocation(), diag::note_bitfield_decl); 3697f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 369820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3699a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 3700093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson if (CurInitExpr->refersToVectorElement()) { 370141593e3b7da967b52bc3c7f488b8752dee63f38eJohn McCall // References cannot bind to vector elements. 3702093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element) 3703093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << Entity.getType().isVolatileQualified() 3704093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << CurInitExpr->getSourceRange(); 3705a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 3706f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3707093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson } 3708dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 370920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Reference binding does not have any corresponding ASTs. 371020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 371120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 371220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckExceptionSpecCompatibility(CurInitExpr, DestType)) 3713f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 37143aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 371520093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 37163aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 371720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 3718a64a869312066ff6119d1d7ae03f88ce499e3f82Anders Carlsson // Reference binding does not have any corresponding ASTs. 3719a64a869312066ff6119d1d7ae03f88ce499e3f82Anders Carlsson 372020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 372120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckExceptionSpecCompatibility(CurInitExpr, DestType)) 3722f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 372320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 372420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 3725dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3726523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 3727dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInit = CopyObject(S, Step->Type, Entity, move(CurInit), 3728523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor /*IsExtraneousCopy=*/true); 3729523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 3730523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 373120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: { 373220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a user-defined conversion that invokes either a constructor 373320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // or a conversion function. 3734daa8e4e888758d55a7a759dd4a91b83921cef222John McCall CastKind CastKind; 373518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy = false; 37369aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionDecl *Fn = Step->Function.Function; 37379aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundFn = Step->Function.FoundDecl; 37384154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor bool CreatedObject = false; 3739f0e0b17d0504d25b4673de015cf7401e2296323cDouglas Gregor bool IsLvalue = false; 3740b13b737a2450167c82e148590e8019b839ce6b98John McCall if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) { 374120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the selected constructor. 3742ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 374320093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation Loc = CurInitExpr->getLocStart(); 374420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 3745b13b737a2450167c82e148590e8019b839ce6b98John McCall 374620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the arguments required to actually perform the constructor 374720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // call. 374820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CompleteConstructorCall(Constructor, 3749f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiExprArg(&CurInitExpr, 1), 375020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Loc, ConstructorArgs)) 3751f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3752dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 375320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the an expression that constructs a temporary. 3754dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInit = S.BuildCXXConstructExpr(Loc, Step->Type, Constructor, 37557a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall move_arg(ConstructorArgs), 37567a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 3757428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 3758428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 375920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 3760f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3761b13b737a2450167c82e148590e8019b839ce6b98John McCall 37629a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Kind.getLocation(), Constructor, Entity, 37639aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn.getAccess()); 3764b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 3765dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_ConstructorConversion; 376718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType Class = S.Context.getTypeDeclType(Constructor->getParent()); 376818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.Context.hasSameUnqualifiedType(SourceType, Class) || 376918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.IsDerivedFrom(SourceType, Class)) 377018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor IsCopy = true; 3771dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37724154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = true; 377320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 377420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the conversion function. 3775b13b737a2450167c82e148590e8019b839ce6b98John McCall CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn); 3776f0e0b17d0504d25b4673de015cf7401e2296323cDouglas Gregor IsLvalue = Conversion->getResultType()->isLValueReferenceType(); 377758e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall S.CheckMemberOperatorAccess(Kind.getLocation(), CurInitExpr, 0, 37789aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn); 3779b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 3780dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3781dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Should we move this initialization into a separate 378220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // derived-to-base conversion? I believe the answer is "no", because 378320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // we don't want to turn off access control here for c-style casts. 37845fccd36204f11c8491325038e6ffcc784399098eDouglas Gregor if (S.PerformObjectArgumentInitialization(CurInitExpr, /*Qualifier=*/0, 37856bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundFn, Conversion)) 3786f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 378720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 378820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Do a little dance to make sure that CurInit has the proper 378920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // pointer. 379020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 3791dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 379220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the actual call to the conversion function. 3793f2ae52605a49e5fc7a581f2c1ae02f1811034578Douglas Gregor CurInit = S.BuildCXXMemberCallExpr(CurInitExpr, FoundFn, Conversion); 379420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid() || !CurInit.get()) 3795f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3796dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_UserDefinedConversion; 3798dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37994154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = Conversion->getResultType()->isRecordType(); 380020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3801dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3802dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi bool RequiresCopy = !IsCopy && 38032f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor getKind() != InitializationSequence::ReferenceBinding; 38042f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (RequiresCopy || shouldBindAsTemporary(Entity)) 380518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 38064154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor else if (CreatedObject && shouldDestroyTemporary(Entity)) { 38074154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CurInitExpr = static_cast<Expr *>(CurInit.get()); 38084154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor QualType T = CurInitExpr->getType(); 38094154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) { 3810dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXDestructorDecl *Destructor 3811db89f289a22897f1031c92f3e49f7a9ba7bae61eDouglas Gregor = S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl())); 3812dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.CheckDestructorAccess(CurInitExpr->getLocStart(), Destructor, 38134154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor S.PDiag(diag::err_access_dtor_temp) << T); 38144154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor S.MarkDeclarationReferenced(CurInitExpr->getLocStart(), Destructor); 38159b623639378d53a675921ddfa7316034d571881eDouglas Gregor S.DiagnoseUseOfDecl(Destructor, CurInitExpr->getLocStart()); 38164154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 38174154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 3818dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 381920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInitExpr = CurInit.takeAs<Expr>(); 3820906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl // FIXME: xvalues 3821f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 3822f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInitExpr->getType(), 3823f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastKind, CurInitExpr, 0, 38245baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall IsLvalue ? VK_LValue : VK_RValue)); 3825dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 38262f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (RequiresCopy) 3827523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor CurInit = CopyObject(S, Entity.getType().getNonReferenceType(), Entity, 3828523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor move(CurInit), /*IsExtraneousCopy=*/false); 3829906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 383020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 383120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3832906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 383320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 3834906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 3835906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionRValue: { 383620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform a qualification conversion; these can never go wrong. 38375baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 3838906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_QualificationConversionLValue ? 38395baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 3840906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_QualificationConversionXValue ? 38415baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 38425baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 38432de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall S.ImpCastExprToType(CurInitExpr, Step->Type, CK_NoOp, VK); 384420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 384520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit = S.Owned(CurInitExpr); 384620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 3847906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 3848906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 3849f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor case SK_ConversionSequence: { 3850f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor if (S.PerformImplicitConversion(CurInitExpr, Step->Type, *Step->ICS, 3851a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor getAssignmentAction(Entity), 385214d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor Kind.isCStyleOrFunctionalCast())) 3853f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3854dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 385520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); 3856f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor CurInit = S.Owned(CurInitExpr); 385720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 3858f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor } 3859dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3860d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: { 3861d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor InitListExpr *InitList = cast<InitListExpr>(CurInitExpr); 3862d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType Ty = Step->Type; 3863cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (S.CheckInitList(Entity, InitList, ResultType? *ResultType : Ty)) 3864f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3865d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3866d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit.release(); 3867d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit = S.Owned(InitList); 3868d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 3869d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 387051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 387151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: { 3872d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor unsigned NumArgs = Args.size(); 387351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor 38749aa472c45d2bd81b7b52c225e8acc560d716db97John McCall = cast<CXXConstructorDecl>(Step->Function.Function); 3875dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 387651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build a call to the selected constructor. 3877ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 38780a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid()) 38790a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian ? Kind.getEqualLoc() 38800a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian : Kind.getLocation(); 38814e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth 38824e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth if (Kind.getKind() == InitializationKind::IK_Default) { 38834e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // Force even a trivial, implicit default constructor to be 38844e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // semantically checked. We do this explicitly because we don't build 38854e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // the definition for completely trivial constructors. 38864e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth CXXRecordDecl *ClassDecl = Constructor->getParent(); 38874e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth assert(ClassDecl && "No parent class for constructor."); 38884e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth if (Constructor->isImplicit() && Constructor->isDefaultConstructor() && 38894e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth ClassDecl->hasTrivialConstructor() && !Constructor->isUsed(false)) 38904e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth S.DefineImplicitDefaultConstructor(Loc, Constructor); 38914e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth } 38924e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth 389351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine the arguments required to actually perform the constructor 389451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // call. 3895dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (S.CompleteConstructorCall(Constructor, move(Args), 389651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Loc, ConstructorArgs)) 3897f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3898dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3899dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 390091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor if (Entity.getKind() == InitializedEntity::EK_Temporary && 3901d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor NumArgs != 1 && // FIXME: Hack to work around cast weirdness 390291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct || 390391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Kind.getKind() == InitializationKind::IK_Value)) { 390491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor // An explicitly-constructed temporary, e.g., X(1, 2). 390591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor unsigned NumExprs = ConstructorArgs.size(); 390691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Expr **Exprs = (Expr **)ConstructorArgs.take(); 390710f8e319569c8b8b4603d8a72ce01a7a01502c85Fariborz Jahanian S.MarkDeclarationReferenced(Loc, Constructor); 39089b623639378d53a675921ddfa7316034d571881eDouglas Gregor S.DiagnoseUseOfDecl(Constructor, Loc); 3909dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3910ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 3911ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!TSInfo) 3912ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc); 3913dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 391491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor CurInit = S.Owned(new (S.Context) CXXTemporaryObjectExpr(S.Context, 391591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Constructor, 3916ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo, 3917dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Exprs, 391891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor NumExprs, 3919428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth Kind.getParenRange(), 39201c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor ConstructorInitRequiresZeroInit)); 392172e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } else { 392272e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::ConstructionKind ConstructKind = 392372e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::CK_Complete; 3924dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 392572e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson if (Entity.getKind() == InitializedEntity::EK_Base) { 392672e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson ConstructKind = Entity.getBaseSpecifier()->isVirtual() ? 3927dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXConstructExpr::CK_VirtualBase : 392872e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::CK_NonVirtualBase; 3929dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 3930dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3931428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth // Only get the parenthesis range if it is a direct construction. 3932428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange parenRange = 3933428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth Kind.getKind() == InitializationKind::IK_Direct ? 3934428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth Kind.getParenRange() : SourceRange(); 3935428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth 39363c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // If the entity allows NRVO, mark the construction as elidable 39373c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // unconditionally. 39383c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor if (Entity.allowsNRVO()) 39393c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 39403c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor Constructor, /*Elidable=*/true, 39413c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor move_arg(ConstructorArgs), 39423c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor ConstructorInitRequiresZeroInit, 3943428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth ConstructKind, 3944428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth parenRange); 39453c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor else 39463c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 3947dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Constructor, 39483c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor move_arg(ConstructorArgs), 39493c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor ConstructorInitRequiresZeroInit, 3950428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth ConstructKind, 3951428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth parenRange); 395272e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } 395351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (CurInit.isInvalid()) 3954f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3955b13b737a2450167c82e148590e8019b839ce6b98John McCall 3956b13b737a2450167c82e148590e8019b839ce6b98John McCall // Only check access if all of that succeeded. 39579a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 39589aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.FoundDecl.getAccess()); 3959b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Loc); 3960dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 39612f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (shouldBindAsTemporary(Entity)) 396218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 3963dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 396451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 396551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 3966dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 396771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: { 396816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor step_iterator NextStep = Step; 396916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ++NextStep; 3970dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (NextStep != StepEnd && 397116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor NextStep->Kind == SK_ConstructorInitialization) { 397216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // The need for zero-initialization is recorded directly into 397316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // the call to the object's constructor within the next step. 397416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ConstructorInitRequiresZeroInit = true; 397516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else if (Kind.getKind() == InitializationKind::IK_Value && 397616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor S.getLangOptions().CPlusPlus && 397716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !Kind.isImplicitValueInit()) { 3978ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 3979ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!TSInfo) 3980dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TSInfo = S.Context.getTrivialTypeSourceInfo(Step->Type, 3981ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Kind.getRange().getBegin()); 3982ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 3983ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CurInit = S.Owned(new (S.Context) CXXScalarValueInitExpr( 3984ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo->getType().getNonLValueExprType(S.Context), 3985ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo, 398671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getEnd())); 398716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else { 398871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitValueInitExpr(Step->Type)); 398916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 399071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor break; 399171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 399218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 399318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: { 399418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType SourceType = CurInitExpr->getType(); 399518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::AssignConvertType ConvTy = 399618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.CheckSingleAssignmentConstraints(Step->Type, CurInitExpr); 3997aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 3998aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor // If this is a call, allow conversion to a transparent union. 3999aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor if (ConvTy != Sema::Compatible && 4000aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor Entity.getKind() == InitializedEntity::EK_Parameter && 4001aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExpr) 4002aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor == Sema::Compatible) 4003aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor ConvTy = Sema::Compatible; 4004aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 4005a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor bool Complained; 400618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(), 400718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step->Type, SourceType, 4008dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInitExpr, 4009a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor getAssignmentAction(Entity), 4010a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor &Complained)) { 4011a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 4012f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4013a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } else if (Complained) 4014a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 401518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 401618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit.release(); 401718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.Owned(CurInitExpr); 401818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 401918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 4020cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 4021cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: { 4022cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman QualType Ty = Step->Type; 4023cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman CheckStringInit(CurInitExpr, ResultType ? *ResultType : Ty, S); 4024cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman break; 4025cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 4026569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 4027569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 4028dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.ImpCastExprToType(CurInitExpr, Step->Type, 40292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_ObjCObjectLValueCast, 4030569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.CastCategory(CurInitExpr)); 4031569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor CurInit.release(); 4032569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor CurInit = S.Owned(CurInitExpr); 4033569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 403420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 403520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 403615d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall 403715d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall // Diagnose non-fatal problems with the completed initialization. 403815d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall if (Entity.getKind() == InitializedEntity::EK_Member && 403915d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl())->isBitField()) 404015d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall S.CheckBitFieldInitialization(Kind.getLocation(), 404115d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl()), 404215d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall CurInit.get()); 4043dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 404420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return move(CurInit); 404520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 404620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 404720093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 404820093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Diagnose initialization failures 404920093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 4050dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumibool InitializationSequence::Diagnose(Sema &S, 405120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 405220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 405320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs) { 405420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (SequenceKind != FailedSequence) 405520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return false; 4056dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4057d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 405820093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Failure) { 405920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_TooManyInitsForReference: 40609db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // FIXME: Customize for the initialized entity? 40619db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (NumArgs == 0) 40629db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_without_init) 40639db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType.getNonReferenceType(); 40649db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor else // FIXME: diagnostic below could be better! 40659db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits) 40669db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 406720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4068dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 406920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitList: 407020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 407120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) 407220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Failure == FK_ArrayNeedsInitListOrStringLiteral); 407320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4074dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 40756bb8017bb9e828d118e15e59d71c66bba323c364John McCall case FK_AddressOfOverloadFailed: { 40766bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found; 4077dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.ResolveAddressOfOverloadedFunction(Args[0], 407820093b4bf698f292c664676987541d5103b65b15Douglas Gregor DestType.getNonReferenceType(), 40796bb8017bb9e828d118e15e59d71c66bba323c364John McCall true, 40806bb8017bb9e828d118e15e59d71c66bba323c364John McCall Found); 408120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 40826bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 4083dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 408420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitOverloadFailed: 40854a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor case FK_UserConversionOverloadFailed: 408620093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (FailedOverloadResult) { 408720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Ambiguous: 408818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Failure == FK_UserConversionOverloadFailed) 408918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_ambiguous_condition) 409018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getType() << DestType 409118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 409218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 409318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_ref_init_ambiguous) 409418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << DestType << Args[0]->getType() 409518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 409618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 4097120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, Args, NumArgs); 409820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4099dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 410020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_No_Viable_Function: 410120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition) 410220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 410320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 4104120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args, NumArgs); 410520093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4106dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 410720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Deleted: { 410820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function) 410920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 411020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 411120093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 4112120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 41138fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best, 41148fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor true); 411520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Ovl == OR_Deleted) { 411620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 411720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Best->Function->isDeleted(); 411820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 41199f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Inconsistent overload resolution?"); 412020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 412120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 412220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4123dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 412420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Success: 41259f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Conversion did not fail!"); 412620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 412720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 412820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4129dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 413020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 413120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 4132dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Kind.getLocation(), 413320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Failure == FK_NonConstLValueReferenceBindingToTemporary 413420093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? diag::err_lvalue_reference_bind_to_temporary 413520093b4bf698f292c664676987541d5103b65b15Douglas Gregor : diag::err_lvalue_reference_bind_to_unrelated) 4136ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor << DestType.getNonReferenceType().isVolatileQualified() 413720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 413820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 413920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 414020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4141dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 414220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_RValueReferenceBindingToLValue: 414320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref) 4144fb5d7efc279335bde2cdc0a73da525d6b28201e9Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getType() 414520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 414620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4147dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 414820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitDropsQualifiers: 414920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) 415020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 415120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 415220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 415320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4154dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 415520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitFailed: 415620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_failed) 415720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 41587eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 415920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 416020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 416120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4162dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 416320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ConversionFailed: 416418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_init_conversion_failed) 416518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << (int)Entity.getKind() 416620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType 41677eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 416820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 416920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 4170d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4171d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4172d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_TooManyInitsForScalar: { 417399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceRange R; 417499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 417599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (InitListExpr *InitList = dyn_cast<InitListExpr>(Args[0])) 417619311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R = SourceRange(InitList->getInit(0)->getLocEnd(), 417799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitList->getLocEnd()); 4178dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi else 417919311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R = SourceRange(Args[0]->getLocEnd(), Args[NumArgs - 1]->getLocEnd()); 4180d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 418119311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R.setBegin(S.PP.getLocForEndOfToken(R.getBegin())); 418219311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor if (Kind.isCStyleOrFunctionalCast()) 418319311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg) 418419311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << R; 418519311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor else 418619311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_excess_initializers) 418719311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << /*scalar=*/2 << R; 4188d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4189d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4190d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4191d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_ReferenceBindingToInitList: 4192d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list) 4193d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getSourceRange(); 4194d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4195d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4196d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_InitListBadDestinationType: 4197d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type) 4198d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange(); 4199d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4200dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 420151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case FK_ConstructorOverloadFailed: { 420251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceRange ArgsRange; 420351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (NumArgs) 4204dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ArgsRange = SourceRange(Args[0]->getLocStart(), 420551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Args[NumArgs - 1]->getLocEnd()); 4206dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 420751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // FIXME: Using "DestType" for the entity we're printing is probably 420851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // bad. 420951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor switch (FailedOverloadResult) { 421051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Ambiguous: 421151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_ambiguous_init) 421251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 4213120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, 4214120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall Args, NumArgs); 421551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 4216dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 421751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_No_Viable_Function: 42189db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 42199db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor (Entity.getKind() == InitializedEntity::EK_Base || 42209db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Member) && 42219db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 42229db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default initialization of a member or 42239db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // base within a constructor. If no viable function was 42249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // found, notify the user that she needs to explicitly 42259db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialize this base/member. 42269db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor 42279db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = cast<CXXConstructorDecl>(S.CurContext); 42289db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Base) { 42299db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 42309db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 42319db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 42329db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*base=*/0 42339db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getType(); 42349db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 42359db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor RecordDecl *BaseDecl 42369db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getBaseSpecifier()->getType()->getAs<RecordType>() 42379db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ->getDecl(); 42389db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(BaseDecl->getLocation(), diag::note_previous_decl) 42399db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(BaseDecl); 42409db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 42419db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 42429db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 42439db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 42449db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*member=*/1 42459db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 42469db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_field_decl); 42479db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 42489db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (const RecordType *Record 42499db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getType()->getAs<RecordType>()) 4250dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Record->getDecl()->getLocation(), 42519db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor diag::note_previous_decl) 42529db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(Record->getDecl()); 42539db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 42549db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor break; 42559db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 42569db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 425751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init) 425851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 4259120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args, NumArgs); 426051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 4261dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 426251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Deleted: { 426351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 426451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << true << DestType << ArgsRange; 426551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 4266120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 4267120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best); 426851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (Ovl == OR_Deleted) { 426951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 427051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << Best->Function->isDeleted(); 427151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } else { 427251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Inconsistent overload resolution?"); 427351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 427451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 427551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 4276dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 427751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Success: 427851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Conversion did not fail!"); 427951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 428051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 428151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 428251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 4283dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 428499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case FK_DefaultInitOfConst: 42859db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Member && 42869db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 42879db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default-initialization of a const member in 42889db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // a constructor. Complain that it needs to be explicitly 42899db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialized. 42909db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext); 42919db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor) 42929db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 42939db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 42949db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*const=*/1 42959db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 42969db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl) 42979db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 42989db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 42999db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_default_init_const) 43009db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType << (bool)DestType->getAs<RecordType>(); 43019db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 430299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor break; 4303dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 430472a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 4305dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.RequireCompleteType(Kind.getLocation(), DestType, 430672a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor diag::err_init_incomplete_type); 4307dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi break; 430820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4309dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4310a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 431120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return true; 431220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 431318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 4314de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump(llvm::raw_ostream &OS) const { 4315de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (SequenceKind) { 4316de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FailedSequence: { 4317de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Failed sequence: "; 4318de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (Failure) { 4319de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForReference: 4320de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for reference"; 4321de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4322dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4323de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitList: 4324de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list"; 4325de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4326dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4327de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 4328de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list or string literal"; 4329de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4330dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4331de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_AddressOfOverloadFailed: 4332de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "address of overloaded function failed"; 4333de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4334dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4335de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitOverloadFailed: 4336de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overload resolution for reference initialization failed"; 4337de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4338dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4339de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 4340de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to temporary"; 4341de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4342dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4343de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 4344de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to unrelated type"; 4345de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4346dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4347de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_RValueReferenceBindingToLValue: 4348de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "rvalue reference bound to an lvalue"; 4349de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4350dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4351de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitDropsQualifiers: 4352de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization drops qualifiers"; 4353de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4354dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4355de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitFailed: 4356de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization failed"; 4357de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4358dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4359de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConversionFailed: 4360de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "conversion failed"; 4361de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4362dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4363de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForScalar: 4364de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for scalar"; 4365de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4366dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4367de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceBindingToInitList: 4368de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "referencing binding to initializer list"; 4369de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4370dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4371de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_InitListBadDestinationType: 4372de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "initializer list for non-aggregate, non-scalar type"; 4373de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4374dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4375de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_UserConversionOverloadFailed: 4376de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overloading failed for user-defined conversion"; 4377de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4378dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4379de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConstructorOverloadFailed: 4380de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor overloading failed"; 4381de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4382dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4383de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_DefaultInitOfConst: 4384de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "default initialization of a const variable"; 4385de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4386dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 438772a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 438872a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor OS << "initialization of incomplete type"; 438972a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor break; 4390dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 4391de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << '\n'; 4392de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 4393de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4394dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4395de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case DependentSequence: 4396de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Dependent sequence: "; 4397de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 4398dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4399de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case UserDefinedConversion: 4400de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "User-defined conversion sequence: "; 4401de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4402dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4403de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ConstructorInitialization: 4404de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Constructor initialization sequence: "; 4405de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4406dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4407de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ReferenceBinding: 4408de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Reference binding: "; 4409de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4410dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4411de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ListInitialization: 4412de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "List initialization: "; 4413de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4414de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4415de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case ZeroInitialization: 4416de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Zero initialization\n"; 4417de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 4418dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4419de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case NoInitialization: 4420de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "No initialization\n"; 4421de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 4422dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4423de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case StandardConversion: 4424de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Standard conversion: "; 4425de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4426dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4427de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case CAssignment: 4428de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment: "; 4429de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4430dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4431de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case StringInit: 4432de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "String initialization: "; 4433de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4434de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4435dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4436de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) { 4437de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor if (S != step_begin()) { 4438de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << " -> "; 4439de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4440dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4441de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (S->Kind) { 4442de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 4443de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "resolve address of overloaded function"; 4444de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4445dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4446de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseRValue: 4447de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (rvalue" << S->Type.getAsString() << ")"; 4448de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4449dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4450906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 4451906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "derived-to-base case (xvalue" << S->Type.getAsString() << ")"; 4452906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 4453dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4454de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseLValue: 4455de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (lvalue" << S->Type.getAsString() << ")"; 4456de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4457dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4458de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReference: 4459de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to lvalue"; 4460de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4461dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4462de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReferenceToTemporary: 4463de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to a temporary"; 4464de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4465dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4466523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 4467523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor OS << "extraneous C++03 copy to temporary"; 4468523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 4469523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 4470de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_UserConversion: 4471900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << "user-defined conversion via " << S->Function.Function; 4472de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4473906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 4474de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionRValue: 4475de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (rvalue)"; 4476de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4477906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 4478906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "qualification conversion (xvalue)"; 4479906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 4480de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionLValue: 4481de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (lvalue)"; 4482de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4483dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4484de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConversionSequence: 4485de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "implicit conversion sequence ("; 4486de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor S->ICS->DebugPrint(); // FIXME: use OS 4487de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << ")"; 4488de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4489dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4490de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ListInitialization: 4491de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "list initialization"; 4492de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4493dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4494de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConstructorInitialization: 4495de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor initialization"; 4496de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4497dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4498de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ZeroInitialization: 4499de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "zero initialization"; 4500de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4501dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4502de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CAssignment: 4503de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment"; 4504de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4505dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4506de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_StringInit: 4507de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "string initialization"; 4508de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4509569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 4510569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 4511569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor OS << "Objective-C object conversion"; 4512569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 4513de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4514de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4515de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 4516de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4517de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump() const { 4518de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor dump(llvm::errs()); 4519de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 4520de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 452118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 452218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// Initialization helper functions 452318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 4524dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 452518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::PerformCopyInitialization(const InitializedEntity &Entity, 452618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation EqualLoc, 452760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Init) { 452818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Init.isInvalid()) 452918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return ExprError(); 453018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 453115d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall Expr *InitE = Init.get(); 453218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(InitE && "No initialization expression?"); 453318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 453418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (EqualLoc.isInvalid()) 453518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc = InitE->getLocStart(); 453618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 453718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationKind Kind = InitializationKind::CreateCopy(InitE->getLocStart(), 453818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc); 453918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 454018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Init.release(); 4541f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return Seq.Perform(*this, Entity, Kind, MultiExprArg(&InitE, 1)); 454218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 4543