SemaInit.cpp revision 5f9e272e632e951b1efe824cd16acb4d96077930
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// 1012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola// This file implements semantic analysis for initializers. The main entry 1112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola// point is Sema::CheckInitList(), but all of the work is performed 1212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola// 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 34ce6c9b7da219c8640a0559f75770cfc6622de083John McCallstatic Expr *IsStringInit(Expr *Init, const ArrayType *AT, 35ce6c9b7da219c8640a0559f75770cfc6622de083John McCall ASTContext &Context) { 368718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT)) 378718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman return 0; 388718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman 398879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // See if this is a string literal or @encode. 408879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner Init = Init->IgnoreParens(); 411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 428879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Handle @encode, which is a narrow string. 438879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType()) 448879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 458879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 468879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Otherwise we can only handle string literals. 478879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner StringLiteral *SL = dyn_cast<StringLiteral>(Init); 48220b6369d7717bfe6894b46cef055d3e763827f2Chris Lattner if (SL == 0) return 0; 49bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman 50bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman QualType ElemTy = Context.getCanonicalType(AT->getElementType()); 518879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // char array can be initialized with a narrow string. 528879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Only allow char x[] = "foo"; not char x[] = L"foo"; 538879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (!SL->isWide()) 54bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman return ElemTy->isCharType() ? Init : 0; 558879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 56bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // wchar_t array can be initialized with a wide string: C99 6.7.8p15 (with 57bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // correction from DR343): "An array with element type compatible with a 58bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // qualified or unqualified version of wchar_t may be initialized by a wide 59bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman // string literal, optionally enclosed in braces." 60bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman if (Context.typesAreCompatible(Context.getWCharType(), 61bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman ElemTy.getUnqualifiedType())) 628879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner return 0; 65dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 66dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 67ce6c9b7da219c8640a0559f75770cfc6622de083John McCallstatic Expr *IsStringInit(Expr *init, QualType declType, ASTContext &Context) { 68ce6c9b7da219c8640a0559f75770cfc6622de083John McCall const ArrayType *arrayType = Context.getAsArrayType(declType); 69ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (!arrayType) return 0; 70ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 71ce6c9b7da219c8640a0559f75770cfc6622de083John McCall return IsStringInit(init, arrayType, Context); 72ce6c9b7da219c8640a0559f75770cfc6622de083John McCall} 73ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 74fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCallstatic void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT, 75fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall Sema &S) { 7679e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner // Get the length of the string as parsed. 7779e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner uint64_t StrLength = 7879e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner cast<ConstantArrayType>(Str->getType())->getSize().getZExtValue(); 7979e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner 801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 81dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p14. We have an array of character type with unknown size 83dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // being initialized to a string literal. 84dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner llvm::APSInt ConstVal(32); 8519da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner ConstVal = StrLength; 86dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // Return a new array type (C99 6.7.8p22). 8746a617a792bfab0d9b1e057371ea3b9540802226John McCall DeclT = S.Context.getConstantArrayType(IAT->getElementType(), 8846a617a792bfab0d9b1e057371ea3b9540802226John McCall ConstVal, 8946a617a792bfab0d9b1e057371ea3b9540802226John McCall ArrayType::Normal, 0); 9019da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner return; 91dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner } 921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 938718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman const ConstantArrayType *CAT = cast<ConstantArrayType>(AT); 941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 95bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // We have an array of character type with known size. However, 968718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // the size may be smaller or larger than the string we are initializing. 978718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // FIXME: Avoid truncation for 64-bit length strings. 98bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (S.getLangOptions().CPlusPlus) { 99b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson if (StringLiteral *SL = dyn_cast<StringLiteral>(Str)) { 100b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // For Pascal strings it's OK to strip off the terminating null character, 101b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // so the example below is valid: 102b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // 103b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // unsigned char a[2] = "\pa"; 104b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson if (SL->isPascal()) 105b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson StrLength--; 106b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson } 107b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson 108bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // [dcl.init.string]p2 109bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (StrLength > CAT->getSize().getZExtValue()) 110bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman S.Diag(Str->getSourceRange().getBegin(), 111bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman diag::err_initializer_string_for_char_array_too_long) 112bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman << Str->getSourceRange(); 113bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman } else { 114bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // C99 6.7.8p14. 115bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (StrLength-1 > CAT->getSize().getZExtValue()) 116bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman S.Diag(Str->getSourceRange().getBegin(), 117bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman diag::warn_initializer_string_for_char_array_too_long) 118bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman << Str->getSourceRange(); 119bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman } 1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1218718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // Set the type to the actual size that we are initializing. If we have 1228718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // something like: 1238718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // char x[1] = "foo"; 1248718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // then this will set the string literal's type to char[1]. 1258718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman Str->setType(DeclT); 126dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 127dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 128dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 129dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Semantic checking for initializer lists. 130dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 131dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 1329e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// @brief Semantic checking for initializer lists. 1339e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1349e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// The InitListChecker class contains a set of routines that each 1359e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// handle the initialization of a certain kind of entity, e.g., 1369e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arrays, vectors, struct/union types, scalars, etc. The 1379e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// InitListChecker itself performs a recursive walk of the subobject 1389e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure of the type to be initialized, while stepping through 1399e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// the initializer list one element at a time. The IList and Index 1409e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// parameters to each of the Check* routines contain the active 1419e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// (syntactic) initializer list and the index into that initializer 1429e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list that represents the current initializer. Each routine is 1439e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// responsible for moving that Index forward as it consumes elements. 1449e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1459e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// Each Check* routine also has a StructuredList/StructuredIndex 14663e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// arguments, which contains the current "structured" (semantic) 1479e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initializer list and the index into that initializer list where we 1489e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// are copying initializers as we map them over to the semantic 1499e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. Once we have completed our recursive walk of the subobject 1509e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure, we will have constructed a full semantic initializer 1519e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. 1529e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1539e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// C99 designators cause changes in the initializer list traversal, 1549e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// because they make the initialization "jump" into a specific 1559e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// subobject and then continue the initialization from that 1569e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// point. CheckDesignatedInitializer() recursively steps into the 1579e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// designated subobject and manages backing out the recursion to 1589e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initialize the subobjects after the one designated. 1598b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattnernamespace { 160c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorclass InitListChecker { 1610820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner Sema &SemaRef; 162c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool hadError; 163c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor std::map<InitListExpr *, InitListExpr *> SyntacticToSemantic; 164c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *FullyStructuredList; 1651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckImplicitInitList(const InitializedEntity &Entity, 167987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, QualType T, 1689e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 169eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 170eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1718ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckExplicitInitList(const InitializedEntity &Entity, 17246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 1739e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 174eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 175eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1768ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckListElementTypes(const InitializedEntity &Entity, 17746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &DeclType, 1781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 179c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1809e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 181eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 182eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1838ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckSubElementType(const InitializedEntity &Entity, 18446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType ElemType, 185c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1869e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1879e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1888ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckScalarType(const InitializedEntity &Entity, 18946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 190c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1919e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1929e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1938ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckReferenceType(const InitializedEntity &Entity, 1948ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 195930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 196930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 197930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex); 1988ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckVectorType(const InitializedEntity &Entity, 19946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, unsigned &Index, 2009e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2019e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2028ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckStructUnionTypes(const InitializedEntity &Entity, 2032bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, QualType DeclType, 2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator Field, 205c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 2069e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 207eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 208eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 2098ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckArrayType(const InitializedEntity &Entity, 210784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::APSInt elementIndex, 212c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 2139e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2149e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2158ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson bool CheckDesignatedInitializer(const InitializedEntity &Entity, 2169a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, DesignatedInitExpr *DIE, 217711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 2181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &CurrentObjectType, 219c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor RecordDecl::field_iterator *NextField, 220c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor llvm::APSInt *NextElementIndex, 221c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 222c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 223c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &StructuredIndex, 224eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 225eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject); 226c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 227c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor QualType CurrentObjectType, 228c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 229c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned StructuredIndex, 230c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor SourceRange InitRange); 2319e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor void UpdateStructuredListElement(InitListExpr *StructuredList, 2329e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex, 233c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor Expr *expr); 234c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numArrayElements(QualType DeclType); 235c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numStructUnionElements(QualType DeclType); 236930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 237d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor void FillInValueInitForField(unsigned Init, FieldDecl *Field, 238d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 239d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 240cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor void FillInValueInitializations(const InitializedEntity &Entity, 241cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 242c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorpublic: 243cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker(Sema &S, const InitializedEntity &Entity, 244cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *IL, QualType &T); 245c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool HadError() { return hadError; } 246c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 247c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // @brief Retrieves the fully-structured initializer list used for 248c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // semantic analysis and code generation. 249c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } 250c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor}; 2518b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattner} // end anonymous namespace 25268355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 253d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregorvoid InitListChecker::FillInValueInitForField(unsigned Init, FieldDecl *Field, 254d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 255dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitListExpr *ILE, 256d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor bool &RequiresSecondPass) { 257d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 258d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned NumInits = ILE->getNumInits(); 259dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity MemberEntity 260d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitializedEntity::InitializeMember(Field, &ParentEntity); 261d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 262d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // FIXME: We probably don't need to handle references 263d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // specially here, since value-initialization of references is 264d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // handled in InitializationSequence. 265d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->getType()->isReferenceType()) { 266d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // C++ [dcl.init.aggr]p9: 267d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // If an incomplete or empty initializer-list leaves a 268d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // member of reference type uninitialized, the program is 269d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // ill-formed. 270d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized) 271d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << Field->getType() 272d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << ILE->getSyntacticForm()->getSourceRange(); 273d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Field->getLocation(), 274d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor diag::note_uninit_reference_member); 275d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 276d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 277d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 278dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 279d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 280d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor true); 281d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationSequence InitSeq(SemaRef, MemberEntity, Kind, 0, 0); 282d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (!InitSeq) { 283d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitSeq.Diagnose(SemaRef, MemberEntity, Kind, 0, 0); 284d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 285d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 286d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 287dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 28860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult MemberInit 289f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall = InitSeq.Perform(SemaRef, MemberEntity, Kind, MultiExprArg()); 290d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (MemberInit.isInvalid()) { 291d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 292d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 293d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 294dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 295d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) { 296d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Do nothing 297d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (Init < NumInits) { 298d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->setInit(Init, MemberInit.takeAs<Expr>()); 2997491c499e826682e128a400038361ebcbde30eecSebastian Redl } else if (InitSeq.isConstructorInitialization()) { 300d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Value-initialization requires a constructor call, so 301d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // extend the initializer list to include the constructor 302d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // call and make a note that we'll need to take another pass 303d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // through the initializer list. 304709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek ILE->updateInit(SemaRef.Context, Init, MemberInit.takeAs<Expr>()); 305d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass = true; 306d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 307d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitListExpr *InnerILE 308d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 309dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FillInValueInitializations(MemberEntity, InnerILE, 310dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi RequiresSecondPass); 311d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor} 312d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 3134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Recursively replaces NULL values within the given initializer list 3144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// with expressions that perform value-initialization of the 3154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// appropriate type. 316dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 317cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::FillInValueInitializations(const InitializedEntity &Entity, 318cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, 319cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool &RequiresSecondPass) { 3201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((ILE->getType() != SemaRef.Context.VoidTy) && 321930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor "Should not have void type"); 32287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 32387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (ILE->getSyntacticForm()) 32487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor Loc = ILE->getSyntacticForm()->getSourceRange().getBegin(); 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3266217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) { 327d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion() && 328d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->getInitializedFieldInUnion()) 329d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(0, ILE->getInitializedFieldInUnion(), 330d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Entity, ILE, RequiresSecondPass); 331d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor else { 332d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned Init = 0; 333d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor for (RecordDecl::field_iterator 334d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field = RType->getDecl()->field_begin(), 335d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FieldEnd = RType->getDecl()->field_end(); 336d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field != FieldEnd; ++Field) { 337d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->isUnnamedBitfield()) 338d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor continue; 339d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 340d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 34187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 34287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 343d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(Init, *Field, Entity, ILE, RequiresSecondPass); 344d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 345cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 346cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 347d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ++Init; 348d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 349d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Only look at the first initialization of a union. 350d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion()) 351d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor break; 352d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 3534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 3544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType ElementType; 3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 360cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializedEntity ElementEntity = Entity; 36187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumInits = ILE->getNumInits(); 36287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumElements = NumInits; 3630820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) { 3644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = AType->getElementType(); 36587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) 36687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = CAType->getSize().getZExtValue(); 367dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 368cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 369183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) { 3704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = VType->getElementType(); 37187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = VType->getNumElements(); 372dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 373cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 3741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else 3754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = ILE->getType(); 3761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 377dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor for (unsigned Init = 0; Init != NumElements; ++Init) { 37916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (hadError) 38016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return; 38116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 382d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement || 383d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson ElementEntity.getKind() == InitializedEntity::EK_VectorElement) 384cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity.setElementIndex(Init); 385cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 38687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 387cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 388cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor true); 389cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationSequence InitSeq(SemaRef, ElementEntity, Kind, 0, 0); 390cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!InitSeq) { 391cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitSeq.Diagnose(SemaRef, ElementEntity, Kind, 0, 0); 39287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor hadError = true; 39387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 39487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 39587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 39660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult ElementInit 397f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall = InitSeq.Perform(SemaRef, ElementEntity, Kind, MultiExprArg()); 398cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (ElementInit.isInvalid()) { 39916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor hadError = true; 400cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 401cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 402cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 403cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (hadError) { 404cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Do nothing 405cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (Init < NumInits) { 4063e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis // For arrays, just set the expression used for value-initialization 4073e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis // of the "holes" in the array. 4083e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) 4093e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis ILE->setArrayFiller(ElementInit.takeAs<Expr>()); 4103e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis else 4113e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis ILE->setInit(Init, ElementInit.takeAs<Expr>()); 4124423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } else { 4134423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // For arrays, just set the expression used for value-initialization 4144423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // of the rest of elements and exit. 4154423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) { 4164423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis ILE->setArrayFiller(ElementInit.takeAs<Expr>()); 4174423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis return; 4184423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 4194423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis 4207491c499e826682e128a400038361ebcbde30eecSebastian Redl if (InitSeq.isConstructorInitialization()) { 4214423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // Value-initialization requires a constructor call, so 4224423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // extend the initializer list to include the constructor 4234423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // call and make a note that we'll need to take another pass 4244423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // through the initializer list. 4254423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis ILE->updateInit(SemaRef.Context, Init, ElementInit.takeAs<Expr>()); 4264423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis RequiresSecondPass = true; 4274423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 428cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 429ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else if (InitListExpr *InnerILE 430cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 431cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(ElementEntity, InnerILE, RequiresSecondPass); 4324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 4334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 4344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 43568355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 436cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity, 437cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *IL, QualType &T) 4380820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner : SemaRef(S) { 4390cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff hadError = false; 440c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 441b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman unsigned newIndex = 0; 4424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 4431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FullyStructuredList 444ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor = getStructuredSubobjectInit(IL, newIndex, T, 0, 0, IL->getSourceRange()); 445dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckExplicitInitList(Entity, IL, T, newIndex, 44646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson FullyStructuredList, newStructuredIndex, 447eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor /*TopLevelObject=*/true); 448c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 449cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!hadError) { 450cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool RequiresSecondPass = false; 451cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, RequiresSecondPass); 45216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (RequiresSecondPass && !hadError) 453dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FillInValueInitializations(Entity, FullyStructuredList, 454cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass); 455cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 4560cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4570cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4580cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numArrayElements(QualType DeclType) { 459638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // FIXME: use a proper constant 460638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman int maxElements = 0x7FFFFFFF; 461c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = 4620820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 4630cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = static_cast<int>(CAT->getSize().getZExtValue()); 4640cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 4650cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return maxElements; 4660cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4670cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4680cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numStructUnionElements(QualType DeclType) { 4696217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl(); 4704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor int InitializableMembers = 0; 4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (RecordDecl::field_iterator 47217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = structDecl->field_begin(), 47317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = structDecl->field_end(); 4744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Field != FieldEnd; ++Field) { 4754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if ((*Field)->getIdentifier() || !(*Field)->isBitField()) 4764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++InitializableMembers; 4774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 47839ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (structDecl->isUnion()) 479f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return std::min(InitializableMembers, 1); 480f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return InitializableMembers - structDecl->hasFlexibleArrayMember(); 4810cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4820cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4838ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity, 484987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, 4854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType T, unsigned &Index, 4864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 487eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 488eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 4890cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff int maxElements = 0; 4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4910cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (T->isArrayType()) 4920cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numArrayElements(T); 493fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor else if (T->isRecordType()) 4940cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numStructUnionElements(T); 495b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman else if (T->isVectorType()) 496183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall maxElements = T->getAs<VectorType>()->getNumElements(); 4970cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else 4980cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff assert(0 && "CheckImplicitInitList(): Illegal type"); 499b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 500402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman if (maxElements == 0) { 5010820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(ParentIList->getInit(Index)->getLocStart(), 502402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman diag::err_implicit_empty_initializer); 5034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 504402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman hadError = true; 505402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman return; 506402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman } 507402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman 5084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Build a structured initializer list corresponding to this subobject. 5094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredSubobjectInitList 5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList, 5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredIndex, 512ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor SourceRange(ParentIList->getInit(Index)->getSourceRange().getBegin(), 513ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor ParentIList->getSourceRange().getEnd())); 5144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredSubobjectInitIndex = 0; 5154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 5164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Check the element types and build the structural subobject. 51787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned StartIndex = Index; 518dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, ParentIList, T, 519987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 5201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredSubobjectInitList, 521eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredSubobjectInitIndex, 522eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 52387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1); 524a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor StructuredSubobjectInitList->setType(T); 525a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor 526ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor // Update the structured sub-object initializer so that it's ending 52787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor // range corresponds with the end of the last initializer it used. 52887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (EndIndex < ParentIList->getNumInits()) { 5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation EndLoc 53087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor = ParentIList->getInit(EndIndex)->getSourceRange().getEnd(); 53187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor StructuredSubobjectInitList->setRBraceLoc(EndLoc); 53287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 533dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5341e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner // Warn about missing braces. 5351e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner if (T->isArrayType() || T->isRecordType()) { 53647f164e15b9358b51ae65f8249d56842f8750767Tanya Lattner SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), 53747f164e15b9358b51ae65f8249d56842f8750767Tanya Lattner diag::warn_missing_braces) 5381e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner << StructuredSubobjectInitList->getSourceRange() 539dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi << FixItHint::CreateInsertion(StructuredSubobjectInitList->getLocStart(), 540849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor "{") 541849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateInsertion(SemaRef.PP.getLocForEndOfToken( 542dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi StructuredSubobjectInitList->getLocEnd()), 543849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor "}"); 5441e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner } 5450cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5460cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5478ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, 54846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 5494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 551eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 552eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 553c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman assert(IList->isExplicit() && "Illegal Implicit InitListExpr"); 5544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = StructuredList; 5554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList->setSyntacticForm(IList); 556dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true, 55746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson Index, StructuredList, StructuredIndex, TopLevelObject); 5586398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor QualType ExprTy = T.getNonLValueExprType(SemaRef.Context); 5596398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor IList->setType(ExprTy); 5606398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor StructuredList->setType(ExprTy); 561638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (hadError) 562638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 563c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 564638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (Index < IList->getNumInits()) { 565c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman // We have leftover initializers 566e540858b289b23653bcb23646f135729203635cbEli Friedman if (StructuredIndex == 1 && 567e540858b289b23653bcb23646f135729203635cbEli Friedman IsStringInit(StructuredList->getInit(0), T, SemaRef.Context)) { 5687c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers_in_char_array_initializer; 569e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 5707c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor DK = diag::err_excess_initializers_in_char_array_initializer; 571e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 572e540858b289b23653bcb23646f135729203635cbEli Friedman } 573bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman // Special-case 5740820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 575dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getInit(Index)->getSourceRange(); 576d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman } else if (!T->isIncompleteType()) { 577b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // Don't complain for incomplete types, since we'll get an error 578b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // elsewhere 579eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType CurrentObjectType = StructuredList->getType(); 5801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int initKind = 581eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isArrayType()? 0 : 582eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isVectorType()? 1 : 583eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isScalarType()? 2 : 584eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isUnionType()? 3 : 585eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 4; 5867c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 5877c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers; 588e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 589e540858b289b23653bcb23646f135729203635cbEli Friedman DK = diag::err_excess_initializers; 5900863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman hadError = true; 5910863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman } 5920863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman if (SemaRef.getLangOptions().OpenCL && initKind == 1) { 5930863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman DK = diag::err_excess_initializers; 594e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 595e540858b289b23653bcb23646f135729203635cbEli Friedman } 5967c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 5970820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 598eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << initKind << IList->getInit(Index)->getSourceRange(); 599c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 600c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 601cda25a977e4b7fe4e080b87586410eaeab7b62f6Eli Friedman 602759f25237864f3a3cc23eb01f0c0ce6edcc9342dEli Friedman if (T->isScalarType() && !TopLevelObject) 6030820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::warn_braces_around_scalar_init) 604a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor << IList->getSourceRange() 605849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocStart()) 606849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocEnd()); 6070cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6080cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6098ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckListElementTypes(const InitializedEntity &Entity, 61046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 6111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &DeclType, 61287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool SubobjectIsDesignatorContext, 6134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 6144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 615eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 616eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 617c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (DeclType->isScalarType()) { 61846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, DeclType, Index, 61946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 620c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (DeclType->isVectorType()) { 621dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckVectorType(Entity, IList, DeclType, Index, 62246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 623d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor } else if (DeclType->isAggregateType()) { 624d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor if (DeclType->isRecordType()) { 6256217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 6262bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson CheckStructUnionTypes(Entity, IList, DeclType, RD->field_begin(), 6274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubobjectIsDesignatorContext, Index, 628eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 629eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 63087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } else if (DeclType->isArrayType()) { 631f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor llvm::APSInt Zero( 6320820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()), 633f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor false); 634dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckArrayType(Entity, IList, DeclType, Zero, 635784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson SubobjectIsDesignatorContext, Index, 6364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 637ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else 6384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor assert(0 && "Aggregate that isn't a structure or array?!"); 639613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff } else if (DeclType->isVoidType() || DeclType->isFunctionType()) { 640613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff // This type is invalid, issue a diagnostic. 6414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 6420820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 643d162584991885ab004a02573a73ce06422b921fcChris Lattner << DeclType; 644d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman hadError = true; 645930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isRecordType()) { 646930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init]p14: 647930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] If the class is an aggregate (8.5.1), and the initializer 648930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // is a brace-enclosed list, see 8.5.1. 649930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 650930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Note: 8.5.1 is handled below; here, we diagnose the case where 651930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // we have an initializer list and a destination type that is not 652930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an aggregate. 653930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // FIXME: In C++0x, this is yet another form of initialization. 6540820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 655930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType << IList->getSourceRange(); 656930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 657930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isReferenceType()) { 6588ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, DeclType, Index, 6598ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 660c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall } else if (DeclType->isObjCObjectType()) { 6614d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor SemaRef.Diag(IList->getLocStart(), diag::err_init_objc_class) 6624d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor << DeclType; 6634d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 6640cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } else { 6654d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 6664d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor << DeclType; 6674d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 6680cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 6690cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6700cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6718ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckSubElementType(const InitializedEntity &Entity, 67246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 6731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElemType, 6744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 6754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 6764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 6776fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 678c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) { 679c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman unsigned newIndex = 0; 6804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 6811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *newStructuredList 6824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor = getStructuredSubobjectInit(IList, Index, ElemType, 6834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex, 6844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubInitList->getSourceRange()); 68546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckExplicitInitList(Entity, SubInitList, ElemType, newIndex, 6864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor newStructuredList, newStructuredIndex); 6874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 6884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 689fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 690c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (ElemType->isScalarType()) { 691fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return CheckScalarType(Entity, IList, ElemType, Index, 692fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredList, StructuredIndex); 693930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (ElemType->isReferenceType()) { 694fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return CheckReferenceType(Entity, IList, ElemType, Index, 695fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredList, StructuredIndex); 696fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 697930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 698fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (const ArrayType *arrayType = SemaRef.Context.getAsArrayType(ElemType)) { 699fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // arrayType can be incomplete if we're initializing a flexible 700fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // array member. There's nothing we can do with the completed 701fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // type here, though. 702930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 703fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (Expr *Str = IsStringInit(expr, arrayType, SemaRef.Context)) { 704fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall CheckStringInit(Str, ElemType, arrayType, SemaRef); 705fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 706fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 707fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 708930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 709930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 710fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization. 711fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 712fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else if (SemaRef.getLangOptions().CPlusPlus) { 713930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 714fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // All implicit type conversions (clause 4) are considered when 71512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // initializing the aggregate member with an ini- tializer from 716fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // an initializer-list. If the initializer can initialize a 717fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // member, the member is initialized. [...] 718fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 719fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // FIXME: Better EqualLoc? 720fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationKind Kind = 721fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationKind::CreateCopy(expr->getLocStart(), SourceLocation()); 722fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationSequence Seq(SemaRef, Entity, Kind, &expr, 1); 723fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 724fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (Seq) { 725fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ExprResult Result = 726fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall Seq.Perform(SemaRef, Entity, Kind, MultiExprArg(&expr, 1)); 727fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (Result.isInvalid()) 728fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall hadError = true; 729fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 730fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall UpdateStructuredListElement(StructuredList, StructuredIndex, 731fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall Result.takeAs<Expr>()); 732fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 733fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 734fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 735fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 736fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization 737fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else { 738fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // C99 6.7.8p13: 7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 740fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // The initializer for a structure or union object that has 741fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // automatic storage duration shall be either an initializer 742fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // list as described below, or a single expression that has 743fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // compatible structure or union type. In the latter case, the 744fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // initial value of the object, including unnamed members, is 745fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // that of the expression. 746429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult ExprRes = SemaRef.Owned(expr); 747fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if ((ElemType->isRecordType() || ElemType->isVectorType()) && 748429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley SemaRef.CheckSingleAssignmentConstraints(ElemType, ExprRes) 749fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall == Sema::Compatible) { 750429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (ExprRes.isInvalid()) 751429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley hadError = true; 752429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley else { 753429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes = SemaRef.DefaultFunctionArrayLvalueConversion(ExprRes.take()); 754429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (ExprRes.isInvalid()) 755429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley hadError = true; 756429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 757429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley UpdateStructuredListElement(StructuredList, StructuredIndex, 758429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes.takeAs<Expr>()); 759930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 760fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 761930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 762429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes.release(); 763fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization 764fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 765fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 766fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // C++ [dcl.init.aggr]p12: 767fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // 768fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // [...] Otherwise, if the member is itself a non-empty 769fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // subaggregate, brace elision is assumed and the initializer is 770fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // considered for the initialization of the first member of 771fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // the subaggregate. 77261b4bc80e943578ae855810918a1dc9697dbd15bTanya Lattner if (!SemaRef.getLangOptions().OpenCL && 77361b4bc80e943578ae855810918a1dc9697dbd15bTanya Lattner (ElemType->isAggregateType() || ElemType->isVectorType())) { 774fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList, 775fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredIndex); 776fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++StructuredIndex; 777fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else { 778fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // We cannot initialize this element, so let 779fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // PerformCopyInitialization produce the appropriate diagnostic. 780fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall SemaRef.PerformCopyInitialization(Entity, SourceLocation(), 781fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall SemaRef.Owned(expr)); 782fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall hadError = true; 783fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 784fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++StructuredIndex; 785930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 786b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman} 787b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 7888ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckScalarType(const InitializedEntity &Entity, 78946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 7906fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned &Index, 7914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 7924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 793b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Index >= IList->getNumInits()) { 7940820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_empty_scalar_initializer) 795dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getSourceRange(); 796bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman hadError = true; 7974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 7984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 799bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 8000cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 801b934c2d77144471f35c5ebae9e925b056dac8112John McCall 802b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *expr = IList->getInit(Index); 803b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) { 804b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.Diag(SubIList->getLocStart(), 805b934c2d77144471f35c5ebae9e925b056dac8112John McCall diag::warn_many_braces_around_scalar_init) 806b934c2d77144471f35c5ebae9e925b056dac8112John McCall << SubIList->getSourceRange(); 807b934c2d77144471f35c5ebae9e925b056dac8112John McCall 808b934c2d77144471f35c5ebae9e925b056dac8112John McCall CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList, 809b934c2d77144471f35c5ebae9e925b056dac8112John McCall StructuredIndex); 810b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 811b934c2d77144471f35c5ebae9e925b056dac8112John McCall } else if (isa<DesignatedInitExpr>(expr)) { 812b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.Diag(expr->getSourceRange().getBegin(), 813b934c2d77144471f35c5ebae9e925b056dac8112John McCall diag::err_designator_for_scalar_init) 814b934c2d77144471f35c5ebae9e925b056dac8112John McCall << DeclType << expr->getSourceRange(); 815b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; 816b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 817b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 818b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 819b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 820b934c2d77144471f35c5ebae9e925b056dac8112John McCall 821b934c2d77144471f35c5ebae9e925b056dac8112John McCall ExprResult Result = 822b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 823b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.Owned(expr)); 824b934c2d77144471f35c5ebae9e925b056dac8112John McCall 825b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *ResultExpr = 0; 826b934c2d77144471f35c5ebae9e925b056dac8112John McCall 827b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Result.isInvalid()) 828b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; // types weren't compatible. 829b934c2d77144471f35c5ebae9e925b056dac8112John McCall else { 830b934c2d77144471f35c5ebae9e925b056dac8112John McCall ResultExpr = Result.takeAs<Expr>(); 831dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 832b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (ResultExpr != expr) { 833b934c2d77144471f35c5ebae9e925b056dac8112John McCall // The type was promoted, update initializer list. 834b934c2d77144471f35c5ebae9e925b056dac8112John McCall IList->setInit(Index, ResultExpr); 835b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 836b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 837b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (hadError) 838b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 839b934c2d77144471f35c5ebae9e925b056dac8112John McCall else 840b934c2d77144471f35c5ebae9e925b056dac8112John McCall UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 841b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 8420cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 8430cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 8448ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckReferenceType(const InitializedEntity &Entity, 8458ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 846930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 847930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 848930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex) { 849930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (Index < IList->getNumInits()) { 850930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor Expr *expr = IList->getInit(Index); 851930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (isa<InitListExpr>(expr)) { 8520820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 853930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType << IList->getSourceRange(); 854930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 855930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 856930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 857930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 8581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 859930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 86060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = 861a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 862a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson SemaRef.Owned(expr)); 863a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 864a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson if (Result.isInvalid()) 865930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 866a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 867a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson expr = Result.takeAs<Expr>(); 868a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson IList->setInit(Index, expr); 869a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 870930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor if (hadError) 871930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 872930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor else 873930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 874930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 875930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else { 876390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: It would be wonderful if we could point at the actual member. In 877390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // general, it would be useful to pass location information down the stack, 878390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // so that we know the location (or decl) of the "current object" being 879390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // initialized. 8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getLocStart(), 881930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor diag::err_init_reference_member_uninitialized) 882930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << DeclType 883930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor << IList->getSourceRange(); 884930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 885930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 886930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 887930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 888930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 889930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor} 890930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 8918ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckVectorType(const InitializedEntity &Entity, 89246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 8934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 8944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 8954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 89620e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Index >= IList->getNumInits()) 89720e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 89820e047abc5f19dc948436c0fb891450d9cd40667John McCall 89920e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *VT = DeclType->getAs<VectorType>(); 90020e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned maxElements = VT->getNumElements(); 90120e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numEltsInit = 0; 90220e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType elementType = VT->getElementType(); 90320e047abc5f19dc948436c0fb891450d9cd40667John McCall 90420e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!SemaRef.getLangOptions().OpenCL) { 90520e047abc5f19dc948436c0fb891450d9cd40667John McCall // If the initializing element is a vector, try to copy-initialize 90620e047abc5f19dc948436c0fb891450d9cd40667John McCall // instead of breaking it apart (which is doomed to failure anyway). 90720e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *Init = IList->getInit(Index); 90820e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) { 90920e047abc5f19dc948436c0fb891450d9cd40667John McCall ExprResult Result = 91020e047abc5f19dc948436c0fb891450d9cd40667John McCall SemaRef.PerformCopyInitialization(Entity, Init->getLocStart(), 91120e047abc5f19dc948436c0fb891450d9cd40667John McCall SemaRef.Owned(Init)); 91220e047abc5f19dc948436c0fb891450d9cd40667John McCall 91320e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *ResultExpr = 0; 91420e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Result.isInvalid()) 91520e047abc5f19dc948436c0fb891450d9cd40667John McCall hadError = true; // types weren't compatible. 91620e047abc5f19dc948436c0fb891450d9cd40667John McCall else { 91720e047abc5f19dc948436c0fb891450d9cd40667John McCall ResultExpr = Result.takeAs<Expr>(); 918dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 91920e047abc5f19dc948436c0fb891450d9cd40667John McCall if (ResultExpr != Init) { 92020e047abc5f19dc948436c0fb891450d9cd40667John McCall // The type was promoted, update initializer list. 92120e047abc5f19dc948436c0fb891450d9cd40667John McCall IList->setInit(Index, ResultExpr); 9222ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 9232ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 92420e047abc5f19dc948436c0fb891450d9cd40667John McCall if (hadError) 92520e047abc5f19dc948436c0fb891450d9cd40667John McCall ++StructuredIndex; 92620e047abc5f19dc948436c0fb891450d9cd40667John McCall else 92720e047abc5f19dc948436c0fb891450d9cd40667John McCall UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 92820e047abc5f19dc948436c0fb891450d9cd40667John McCall ++Index; 92920e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 9300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 9311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 93220e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 93320e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 934dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 93520e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { 93620e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 93720e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Index >= IList->getNumInits()) 93820e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 939dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 94020e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 94120e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 94220e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 94320e047abc5f19dc948436c0fb891450d9cd40667John McCall } 94420e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 94520e047abc5f19dc948436c0fb891450d9cd40667John McCall } 94620e047abc5f19dc948436c0fb891450d9cd40667John McCall 94720e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 94820e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 949dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 95020e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL initializers allows vectors to be constructed from vectors. 95120e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i) { 95220e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 95320e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Index >= IList->getNumInits()) 95420e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 955dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 95620e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 95720e047abc5f19dc948436c0fb891450d9cd40667John McCall 95820e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType IType = IList->getInit(Index)->getType(); 95920e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!IType->isVectorType()) { 96020e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 96120e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 96220e047abc5f19dc948436c0fb891450d9cd40667John McCall ++numEltsInit; 96320e047abc5f19dc948436c0fb891450d9cd40667John McCall } else { 96420e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType VecType; 96520e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *IVT = IType->getAs<VectorType>(); 96620e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numIElts = IVT->getNumElements(); 967dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 96820e047abc5f19dc948436c0fb891450d9cd40667John McCall if (IType->isExtVectorType()) 96920e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getExtVectorType(elementType, numIElts); 97020e047abc5f19dc948436c0fb891450d9cd40667John McCall else 97120e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getVectorType(elementType, numIElts, 972e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson IVT->getVectorKind()); 97320e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, VecType, Index, 97420e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 97520e047abc5f19dc948436c0fb891450d9cd40667John McCall numEltsInit += numIElts; 97620e047abc5f19dc948436c0fb891450d9cd40667John McCall } 9770cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 97820e047abc5f19dc948436c0fb891450d9cd40667John McCall 97920e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL requires all elements to be initialized. 98020e047abc5f19dc948436c0fb891450d9cd40667John McCall if (numEltsInit != maxElements) 98120e047abc5f19dc948436c0fb891450d9cd40667John McCall if (SemaRef.getLangOptions().OpenCL) 98220e047abc5f19dc948436c0fb891450d9cd40667John McCall SemaRef.Diag(IList->getSourceRange().getBegin(), 98320e047abc5f19dc948436c0fb891450d9cd40667John McCall diag::err_vector_incorrect_num_initializers) 98420e047abc5f19dc948436c0fb891450d9cd40667John McCall << (numEltsInit < maxElements) << maxElements << numEltsInit; 9850cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 9860cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 9878ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckArrayType(const InitializedEntity &Entity, 988784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 98987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt elementIndex, 9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 9914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 9924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 9934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 994ce6c9b7da219c8640a0559f75770cfc6622de083John McCall const ArrayType *arrayType = SemaRef.Context.getAsArrayType(DeclType); 995ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 9960cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // Check for the special-case of initializing an array with a string. 9970cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 998ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (Expr *Str = IsStringInit(IList->getInit(Index), arrayType, 99979e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner SemaRef.Context)) { 1000fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall CheckStringInit(Str, DeclType, arrayType, SemaRef); 10014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We place the string literal directly into the resulting 10024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initializer list. This is the only place where the structure 10034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // of the structured initializer list doesn't match exactly, 10044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // because doing so would involve allocating one character 10054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // constant for each string. 1006f71ae8d8024561f92dd7916363e7a791684563ccChris Lattner UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 10070820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner StructuredList->resizeInits(SemaRef.Context, StructuredIndex); 10080cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 10090cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return; 10100cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 10110cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1012ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) { 1013638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // Check for VLAs; in standard C it would be possible to check this 1014638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // earlier, but I don't know where clang accepts VLAs (gcc accepts 1015638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // them in all sorts of strange places). 10160820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(VAT->getSizeExpr()->getLocStart(), 1017dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner diag::err_variable_object_no_init) 1018dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << VAT->getSizeExpr()->getSourceRange(); 1019638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman hadError = true; 10204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 10214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 1022638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 1023638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman } 1024638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman 102505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We might know the maximum number of elements in advance. 10264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor llvm::APSInt maxElements(elementIndex.getBitWidth(), 10274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor elementIndex.isUnsigned()); 102805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool maxElementsKnown = false; 1029ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(arrayType)) { 103005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = CAT->getSize(); 10319f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth()); 1032e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 103305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElementsKnown = true; 103405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 103505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1036ce6c9b7da219c8640a0559f75770cfc6622de083John McCall QualType elementType = arrayType->getElementType(); 103705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 103805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 103905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 104087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 104187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 104287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 104387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 104487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 104587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 104687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. elementIndex will be 104787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // updated to be the next array element we'll initialize. 10489a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 10494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, 0, &elementIndex, Index, 1050eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, true, 1051eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) { 105205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 105387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor continue; 105487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 105587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 1056f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor if (elementIndex.getBitWidth() > maxElements.getBitWidth()) 10579f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad maxElements = maxElements.extend(elementIndex.getBitWidth()); 1058f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor else if (elementIndex.getBitWidth() < maxElements.getBitWidth()) 10599f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extend(maxElements.getBitWidth()); 1060e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 1061f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor 106287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If the array is of incomplete type, keep track of the number of 106387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // elements in the initializer. 106487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 106587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor maxElements = elementIndex; 106605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 106705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 106805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 106905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 107005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we know the maximum number of elements, and we've already 107105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // hit it, stop consuming elements in the initializer list. 107205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElementsKnown && elementIndex == maxElements) 10730cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff break; 107405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 10758ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 1076dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex, 10778ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson Entity); 10788ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Check this element. 10798ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 10808ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 108105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++elementIndex; 108205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 108305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If the array is of incomplete type, keep track of the number of 108405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // elements in the initializer. 108505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 108605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = elementIndex; 10870cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1088587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman if (!hadError && DeclType->isIncompleteArrayType()) { 10890cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // If this is an incomplete array type, the actual type needs to 1090396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // be calculated here. 1091e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned()); 109205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElements == Zero) { 1093396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // Sizing an array implicitly to zero is not allowed by ISO C, 1094396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // but is supported by GNU. 10950820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 1096396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar diag::ext_typecheck_zero_array_size); 10970cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1098396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar 10991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements, 1100396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar ArrayType::Normal, 0); 11010cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 11020cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 11030cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 11048ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, 11052bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, 11061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType DeclType, 110787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator Field, 11081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 11094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 11104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 1111eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 1112eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 11136217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl* structDecl = DeclType->getAs<RecordType>()->getDecl(); 11141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1115b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // If the record is invalid, some of it's members are invalid. To avoid 1116b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // confusion, we forgo checking the intializer for the entire record. 1117b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman if (structDecl->isInvalidDecl()) { 1118b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman hadError = true; 1119b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman return; 11201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 11213498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 11223498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (DeclType->isUnionType() && IList->getNumInits() == 0) { 11233498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor // Value-initialize the first named member of the union. 11246217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 112517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator FieldEnd = RD->field_end(); 11263498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor Field != FieldEnd; ++Field) { 11273498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (Field->getDeclName()) { 11283498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 11293498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor break; 11303498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 11313498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 11323498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return; 11333498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 11343498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 113505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If structDecl is a forward declaration, this loop won't do 113605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // anything except look at designated initializers; That's okay, 113705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // because an error should get printed out elsewhere. It might be 113805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // worthwhile to skip over the rest of the initializer, though. 11396217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 114017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RecordDecl::field_iterator FieldEnd = RD->field_end(); 1141dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor bool InitializedSomething = false; 114280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall bool CheckForMissingFields = true; 114305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 114405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 114505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 114605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 114787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 114887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 114987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 115087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 115187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 115287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 115387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. Field will be updated to 115487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the next field that we'll be initializing. 11559a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 11564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, &Field, 0, Index, 1157eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 1158eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, TopLevelObject)) 115905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 116005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1161dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 116280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 116380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Disable check for missing fields when designators are used. 116480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // This matches gcc behaviour. 116580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall CheckForMissingFields = false; 116605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 116705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 116805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 116905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field == FieldEnd) { 117005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We've run out of fields. We're done. 117144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor break; 117205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 117344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1174dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor // We've already initialized a member of a union. We're done. 1175dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor if (InitializedSomething && DeclType->isUnionType()) 1176dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor break; 1177dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor 117805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we've hit the flexible array member at the end, we're done. 117905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field->getType()->isIncompleteArrayType()) 1180b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman break; 118144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 11820bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (Field->isUnnamedBitfield()) { 11834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Don't initialize unnamed bitfields, e.g. "int : 20;" 118405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 1185b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman continue; 11860cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 118744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 118854001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor // Make sure we can use this declaration. 118954001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor if (SemaRef.DiagnoseUseOfDecl(*Field, 119054001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor IList->getInit(Index)->getLocStart())) { 119154001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Index; 119254001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Field; 119354001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor hadError = true; 119454001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor continue; 119554001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor } 119654001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor 11978ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 11988ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 11998ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 12008ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 1201dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 12020bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 12030bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (DeclType->isUnionType()) { 12040bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor // Initialize the first field within the union. 12050bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 12060bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 120705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 120805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 12090cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 121044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 121180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Emit warnings for missing struct field initializers. 1212dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (InitializedSomething && CheckForMissingFields && Field != FieldEnd && 121380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall !Field->getType()->isIncompleteArrayType() && !DeclType->isUnionType()) { 121480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // It is possible we have one or more unnamed bitfields remaining. 121580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Find first (if any) named field and emit warning. 121680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall for (RecordDecl::field_iterator it = Field, end = RD->field_end(); 121780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall it != end; ++it) { 121880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall if (!it->isUnnamedBitfield()) { 121980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall SemaRef.Diag(IList->getSourceRange().getEnd(), 122080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall diag::warn_missing_field_initializers) << it->getName(); 122180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall break; 122280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 122380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 122480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 122580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 12261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() || 1227a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor Index >= IList->getNumInits()) 1228eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return; 1229eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1230eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Handle GNU flexible array initializers. 12311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!TopLevelObject && 1232a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor (!isa<InitListExpr>(IList->getInit(Index)) || 1233a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor cast<InitListExpr>(IList->getInit(Index))->getNumInits() > 0)) { 12341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getInit(Index)->getSourceRange().getBegin(), 1235eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_nonempty) 1236eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << IList->getInit(Index)->getSourceRange().getBegin(); 12370820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1238eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1239eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor hadError = true; 1240a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor ++Index; 1241a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor return; 1242a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor } else { 12431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(IList->getInit(Index)->getSourceRange().getBegin(), 1244a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor diag::ext_flexible_array_init) 1245a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor << IList->getInit(Index)->getSourceRange().getBegin(); 1246a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1247a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor << *Field; 1248eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1249eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 12508ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 12518ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1252dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 12538ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (isa<InitListExpr>(IList->getInit(Index))) 1254dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 12558ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 12568ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson else 1257dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index, 1258987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson StructuredList, StructuredIndex); 12590cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 12600cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1261ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Expand a field designator that refers to a member of an 1262ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// anonymous struct or union into a series of field designators that 1263ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// refers to the field within the appropriate subobject. 1264ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// 1265ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorstatic void ExpandAnonymousFieldDesignator(Sema &SemaRef, 12661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 12671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned DesigIdx, 1268a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IndirectFieldDecl *IndirectField) { 1269ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor typedef DesignatedInitExpr::Designator Designator; 1270ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1271ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the replacement designators. 12725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Designator, 4> Replacements; 1273a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(), 1274a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet PE = IndirectField->chain_end(); PI != PE; ++PI) { 1275a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (PI + 1 == PE) 12761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Replacements.push_back(Designator((IdentifierInfo *)0, 1277ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getDotLoc(), 1278ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getFieldLoc())); 1279ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor else 1280ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.push_back(Designator((IdentifierInfo *)0, SourceLocation(), 1281ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SourceLocation())); 1282a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(isa<FieldDecl>(*PI)); 1283a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Replacements.back().setField(cast<FieldDecl>(*PI)); 1284ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1285ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1286ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Expand the current designator into the set of replacement 1287ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // designators, so we have a full subobject path down to where the 1288ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // member of the anonymous struct/union is actually stored. 1289319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0], 1290ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor &Replacements[0] + Replacements.size()); 1291a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet} 12921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1293dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Given an implicit anonymous field, search the IndirectField that 1294a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet/// corresponds to FieldName. 1295a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichetstatic IndirectFieldDecl *FindIndirectFieldDesignator(FieldDecl *AnonField, 1296a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IdentifierInfo *FieldName) { 1297a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(AnonField->isAnonymousStructOrUnion()); 1298a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Decl *NextDecl = AnonField->getNextDeclInContext(); 1299a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet while (IndirectFieldDecl *IF = dyn_cast<IndirectFieldDecl>(NextDecl)) { 1300a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (FieldName && FieldName == IF->getAnonField()->getIdentifier()) 1301a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet return IF; 1302a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet NextDecl = NextDecl->getNextDeclInContext(); 1303ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1304a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet return 0; 1305ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 1306ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 130705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Check the well-formedness of a C99 designated initializer. 130805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 130905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Determines whether the designated initializer @p DIE, which 131005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// resides at the given @p Index within the initializer list @p 131105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// IList, is well-formed for a current object of type @p DeclType 131205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// (C99 6.7.8). The actual subobject that this designator refers to 13131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// within the current subobject is returned in either 13144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @p NextField or @p NextElementIndex (whichever is appropriate). 131505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 131605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param IList The initializer list in which this designated 131705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// initializer occurs. 131805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 1319711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DIE The designated initializer expression. 1320711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// 1321711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DesigIdx The index of the current designator. 132205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 132305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param DeclType The type of the "current object" (C99 6.7.8p17), 132405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// into which the designation in @p DIE should refer. 132505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 132687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextField If non-NULL and the first designator in @p DIE is 132787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// a field, this will be set to the field declaration corresponding 132887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// to the field named by the designator. 132905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 133087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextElementIndex If non-NULL and the first designator in @p 133187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// DIE is an array designator or GNU array-range designator, this 133287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// will be set to the last index initialized by this designator. 133305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 133405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param Index Index into @p IList where the designated initializer 133505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @p DIE occurs. 133605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 13374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @param StructuredList The initializer list expression that 13384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// describes all of the subobject initializers in the order they'll 13394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// actually be initialized. 13404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 134105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @returns true if there was an error, false otherwise. 13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 13438ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders CarlssonInitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 13449a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, 13451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 1346711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 134787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor QualType &CurrentObjectType, 134887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator *NextField, 134987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt *NextElementIndex, 13504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 13514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 135234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned &StructuredIndex, 1353eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 1354eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 1355711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if (DesigIdx == DIE->size()) { 135687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the actual initialization for the designated object type. 135787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 13586fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 13596fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Temporarily remove the designator expression from the 13606fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // initializer list that the child calls see, so that we don't try 13616fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // to re-process the designator. 13626fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned OldIndex = Index; 13636fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE->getInit()); 13646fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 13659a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson CheckSubElementType(Entity, IList, CurrentObjectType, Index, 13664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 13676fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 13686fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Restore the designated initializer expression in the syntactic 13696fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // form of the initializer list. 13706fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor if (IList->getInit(OldIndex) != DIE->getInit()) 13716fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor DIE->setInit(IList->getInit(OldIndex)); 13726fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE); 13736fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 137487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 137587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 137605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1377711997184366d584c9c437102cae1e9d9927b986Douglas Gregor bool IsFirstDesignator = (DesigIdx == 0); 13781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((IsFirstDesignator || StructuredList) && 13794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor "Need a non-designated initializer list to start from"); 13804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1381711997184366d584c9c437102cae1e9d9927b986Douglas Gregor DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx); 13824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Determine the structural initializer list that corresponds to the 13834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // current subobject. 13844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList = IsFirstDesignator? SyntacticToSemantic[IList] 13851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : getStructuredSubobjectInit(IList, Index, CurrentObjectType, 1386ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor StructuredList, StructuredIndex, 13874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange(D->getStartLocation(), 13884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DIE->getSourceRange().getEnd())); 13894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor assert(StructuredList && "Expected a structured initializer list"); 13904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 139187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (D->isFieldDesignator()) { 139287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p7: 139387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 139487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 139587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 139687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // . identifier 139787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 139887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have 139987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // structure or union type and the identifier shall be the 14001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // name of a member of that type. 14016217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = CurrentObjectType->getAs<RecordType>(); 140287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!RT) { 140387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation Loc = D->getDotLoc(); 140487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (Loc.isInvalid()) 140587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Loc = D->getFieldLoc(); 14060820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Loc, diag::err_field_designator_non_aggr) 14070820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner << SemaRef.getLangOptions().CPlusPlus << CurrentObjectType; 140887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 140987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 141087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 141187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 14124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Note: we perform a linear search of the fields here, despite 14134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the fact that we have a faster lookup method, because we always 14144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // need to compute the field's index. 1415ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *KnownField = D->getField(); 141687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IdentifierInfo *FieldName = D->getFieldName(); 14174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned FieldIndex = 0; 14181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator 141917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = RT->getDecl()->field_begin(), 142017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RT->getDecl()->field_end(); 14214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (; Field != FieldEnd; ++Field) { 14224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field->isUnnamedBitfield()) 14234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor continue; 1424dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1425a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet // If we find a field representing an anonymous field, look in the 1426a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet // IndirectFieldDecl that follow for the designated initializer. 1427a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (!KnownField && Field->isAnonymousStructOrUnion()) { 1428a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (IndirectFieldDecl *IF = 1429a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet FindIndirectFieldDesignator(*Field, FieldName)) { 1430a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IF); 1431a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet D = DIE->getDesignator(DesigIdx); 1432a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet break; 1433a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1434a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1435022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor if (KnownField && KnownField == *Field) 1436022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor break; 1437022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor if (FieldName && FieldName == Field->getIdentifier()) 14384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor break; 14394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 14404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 144187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 144287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 14434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field == FieldEnd) { 1444ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // There was no normal field in the struct with the designated 1445ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // name. Perform another lookup for this name, which may find 1446ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // something that we can't designate (e.g., a member function), 1447ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // may find nothing, or may find a member of an anonymous 14481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // struct/union. 144917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName); 1450c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldDecl *ReplacementField = 0; 14514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Lookup.first == Lookup.second) { 1452c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Name lookup didn't find anything. Determine whether this 1453c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // was a typo for another field name. 1454dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi LookupResult R(SemaRef, FieldName, D->getFieldLoc(), 1455c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Sema::LookupMemberName); 1456d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor TypoCorrection Corrected = SemaRef.CorrectTypo( 1457d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor DeclarationNameInfo(FieldName, D->getFieldLoc()), 1458d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Sema::LookupMemberName, /*Scope=*/NULL, /*SS=*/NULL, 1459d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor RT->getDecl(), false, Sema::CTC_NoKeywords); 1460d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor if ((ReplacementField = Corrected.getCorrectionDeclAs<FieldDecl>()) && 14617a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl ReplacementField->getDeclContext()->getRedeclContext() 1462c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ->Equals(RT->getDecl())) { 1463d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor std::string CorrectedStr( 1464d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Corrected.getAsString(SemaRef.getLangOptions())); 1465d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor std::string CorrectedQuotedStr( 1466d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Corrected.getQuoted(SemaRef.getLangOptions())); 1467dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.Diag(D->getFieldLoc(), 1468c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor diag::err_field_designator_unknown_suggest) 1469d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << FieldName << CurrentObjectType << CorrectedQuotedStr 1470d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << FixItHint::CreateReplacement(D->getFieldLoc(), CorrectedStr); 1471dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.Diag(ReplacementField->getLocation(), 1472d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor diag::note_previous_decl) << CorrectedQuotedStr; 1473c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else { 1474c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown) 1475c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType; 1476c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++Index; 1477c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor return true; 1478c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1479c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1480dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1481c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!ReplacementField) { 14824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Name lookup found something, but it wasn't a field. 14830820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield) 14844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << FieldName; 14851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag((*Lookup.first)->getLocation(), 14864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_field_designator_found); 1487ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman ++Index; 1488ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman return true; 1489ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1490c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1491a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (!KnownField) { 1492c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // The replacement field comes from typo correction; find it 1493c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // in the list of fields. 1494c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldIndex = 0; 1495c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field = RT->getDecl()->field_begin(); 1496c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor for (; Field != FieldEnd; ++Field) { 1497c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (Field->isUnnamedBitfield()) 1498c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor continue; 1499c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1500dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (ReplacementField == *Field || 1501c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field->getIdentifier() == ReplacementField->getIdentifier()) 1502c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor break; 1503c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1504c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++FieldIndex; 1505c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1506c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 150787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 15084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 15094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // All of the fields of a union are located at the same place in 15104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the initializer list. 15110bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (RT->getDecl()->isUnion()) { 15124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor FieldIndex = 0; 15130bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 15140bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 15154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 151654001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor // Make sure we can use this declaration. 151754001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor if (SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc())) { 151854001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Index; 151954001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor return true; 152054001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor } 152154001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor 152287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Update the designator with the field declaration. 15234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor D->setField(*Field); 15241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 15264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this field. 15274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (FieldIndex >= StructuredList->getNumInits()) 15280820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1); 15294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1530eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // This designator names a flexible array member. 1531eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Field->getType()->isIncompleteArrayType()) { 1532eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool Invalid = false; 1533711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if ((DesigIdx + 1) != DIE->size()) { 1534eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // We can't designate an object within the flexible array 1535eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // member (because GCC doesn't allow it). 15361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr::Designator *NextD 1537711997184366d584c9c437102cae1e9d9927b986Douglas Gregor = DIE->getDesignator(DesigIdx + 1); 15381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(NextD->getStartLocation(), 1539eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_designator_into_flexible_array_member) 15401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << SourceRange(NextD->getStartLocation(), 1541eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor DIE->getSourceRange().getEnd()); 15420820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1543eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1544eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1545eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1546eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 15479046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner if (!hadError && !isa<InitListExpr>(DIE->getInit()) && 15489046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner !isa<StringLiteral>(DIE->getInit())) { 1549eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // The initializer is not an initializer list. 15500820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(DIE->getInit()->getSourceRange().getBegin(), 1551eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_needs_braces) 1552eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << DIE->getInit()->getSourceRange(); 15530820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1554eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1555eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1556eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1557eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1558eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Handle GNU flexible array initializers. 15591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Invalid && !TopLevelObject && 1560eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor cast<InitListExpr>(DIE->getInit())->getNumInits() > 0) { 15611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(DIE->getSourceRange().getBegin(), 1562eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor diag::err_flexible_array_init_nonempty) 1563eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << DIE->getSourceRange().getBegin(); 15640820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 1565eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << *Field; 1566eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1567eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1568eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1569eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Invalid) { 1570eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Index; 1571eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1572eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1573eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1574eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Initialize the array. 1575eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool prevHadError = hadError; 1576eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1577eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned OldIndex = Index; 1578eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(Index, DIE->getInit()); 15798ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 15808ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 15818ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 15828ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 1583eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, newStructuredIndex); 15848ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 1585eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(OldIndex, DIE); 1586eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (hadError && !prevHadError) { 1587eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Field; 1588eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++FieldIndex; 1589eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (NextField) 1590eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor *NextField = Field; 1591eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredIndex = FieldIndex; 1592eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1593eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1594eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } else { 1595eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Recurse to check later designated subobjects. 1596eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType FieldType = (*Field)->getType(); 1597eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1598dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 15999a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity MemberEntity = 16008ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1601dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1, 1602dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FieldType, 0, 0, Index, 16039a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, newStructuredIndex, 1604eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, false)) 1605eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1606eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 160787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 160887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Find the position of the next field to be initialized in this 160987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // subobject. 161087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Field; 16114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 161205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 161387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 161487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this struct/class/union subobject. 161587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 161687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextField) 161787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor *NextField = Field; 16184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = FieldIndex; 161987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 162087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 162105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 162234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 162334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 162434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1625ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // We've already initialized something in the union; we're done. 1626ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (RT->getDecl()->isUnion()) 1627ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return hadError; 1628ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 162987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining fields within this class/struct/union subobject. 163087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 1631dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 16328ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckStructUnionTypes(Entity, IList, CurrentObjectType, Field, false, Index, 16334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, FieldIndex); 163487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 163587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 163605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 163787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p6: 163887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 163987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 164087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 164187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ] 164287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 164387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have array 164487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // type and the expression shall be an integer constant 164587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // expression. If the array is of unknown size, any 164687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // nonnegative value is valid. 164787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 164887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Additionally, cope with the GNU extension that permits 164987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designators of the form 165087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 165187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ... constant-expression ] 16520820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType); 165387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!AT) { 16540820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array) 165587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor << CurrentObjectType; 165687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 165787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 165887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 165905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 166087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Expr *IndexExpr = 0; 166134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor llvm::APSInt DesignatedStartIndex, DesignatedEndIndex; 166234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (D->isArrayDesignator()) { 166387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayIndex(*D); 16643bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedStartIndex = IndexExpr->EvaluateAsInt(SemaRef.Context); 166534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex = DesignatedStartIndex; 166634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 166787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(D->isArrayRangeDesignator() && "Need array-range designator"); 16683bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 16691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedStartIndex = 16703bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DIE->getArrayRangeStart(*D)->EvaluateAsInt(SemaRef.Context); 16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedEndIndex = 16723bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DIE->getArrayRangeEnd(*D)->EvaluateAsInt(SemaRef.Context); 167387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayRangeEnd(*D); 167434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1675e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // Codegen can't handle evaluating array range designators that have side 1676e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // effects, because we replicate the AST value for each initialized element. 1677e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // As such, set the sawArrayRangeDesignator() bit if we initialize multiple 1678e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // elements with something that has a side effect, so codegen can emit an 1679e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // "error unsupported" error instead of miscompiling the app. 1680e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&& 1681e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner DIE->getInit()->HasSideEffects(SemaRef.Context)) 1682a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor FullyStructuredList->sawArrayRangeDesignator(); 168387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 168405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 168587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (isa<ConstantArrayType>(AT)) { 168687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false); 16879f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 16889f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth()); 168934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned()); 16909f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 16919f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth()); 169234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned()); 169334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex >= MaxElements) { 16940820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IndexExpr->getSourceRange().getBegin(), 169587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor diag::err_array_designator_too_large) 169634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor << DesignatedEndIndex.toString(10) << MaxElements.toString(10) 169787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor << IndexExpr->getSourceRange(); 169887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 169987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 170005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 170134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 170234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Make sure the bit-widths and signedness match. 170334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedStartIndex.getBitWidth() > DesignatedEndIndex.getBitWidth()) 17049f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 17059f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extend(DesignatedStartIndex.getBitWidth()); 17063bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner else if (DesignatedStartIndex.getBitWidth() < 17073bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedEndIndex.getBitWidth()) 17089f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 17099f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extend(DesignatedEndIndex.getBitWidth()); 171034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(true); 171134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(true); 171205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 17131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 17154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this array element. 171634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits()) 17171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredList->resizeInits(SemaRef.Context, 171834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.getZExtValue() + 1); 171934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 172034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Repeatedly perform subobject initializations in the range 172134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // [DesignatedStartIndex, DesignatedEndIndex]. 172234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 172334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next designator 172434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned ElementIndex = DesignatedStartIndex.getZExtValue(); 172534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned OldIndex = Index; 1726dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 17279a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity ElementEntity = 17288ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 17299a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 173034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor while (DesignatedStartIndex <= DesignatedEndIndex) { 173134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Recurse to check later designated subobjects. 173234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor QualType ElementType = AT->getElementType(); 173334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor Index = OldIndex; 1734dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 17359a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementEntity.setElementIndex(ElementIndex); 1736dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(ElementEntity, IList, DIE, DesigIdx + 1, 1737dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementType, 0, 0, Index, 17389a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, ElementIndex, 1739eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor (DesignatedStartIndex == DesignatedEndIndex), 1740eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) 174134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return true; 174287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 174334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next index in the array that we'll be initializing. 174434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ++DesignatedStartIndex; 174534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ElementIndex = DesignatedStartIndex.getZExtValue(); 174634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } 174787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 174887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 174987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this array subobject. 175087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 175187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextElementIndex) 175234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor *NextElementIndex = DesignatedStartIndex; 17534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = ElementIndex; 175487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 175587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 17561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 175734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 175834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 175934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 176087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining elements within this array subobject. 176105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool prevHadError = hadError; 1762dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex, 1763784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 17644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, ElementIndex); 17651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return hadError && !prevHadError; 176605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 176705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 17684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// Get the structured initializer list for a subobject of type 17694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// @p CurrentObjectType. 17704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListExpr * 17714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 17724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType CurrentObjectType, 17734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 17744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredIndex, 17754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange InitRange) { 17764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *ExistingInit = 0; 17774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 17784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = SyntacticToSemantic[IList]; 17794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else if (StructuredIndex < StructuredList->getNumInits()) 17804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = StructuredList->getInit(StructuredIndex); 17811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit)) 17834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 17844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (ExistingInit) { 17864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We are creating an initializer list that initializes the 17874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobjects of the current object, but there was already an 17884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initialization that completely initialized the current 17894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject, e.g., by a compound literal: 17901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 17914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X { int a, b; }; 17924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 }; 17931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 17944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Here, xs[0].a == 0 and xs[0].b == 3, since the second, 17954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // designated initializer re-initializes the whole 17964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject [0], overwriting previous initializers. 17971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(InitRange.getBegin(), 1798ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor diag::warn_subobject_initializer_overrides) 17994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << InitRange; 18001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(ExistingInit->getSourceRange().getBegin(), 18014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 180254f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 18034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << ExistingInit->getSourceRange(); 18044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 18054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *Result 1807709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek = new (SemaRef.Context) InitListExpr(SemaRef.Context, 1808709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitRange.getBegin(), 0, 0, 1809ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek InitRange.getEnd()); 1810ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor 18116398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor Result->setType(CurrentObjectType.getNonLValueExprType(SemaRef.Context)); 18124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1813fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Pre-allocate storage for the structured initializer list. 1814fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor unsigned NumElements = 0; 181508457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor unsigned NumInits = 0; 1816f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis bool GotNumInits = false; 1817f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (!StructuredList) { 181808457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = IList->getNumInits(); 1819f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis GotNumInits = true; 1820f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis } else if (Index < IList->getNumInits()) { 1821f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) { 182208457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = SubList->getNumInits(); 1823f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis GotNumInits = true; 1824f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis } 182508457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor } 182608457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor 18271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ArrayType *AType 1828fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor = SemaRef.Context.getAsArrayType(CurrentObjectType)) { 1829fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) { 1830fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = CAType->getSize().getZExtValue(); 1831fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Simple heuristic so that we don't allocate a very large 1832fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // initializer with many empty entries at the end. 1833f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (GotNumInits && NumElements > NumInits) 1834fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 0; 1835fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 1836183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) 1837fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = VType->getNumElements(); 18386217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const RecordType *RType = CurrentObjectType->getAs<RecordType>()) { 1839fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor RecordDecl *RDecl = RType->getDecl(); 1840fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (RDecl->isUnion()) 1841fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 1; 1842fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor else 18431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumElements = std::distance(RDecl->field_begin(), 184417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RDecl->field_end()); 1845fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 1846fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 184708457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor if (NumElements < NumInits) 1848fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = IList->getNumInits(); 1849fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 1850709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Result->reserveInits(SemaRef.Context, NumElements); 1851fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 18524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Link this new initializer list into the structured initializer 18534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // lists. 18544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (StructuredList) 1855709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result); 18564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else { 18574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Result->setSyntacticForm(IList); 18584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = Result; 18594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 18604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 18614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 18624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 18634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 18644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Update the initializer at index @p StructuredIndex within the 18654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// structured initializer list to the value @p expr. 18664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregorvoid InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, 18674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex, 18684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *expr) { 18694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // No structured initializer list to update 18704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 18714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 18724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1873709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, 1874709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredIndex, expr)) { 18754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // This initializer overwrites a previous initializer. Warn. 18761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(expr->getSourceRange().getBegin(), 18774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::warn_initializer_overrides) 18784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << expr->getSourceRange(); 18791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(PrevInit->getSourceRange().getBegin(), 18804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 188154f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 18824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << PrevInit->getSourceRange(); 18834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 18841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 18864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 18874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 188805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Check that the given Index expression is a valid array designator 188905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// value. This is essentailly just a wrapper around 18903bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner/// VerifyIntegerConstantExpression that also checks for negative values 189105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// and produces a reasonable diagnostic if there is a 189205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// failure. Returns true if there was an error, false otherwise. If 189305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// everything went okay, Value will receive the value of the constant 189405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// expression. 18951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool 18963bf6893b77c30cb774100e0fa7ae029331675ec1Chris LattnerCheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) { 189705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation Loc = Index->getSourceRange().getBegin(); 189805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 189905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Make sure this is an integer constant expression. 19003bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (S.VerifyIntegerConstantExpression(Index, &Value)) 19013bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return true; 19023bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 19033bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (Value.isSigned() && Value.isNegative()) 19043bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return S.Diag(Loc, diag::err_array_designator_negative) 190505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << Value.toString(10) << Index->getSourceRange(); 190605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 190753d3d8e0662197f7245d8f5ff697a72a2b4b3f54Douglas Gregor Value.setIsUnsigned(true); 190805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return false; 190905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 191005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 191160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, 19127663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky SourceLocation Loc, 19137663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky bool GNUSyntax, 19147663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky ExprResult Init) { 191505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef DesignatedInitExpr::Designator ASTDesignator; 191605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 191705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool Invalid = false; 19185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ASTDesignator, 32> Designators; 19195f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Expr *, 32> InitExpressions; 192005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 192105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Build designators and check array designator expressions. 192205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) { 192305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor const Designator &D = Desig.getDesignator(Idx); 192405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor switch (D.getKind()) { 192505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::FieldDesignator: 19261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(), 192705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getFieldLoc())); 192805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 192905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 193005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayDesignator: { 193105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Index = static_cast<Expr *>(D.getArrayIndex()); 193205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt IndexValue; 19339ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (!Index->isTypeDependent() && 19349ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor !Index->isValueDependent() && 19359ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, Index, IndexValue)) 193605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 193705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else { 193805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 19391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 194005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getRBracketLoc())); 194105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor InitExpressions.push_back(Index); 194205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 194305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 194405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 194505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 194605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayRangeDesignator: { 194705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart()); 194805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd()); 194905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt StartValue; 195005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt EndValue; 19519ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool StartDependent = StartIndex->isTypeDependent() || 19529ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor StartIndex->isValueDependent(); 19539ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool EndDependent = EndIndex->isTypeDependent() || 19549ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor EndIndex->isValueDependent(); 19559ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if ((!StartDependent && 19569ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, StartIndex, StartValue)) || 19579ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor (!EndDependent && 19589ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, EndIndex, EndValue))) 195905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 1960d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else { 1961d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor // Make sure we're comparing values with the same bit width. 19629ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (StartDependent || EndDependent) { 19639ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Nothing to compute. 19649ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (StartValue.getBitWidth() > EndValue.getBitWidth()) 19659f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad EndValue = EndValue.extend(StartValue.getBitWidth()); 1966d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else if (StartValue.getBitWidth() < EndValue.getBitWidth()) 19679f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad StartValue = StartValue.extend(EndValue.getBitWidth()); 1968d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor 1969c4bb7bfe8328f79004517dd268f6146c8066c205Douglas Gregor if (!StartDependent && !EndDependent && EndValue < StartValue) { 1970d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range) 19711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << StartValue.toString(10) << EndValue.toString(10) 1972d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor << StartIndex->getSourceRange() << EndIndex->getSourceRange(); 1973d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Invalid = true; 1974d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } else { 1975d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 19761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 1977d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getEllipsisLoc(), 1978d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getRBracketLoc())); 1979d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(StartIndex); 1980d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(EndIndex); 1981d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } 198205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 198305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 198405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 198505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 198605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 198705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 198805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Invalid || Init.isInvalid()) 198905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return ExprError(); 199005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 199105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Clear out the expressions within the designation. 199205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Desig.ClearExprs(*this); 199305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 199405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor DesignatedInitExpr *DIE 1995beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad = DesignatedInitExpr::Create(Context, 1996beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Designators.data(), Designators.size(), 1997beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad InitExpressions.data(), InitExpressions.size(), 1998e9146f2e9f1c4e281544e8c080934c72d41012caAnders Carlsson Loc, GNUSyntax, Init.takeAs<Expr>()); 1999dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 20002d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor if (getLangOptions().CPlusPlus) 2001a47317bbeef839ef86323e3feacd9962ca9c383aEli Friedman Diag(DIE->getLocStart(), diag::ext_designated_init_cxx) 2002a47317bbeef839ef86323e3feacd9962ca9c383aEli Friedman << DIE->getSourceRange(); 2003a47317bbeef839ef86323e3feacd9962ca9c383aEli Friedman else if (!getLangOptions().C99) 20042d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor Diag(DIE->getLocStart(), diag::ext_designated_init) 20052d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor << DIE->getSourceRange(); 2006dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 200705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return Owned(DIE); 200805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 2009c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 2010cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregorbool Sema::CheckInitList(const InitializedEntity &Entity, 2011cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *&InitList, QualType &DeclType) { 2012cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker CheckInitList(*this, Entity, InitList, DeclType); 2013c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor if (!CheckInitList.HadError()) 2014c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitList = CheckInitList.getFullyStructuredList(); 2015c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 2016c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor return CheckInitList.HadError(); 2017c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor} 201887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 2019cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 2020cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor// Initialization entity 2021cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 202239da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor 2023dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index, 2024cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor const InitializedEntity &Parent) 2025dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi : Parent(&Parent), Index(Index) 2026cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor{ 2027d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) { 2028d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_ArrayElement; 2029d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = AT->getElementType(); 2030d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } else { 2031d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_VectorElement; 2032d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = Parent.getType()->getAs<VectorType>()->getElementType(); 2033d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } 203420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 203520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2036dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity InitializedEntity::InitializeBase(ASTContext &Context, 2037711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson CXXBaseSpecifier *Base, 2038711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson bool IsInheritedVirtualBase) 203920093b4bf698f292c664676987541d5103b65b15Douglas Gregor{ 204020093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializedEntity Result; 204120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Kind = EK_Base; 2042711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base = reinterpret_cast<uintptr_t>(Base); 2043711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson if (IsInheritedVirtualBase) 2044711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base |= 0x01; 2045dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2046d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Result.Type = Base->getType(); 204720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 204820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 204920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 205099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas GregorDeclarationName InitializedEntity::getName() const { 205199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (getKind()) { 2052f85e193739c953358c865005855253af4f68a497John McCall case EK_Parameter: { 2053f85e193739c953358c865005855253af4f68a497John McCall ParmVarDecl *D = reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1); 2054f85e193739c953358c865005855253af4f68a497John McCall return (D ? D->getDeclName() : DeclarationName()); 2055f85e193739c953358c865005855253af4f68a497John McCall } 2056a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor 2057a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor case EK_Variable: 205899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Member: 205999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return VariableOrMember->getDeclName(); 206099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 206199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Result: 206299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Exception: 206318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case EK_New: 206499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Temporary: 206599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Base: 2066059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 2067d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2068d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 2069310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 207099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 207199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 2072dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 207399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Silence GCC warning 207499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 207599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 207699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 20777abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas GregorDeclaratorDecl *InitializedEntity::getDecl() const { 20787abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor switch (getKind()) { 20797abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Variable: 20807abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Member: 20817abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return VariableOrMember; 20827abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 2083f85e193739c953358c865005855253af4f68a497John McCall case EK_Parameter: 2084f85e193739c953358c865005855253af4f68a497John McCall return reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1); 2085f85e193739c953358c865005855253af4f68a497John McCall 20867abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Result: 20877abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Exception: 20887abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_New: 20897abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Temporary: 20907abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Base: 2091059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 2092d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2093d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 2094310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 20957abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 20967abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor } 2097dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 20987abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor // Silence GCC warning 20997abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 21007abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor} 21017abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 21023c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregorbool InitializedEntity::allowsNRVO() const { 21033c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor switch (getKind()) { 21043c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Result: 21053c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Exception: 21063c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return LocAndNRVO.NRVO; 2107dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 21083c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Variable: 21093c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Parameter: 21103c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Member: 21113c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_New: 21123c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Temporary: 21133c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Base: 2114059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 21153c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_ArrayElement: 21163c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_VectorElement: 2117310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 21183c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor break; 21193c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor } 21203c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 21213c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return false; 21223c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor} 21233c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 212420093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 212520093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Initialization sequence 212620093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 212720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 212820093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::Step::Destroy() { 212920093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Kind) { 213020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 213120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 2132906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 213320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: 213420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 213520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 2136523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 213720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: 213820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 2139906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 214020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 2141d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: 214251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: 214371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: 214418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 2145cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 2146569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 2147cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 2148f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 2149f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 2150f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 215120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 2152dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 215320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 215420093b4bf698f292c664676987541d5103b65b15Douglas Gregor delete ICS; 215520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 215620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 215720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2158b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isDirectReferenceBinding() const { 21593b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl return !Steps.empty() && Steps.back().Kind == SK_BindReference; 2160b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2161b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2162b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isAmbiguous() const { 2163d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (!Failed()) 2164b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2165dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2166b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor switch (getFailureKind()) { 2167b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForReference: 2168b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitList: 2169b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 2170b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_AddressOfOverloadFailed: // FIXME: Could do better 2171b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 2172b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 2173b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_RValueReferenceBindingToLValue: 2174b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitDropsQualifiers: 2175b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitFailed: 2176b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConversionFailed: 2177429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 2178b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForScalar: 2179b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceBindingToInitList: 2180b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_InitListBadDestinationType: 2181b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_DefaultInitOfConst: 218272a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 2183cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 2184cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 2185b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2186dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2187b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitOverloadFailed: 2188b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_UserConversionOverloadFailed: 2189b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConstructorOverloadFailed: 2190b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return FailedOverloadResult == OR_Ambiguous; 2191b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor } 2192dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2193b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2194b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2195b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2196d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregorbool InitializationSequence::isConstructorInitialization() const { 2197d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization; 2198d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor} 2199d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor 220020093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddAddressOverloadResolutionStep( 22016bb8017bb9e828d118e15e59d71c66bba323c364John McCall FunctionDecl *Function, 22026bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found) { 220320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 220420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ResolveAddressOfOverloadedFunction; 220520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Function->getType(); 22069aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 22076bb8017bb9e828d118e15e59d71c66bba323c364John McCall S.Function.FoundDecl = Found; 220820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 220920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 221020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2211dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType, 22125baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 221320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 22145baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 22155baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: S.Kind = SK_CastDerivedToBaseRValue; break; 22165baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break; 22175baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break; 2218906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl default: llvm_unreachable("No such category"); 2219906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 222020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = BaseType; 222120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 222220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 222320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2224dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddReferenceBindingStep(QualType T, 222520093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool BindingTemporary) { 222620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 222720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference; 222820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 222920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 223020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 223120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2232523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregorvoid InitializationSequence::AddExtraneousCopyToTemporary(QualType T) { 2233523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Step S; 2234523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Kind = SK_ExtraneousCopyToTemporary; 2235523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Type = T; 2236523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Steps.push_back(S); 2237523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor} 2238523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 223903981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedmanvoid InitializationSequence::AddUserConversionStep(FunctionDecl *Function, 22409aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl, 224103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman QualType T) { 224220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 224320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_UserConversion; 224403981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman S.Type = T; 22459aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 22469aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = FoundDecl; 224720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 224820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 224920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 225020093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddQualificationConversionStep(QualType Ty, 22515baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 225220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 225338a4ffe5244e6be46f1b1f8394342a77836be776John McCall S.Kind = SK_QualificationConversionRValue; // work around a gcc warning 22545baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 22555baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: 2256906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionRValue; 2257906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 22585baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: 2259906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionXValue; 2260906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 22615baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: 2262906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionLValue; 2263906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 2264906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 226520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Ty; 226620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 226720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 226820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 226920093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddConversionSequenceStep( 227020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const ImplicitConversionSequence &ICS, 227120093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T) { 227220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 227320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ConversionSequence; 227420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 227520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ICS = new ImplicitConversionSequence(ICS); 227620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 227720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 227820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2279d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorvoid InitializationSequence::AddListInitializationStep(QualType T) { 2280d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Step S; 2281d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Kind = SK_ListInitialization; 2282d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Type = T; 2283d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Steps.push_back(S); 2284d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor} 2285d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2286dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 228751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas GregorInitializationSequence::AddConstructorInitializationStep( 228851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor, 2289b13b737a2450167c82e148590e8019b839ce6b98John McCall AccessSpecifier Access, 229051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor QualType T) { 229151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Step S; 229251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Kind = SK_ConstructorInitialization; 229351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Type = T; 22949aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Constructor; 22959aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = DeclAccessPair::make(Constructor, Access); 229651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Steps.push_back(S); 229751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor} 229851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 229971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorvoid InitializationSequence::AddZeroInitializationStep(QualType T) { 230071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Step S; 230171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Kind = SK_ZeroInitialization; 230271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Type = T; 230371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Steps.push_back(S); 230471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 230571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 230618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorvoid InitializationSequence::AddCAssignmentStep(QualType T) { 230718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step S; 230818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Kind = SK_CAssignment; 230918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Type = T; 231018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Steps.push_back(S); 231118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 231218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 2313cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedmanvoid InitializationSequence::AddStringInitStep(QualType T) { 2314cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Step S; 2315cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Kind = SK_StringInit; 2316cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Type = T; 2317cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Steps.push_back(S); 2318cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman} 2319cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2320569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorvoid InitializationSequence::AddObjCObjectConversionStep(QualType T) { 2321569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Step S; 2322569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Kind = SK_ObjCObjectConversion; 2323569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Type = T; 2324569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Steps.push_back(S); 2325569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 2326569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 2327cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregorvoid InitializationSequence::AddArrayInitStep(QualType T) { 2328cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Step S; 2329cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Kind = SK_ArrayInit; 2330cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Type = T; 2331cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Steps.push_back(S); 2332cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor} 2333cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 2334f85e193739c953358c865005855253af4f68a497John McCallvoid InitializationSequence::AddPassByIndirectCopyRestoreStep(QualType type, 2335f85e193739c953358c865005855253af4f68a497John McCall bool shouldCopy) { 2336f85e193739c953358c865005855253af4f68a497John McCall Step s; 2337f85e193739c953358c865005855253af4f68a497John McCall s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore 2338f85e193739c953358c865005855253af4f68a497John McCall : SK_PassByIndirectRestore); 2339f85e193739c953358c865005855253af4f68a497John McCall s.Type = type; 2340f85e193739c953358c865005855253af4f68a497John McCall Steps.push_back(s); 2341f85e193739c953358c865005855253af4f68a497John McCall} 2342f85e193739c953358c865005855253af4f68a497John McCall 2343f85e193739c953358c865005855253af4f68a497John McCallvoid InitializationSequence::AddProduceObjCObjectStep(QualType T) { 2344f85e193739c953358c865005855253af4f68a497John McCall Step S; 2345f85e193739c953358c865005855253af4f68a497John McCall S.Kind = SK_ProduceObjCObject; 2346f85e193739c953358c865005855253af4f68a497John McCall S.Type = T; 2347f85e193739c953358c865005855253af4f68a497John McCall Steps.push_back(S); 2348f85e193739c953358c865005855253af4f68a497John McCall} 2349f85e193739c953358c865005855253af4f68a497John McCall 2350dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::SetOverloadFailure(FailureKind Failure, 235120093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Result) { 23527491c499e826682e128a400038361ebcbde30eecSebastian Redl setSequenceKind(FailedSequence); 235320093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->Failure = Failure; 235420093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->FailedOverloadResult = Result; 235520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 235620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 235720093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 235820093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Attempt initialization 235920093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 236020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2361f85e193739c953358c865005855253af4f68a497John McCallstatic void MaybeProduceObjCObject(Sema &S, 2362f85e193739c953358c865005855253af4f68a497John McCall InitializationSequence &Sequence, 2363f85e193739c953358c865005855253af4f68a497John McCall const InitializedEntity &Entity) { 2364f85e193739c953358c865005855253af4f68a497John McCall if (!S.getLangOptions().ObjCAutoRefCount) return; 2365f85e193739c953358c865005855253af4f68a497John McCall 2366f85e193739c953358c865005855253af4f68a497John McCall /// When initializing a parameter, produce the value if it's marked 2367f85e193739c953358c865005855253af4f68a497John McCall /// __attribute__((ns_consumed)). 2368f85e193739c953358c865005855253af4f68a497John McCall if (Entity.getKind() == InitializedEntity::EK_Parameter) { 2369f85e193739c953358c865005855253af4f68a497John McCall if (!Entity.isParameterConsumed()) 2370f85e193739c953358c865005855253af4f68a497John McCall return; 2371f85e193739c953358c865005855253af4f68a497John McCall 2372f85e193739c953358c865005855253af4f68a497John McCall assert(Entity.getType()->isObjCRetainableType() && 2373f85e193739c953358c865005855253af4f68a497John McCall "consuming an object of unretainable type?"); 2374f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddProduceObjCObjectStep(Entity.getType()); 2375f85e193739c953358c865005855253af4f68a497John McCall 2376f85e193739c953358c865005855253af4f68a497John McCall /// When initializing a return value, if the return type is a 2377f85e193739c953358c865005855253af4f68a497John McCall /// retainable type, then returns need to immediately retain the 2378f85e193739c953358c865005855253af4f68a497John McCall /// object. If an autorelease is required, it will be done at the 2379f85e193739c953358c865005855253af4f68a497John McCall /// last instant. 2380f85e193739c953358c865005855253af4f68a497John McCall } else if (Entity.getKind() == InitializedEntity::EK_Result) { 2381f85e193739c953358c865005855253af4f68a497John McCall if (!Entity.getType()->isObjCRetainableType()) 2382f85e193739c953358c865005855253af4f68a497John McCall return; 2383f85e193739c953358c865005855253af4f68a497John McCall 2384f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddProduceObjCObjectStep(Entity.getType()); 2385f85e193739c953358c865005855253af4f68a497John McCall } 2386f85e193739c953358c865005855253af4f68a497John McCall} 2387f85e193739c953358c865005855253af4f68a497John McCall 238812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola/// \brief Attempt list initialization (C++0x [dcl.init.list]) 238912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindolastatic void TryListInitialization(Sema &S, 239012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola const InitializedEntity &Entity, 239112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola const InitializationKind &Kind, 239212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola InitListExpr *InitList, 239312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola InitializationSequence &Sequence) { 239412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // FIXME: We only perform rudimentary checking of list 239512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // initializations at this point, then assume that any list 239612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // initialization of an array, aggregate, or scalar will be 239712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // well-formed. When we actually "perform" list initialization, we'll 239812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // do all of the necessary checking. C++0x initializer lists will 239912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // force us to perform more checking here. 240012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 240112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola QualType DestType = Entity.getType(); 240212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 240312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // C++ [dcl.init]p13: 240412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // If T is a scalar type, then a declaration of the form 240512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // 240612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // T x = { a }; 240712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // 240812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // is equivalent to 240912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // 241012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // T x = a; 241112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola if (DestType->isScalarType()) { 241212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola if (InitList->getNumInits() > 1 && S.getLangOptions().CPlusPlus) { 241312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar); 241412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola return; 241512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola } 241612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 241712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // Assume scalar initialization from a single value works. 241812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola } else if (DestType->isAggregateType()) { 241912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // Assume aggregate initialization works. 242012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola } else if (DestType->isVectorType()) { 242112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // Assume vector initialization works. 242212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola } else if (DestType->isReferenceType()) { 242312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // FIXME: C++0x defines behavior for this. 242412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList); 242512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola return; 242612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola } else if (DestType->isRecordType()) { 242712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // FIXME: C++0x defines behavior for this 242812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType); 242912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola } 243012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 243112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola // Add a general "list initialization" step. 243212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Sequence.AddListInitializationStep(DestType); 243312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola} 243420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 243520093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Try a reference initialization that involves calling a conversion 243620093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// function. 243720093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic OverloadingResult TryRefInitWithConversionFunction(Sema &S, 243820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 243920093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 244020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 244120093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowRValues, 244220093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2443d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 244420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 244520093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T1 = cv1T1.getUnqualifiedType(); 244620093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 244720093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T2 = cv2T2.getUnqualifiedType(); 244820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 244920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase; 2450569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion; 2451f85e193739c953358c865005855253af4f68a497John McCall bool ObjCLifetimeConversion; 2452dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi assert(!S.CompareReferenceRelationship(Initializer->getLocStart(), 2453569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T1, T2, DerivedToBase, 2454f85e193739c953358c865005855253af4f68a497John McCall ObjCConversion, 2455f85e193739c953358c865005855253af4f68a497John McCall ObjCLifetimeConversion) && 245620093b4bf698f292c664676987541d5103b65b15Douglas Gregor "Must have incompatible references when binding via conversion"); 245760cfcecaf48e4310339dcfbdb0e3f0e6d2853855Chandler Carruth (void)DerivedToBase; 2458569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor (void)ObjCConversion; 2459f85e193739c953358c865005855253af4f68a497John McCall (void)ObjCLifetimeConversion; 2460f85e193739c953358c865005855253af4f68a497John McCall 246120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the candidate set directly in the initialization sequence 246220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // structure, so that it will persist if we fail. 246320093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 246420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CandidateSet.clear(); 246520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 246620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 246720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 246820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 2469dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 247020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const RecordType *T1RecordType = 0; 24716b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) && 24726b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T1, 0)) { 247320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 247420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to see if there is a suitable conversion. 247520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl()); 2476572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall 247720093b4bf698f292c664676987541d5103b65b15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 2478e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(T1RecordDecl); 247920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Con != ConEnd; ++Con) { 24809aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 24819aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 24829aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 248320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Find the constructor (which may be a template). 248420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConstructorDecl *Constructor = 0; 24859aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 248620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 248720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 248820093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 248920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 24909aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 2491dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 249220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Constructor->isInvalidDecl() && 249320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 249420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 24959aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 249686820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 2497b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis &Initializer, 1, CandidateSet, 2498b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 249920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 25009aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 2501b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis &Initializer, 1, CandidateSet, 2502b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 250320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2504dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 250520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2506572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl()) 2507572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 2508dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 25096b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor const RecordType *T2RecordType = 0; 25106b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if ((T2RecordType = T2->getAs<RecordType>()) && 25116b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T2, 0)) { 251220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting from is a class type, enumerate its conversion 251320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions. 251420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl()); 251520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2516eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 251720093b4bf698f292c664676987541d5103b65b15Douglas Gregor = T2RecordDecl->getVisibleConversionFunctions(); 2518eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 2519eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall E = Conversions->end(); I != E; ++I) { 252020093b4bf698f292c664676987541d5103b65b15Douglas Gregor NamedDecl *D = *I; 252120093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 252220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<UsingShadowDecl>(D)) 252320093b4bf698f292c664676987541d5103b65b15Douglas Gregor D = cast<UsingShadowDecl>(D)->getTargetDecl(); 2524dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 252520093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 252620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConversionDecl *Conv; 252720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 252820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 252920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 25304680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Conv = cast<CXXConversionDecl>(D); 2531dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 253220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the conversion function doesn't return a reference type, 253320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // it can't be considered for this conversion unless we're allowed to 253420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // consider rvalues. 2535dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Do we need to make sure that we only consider conversion 2536dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // candidates with reference-compatible results? That might be needed to 253720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // break recursion. 253820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if ((AllowExplicit || !Conv->isExplicit()) && 253920093b4bf698f292c664676987541d5103b65b15Douglas Gregor (AllowRValues || Conv->getConversionType()->isLValueReferenceType())){ 254020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 25419aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 254286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, 2543564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor DestType, CandidateSet); 254420093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 25459aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 2546564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor Initializer, DestType, CandidateSet); 254720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 254820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 254920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2550572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl()) 2551572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 2552dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 255320093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 255420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2555dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 255620093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 2557dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (OverloadingResult Result 25588fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) 255920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 256003981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 256120093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function = Best->Function; 256203981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 256325ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth // This is the overload that will actually be used for the initialization, so 256425ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth // mark it as used. 256525ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth S.MarkDeclarationReferenced(DeclLoc, Function); 256625ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth 256703981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Compute the returned type of the conversion. 256820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<CXXConversionDecl>(Function)) 256920093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = Function->getResultType(); 257020093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 257120093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv1T1; 257203981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 257303981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Add the user-defined conversion step. 25749aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, 25756398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor T2.getNonLValueExprType(S.Context)); 257603981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 2577dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Determine whether we need to perform derived-to-base or 257803981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // cv-qualification adjustments. 25795baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = VK_RValue; 2580906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl if (T2->isLValueReferenceType()) 25815baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = VK_LValue; 2582906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl else if (const RValueReferenceType *RRef = T2->getAs<RValueReferenceType>()) 25835baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue; 2584906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 258520093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool NewDerivedToBase = false; 2586569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool NewObjCConversion = false; 2587f85e193739c953358c865005855253af4f68a497John McCall bool NewObjCLifetimeConversion = false; 258820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult NewRefRelationship 2589dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi = S.CompareReferenceRelationship(DeclLoc, T1, 25906398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor T2.getNonLValueExprType(S.Context), 2591f85e193739c953358c865005855253af4f68a497John McCall NewDerivedToBase, NewObjCConversion, 2592f85e193739c953358c865005855253af4f68a497John McCall NewObjCLifetimeConversion); 2593a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor if (NewRefRelationship == Sema::Ref_Incompatible) { 2594a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // If the type we've converted to is not reference-related to the 2595a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // type we're looking for, then there is another conversion step 2596a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // we need to perform to produce a temporary of the right type 2597a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // that we'll be binding to. 2598a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ImplicitConversionSequence ICS; 2599a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.setStandard(); 2600a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.Standard = Best->FinalConversion; 2601a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor T2 = ICS.Standard.getToType(2); 2602a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor Sequence.AddConversionSequenceStep(ICS, T2); 2603a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor } else if (NewDerivedToBase) 260420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 260520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getQualifiedType(T1, 2606dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi T2.getNonReferenceType().getQualifiers()), 26075baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK); 2608569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (NewObjCConversion) 2609569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 2610569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, 2611569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T2.getNonReferenceType().getQualifiers())); 2612569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 261320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (cv1T1.getQualifiers() != T2.getNonReferenceType().getQualifiers()) 26145baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK); 2615dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 261620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, !T2->isReferenceType()); 261720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return OR_Success; 261820093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 2619dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2620dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Attempt reference initialization (C++0x [dcl.init.ref]) 2621dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryReferenceInitialization(Sema &S, 262220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 262320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 262420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 262520093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2626d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 262720093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 26285535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T1Quals; 26295535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 263020093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 26315535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T2Quals; 26325535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 263320093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 26344680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 263520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the initializer is the address of an overloaded function, try 263620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to resolve the overloaded function. If all goes well, T2 is the 263720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type of the resulting function. 263820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) { 26396bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found; 2640dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (FunctionDecl *Fn = S.ResolveAddressOfOverloadedFunction(Initializer, 26413afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor T1, 26423afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor false, 26433afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Found)) { 26443afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.AddAddressOverloadResolutionStep(Fn, Found); 26453afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor cv2T2 = Fn->getType(); 26463afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor T2 = cv2T2.getUnqualifiedType(); 26473afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor } else if (!T1->isRecordType()) { 264820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 264920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 265020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 265120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 26524680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 265320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Compute some basic properties of the types and the initializer. 265420093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isLValueRef = DestType->isLValueReferenceType(); 265520093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isRValueRef = !isLValueRef; 265620093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase = false; 2657569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion = false; 2658f85e193739c953358c865005855253af4f68a497John McCall bool ObjCLifetimeConversion = false; 26594680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Expr::Classification InitCategory = Initializer->Classify(S.Context); 266020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult RefRelationship 2661569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase, 2662f85e193739c953358c865005855253af4f68a497John McCall ObjCConversion, ObjCLifetimeConversion); 26634680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 266420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p5: 2665dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // A reference to type "cv1 T1" is initialized by an expression of type 266620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // "cv2 T2" as follows: 266720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 2668dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the reference is an lvalue reference and the initializer 266920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // expression 26704680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // Note the analogous bullet points for rvlaue refs to functions. Because 26714680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // there are no function rvalues in C++, rvalue refs to functions are treated 26724680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // like lvalue refs. 267320093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult ConvOvlResult = OR_Success; 26744680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl bool T1Function = T1->isFunctionType(); 26754680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (isLValueRef || T1Function) { 2676dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (InitCategory.isLValue() && 267714d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 2678dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 267914d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related))) { 2680dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - is an lvalue (but is not a bit-field), and "cv1 T1" is 268120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2," or 268220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 2683dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Per C++ [over.best.ics]p2, we don't diagnose whether the lvalue is a 268420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // bit-field when we're determining whether the reference initialization 2685de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // can occur. However, we do pay attention to whether it is a bit-field 2686de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // to decide whether we're actually binding to a temporary created from 2687de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // the bit-field. 268820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 268920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 2690dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Context.getQualifiedType(T1, T2Quals), 26915baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue); 2692569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (ObjCConversion) 2693569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 2694569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 2695569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 26965535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 26975baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK_LValue); 2698de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor bool BindingTemporary = T1Quals.hasConst() && !T1Quals.hasVolatile() && 2699093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson (Initializer->getBitField() || Initializer->refersToVectorElement()); 2700de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, BindingTemporary); 270120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 270220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2703dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2704dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 2705dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 2706dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible 2707dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // with "cv3 T3" (this conversion is selected by enumerating the 270820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // applicable conversion functions (13.3.1.6) and choosing the best 270920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // one through overload resolution (13.3)), 27104680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // If we have an rvalue ref to function type here, the rhs must be 27114680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // an rvalue. 27124680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() && 27134680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl (isLValueRef || InitCategory.isRValue())) { 2714dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, Kind, 271520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer, 27164680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl /*AllowRValues=*/isRValueRef, 271720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 271820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult == OR_Success) 271920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 27201d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ConvOvlResult != OR_No_Viable_Function) { 27211d31833450e6d2947a33cb0840d87661d92eec07John McCall Sequence.SetOverloadFailure( 27221d31833450e6d2947a33cb0840d87661d92eec07John McCall InitializationSequence::FK_ReferenceInitOverloadFailed, 27231d31833450e6d2947a33cb0840d87661d92eec07John McCall ConvOvlResult); 27241d31833450e6d2947a33cb0840d87661d92eec07John McCall } 272520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 272620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 27274680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 2728dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, the reference shall be an lvalue reference to a 272920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // non-volatile const type (i.e., cv1 shall be const), or the reference 273069d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor // shall be an rvalue reference. 2731b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile())) { 27323afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 27333afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 27343afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 273520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 273620093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 273720093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 2738b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor else 27394680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Sequence.SetFailed(InitCategory.isLValue() 274020093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? (RefRelationship == Sema::Ref_Related 274120093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? InitializationSequence::FK_ReferenceInitDropsQualifiers 274220093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToUnrelated) 274320093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 27444680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 274520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 274620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 27474680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 2748c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - If the initializer expression 2749c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - is an xvalue, class prvalue, array prvalue, or function lvalue and 2750c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // "cv1 T1" is reference-compatible with "cv2 T2" 2751c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // Note: functions are handled below. 2752c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (!T1Function && 275314d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 2754dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 275514d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related)) && 2756c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isXValue() || 2757c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isRecordType()) || 2758c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isArrayType()))) { 2759c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ExprValueKind ValueKind = InitCategory.isXValue()? VK_XValue : VK_RValue; 2760c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (InitCategory.isPRValue() && T2->isRecordType()) { 2761523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the 2762523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // compiler the freedom to perform a copy here or bind to the 2763523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object, while C++0x requires that we bind directly to the 2764523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object. Hence, we always bind to the object without making an 2765523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // extra copy. However, in C++03 requires that we check for the 2766523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // presence of a suitable copy constructor: 2767523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // 2768523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The constructor that would be used to make the copy shall 2769523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // be callable whether or not the copy is actually done. 2770f57258bb96799957085080027a9c9eefe36c3417Francois Pichet if (!S.getLangOptions().CPlusPlus0x && !S.getLangOptions().Microsoft) 2771523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Sequence.AddExtraneousCopyToTemporary(cv2T2); 277220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2773dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2774c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (DerivedToBase) 2775c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddDerivedToBaseCastStep(S.Context.getQualifiedType(T1, T2Quals), 2776c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ValueKind); 2777c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor else if (ObjCConversion) 2778c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddObjCObjectConversionStep( 2779c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 2780dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2781c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T1Quals != T2Quals) 2782c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddQualificationConversionStep(cv1T1, ValueKind); 2783dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Sequence.AddReferenceBindingStep(cv1T1, 2784c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor /*bindingTemporary=*/(InitCategory.isPRValue() && !T2->isArrayType())); 2785dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi return; 2786c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor } 2787dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2788dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 2789dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 2790c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // xvalue, class prvalue, or function lvalue of type "cv3 T3", 2791c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // where "cv1 T1" is reference-compatible with "cv3 T3", 2792c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T2->isRecordType()) { 279320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible) { 279420093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, 279520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind, Initializer, 279620093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowRValues=*/true, 279720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 279820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult) 279920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 280020093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 280120093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 2802dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 280320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 280420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 2805dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 280620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 280720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 280820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 28090099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi 28100099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi // - Otherwise, a temporary of type "cv1 T1" is created and initialized 281120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // from the initializer expression using the rules for a non-reference 2812dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy initialization (8.5). The reference is then bound to the 281320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // temporary. [...] 2814369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 281520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 281620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 281720093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct); 2818369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 2819369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 2820369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 2821f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS 2822f85e193739c953358c865005855253af4f68a497John McCall = S.TryImplicitConversion(Initializer, TempEntity.getType(), 2823369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*SuppressUserConversions*/ false, 2824369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall AllowExplicit, 282514d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*FIXME:InOverloadResolution=*/false, 2826f85e193739c953358c865005855253af4f68a497John McCall /*CStyle=*/Kind.isCStyleOrFunctionalCast(), 2827f85e193739c953358c865005855253af4f68a497John McCall /*AllowObjCWritebackConversion=*/false); 2828f85e193739c953358c865005855253af4f68a497John McCall 2829f85e193739c953358c865005855253af4f68a497John McCall if (ICS.isBad()) { 283020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Use the conversion function set stored in ICS to turn 283120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // this into an overloading ambiguity diagnostic. However, we need 283220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to keep that set as an OverloadCandidateSet rather than as some 283320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // other kind of set. 283418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 283518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetOverloadFailure( 283618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 283718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor ConvOvlResult); 28383afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 28393afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 284018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 284118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed); 284220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 2843f85e193739c953358c865005855253af4f68a497John McCall } else { 2844f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddConversionSequenceStep(ICS, TempEntity.getType()); 284520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 284620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 284720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // [...] If T1 is reference-related to T2, cv1 must be the 284820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // same cv-qualification as, or greater cv-qualification 284920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // than, cv2; otherwise, the program is ill-formed. 28505535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T1CVRQuals = T1Quals.getCVRQualifiers(); 28515535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T2CVRQuals = T2Quals.getCVRQualifiers(); 2852dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship == Sema::Ref_Related && 28535535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth (T1CVRQuals | T2CVRQuals) != T1CVRQuals) { 285420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 285520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 285620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 285720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2858dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // [...] If T1 is reference-related to T2 and the reference is an rvalue 2859b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor // reference, the initializer expression shall not be an lvalue. 2860dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship >= Sema::Ref_Related && !isLValueRef && 2861b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitCategory.isLValue()) { 2862b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor Sequence.SetFailed( 2863b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitializationSequence::FK_RValueReferenceBindingToLValue); 2864b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor return; 2865b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor } 2866dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 286720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 286820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 286920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 287020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 287120093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt character array initialization from a string literal 2872dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// (C++ [dcl.init.string], C99 6.7.8). 2873dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryStringLiteralInitialization(Sema &S, 287420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 287520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 287620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 287720093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2878d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddStringInitStep(Entity.getType()); 287920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 288020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 288120093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt initialization by constructor (C++ [dcl.init]), which 288220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// enumerates the constructors of the initialized entity and performs overload 288320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// resolution to select the best. 2884dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryConstructorInitialization(Sema &S, 288520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 288620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 288720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs, 288871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor QualType DestType, 288920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 289051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build the candidate set directly in the initialization sequence 289151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // structure, so that it will persist if we fail. 289251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 289351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CandidateSet.clear(); 2894dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 289551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 289651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // explicit conversion operators. 289751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct || 289851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getKind() == InitializationKind::IK_Value || 28992f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Kind.getKind() == InitializationKind::IK_Default); 2900087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor 2901087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // The type we're constructing needs to be complete. 2902087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 290372a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_Incomplete); 2904087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor return; 2905087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 2906dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 290751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 290851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // to see if one is suitable. 290951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor const RecordType *DestRecordType = DestType->getAs<RecordType>(); 2910dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi assert(DestRecordType && "Constructor initialization requires record type"); 291151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXRecordDecl *DestRecordDecl 291251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 2913dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 291451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 2915e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl); 291651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Con != ConEnd; ++Con) { 29179aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 29189aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 2919d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor bool SuppressUserConversions = false; 2920dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 292151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Find the constructor (which may be a template). 292251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor = 0; 29239aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 292451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 292551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 292651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 2927d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor else { 29289aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 2929d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor 2930dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // If we're performing copy initialization using a copy constructor, we 2931d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor // suppress user-defined conversions on the arguments. 2932d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor // FIXME: Move constructors? 2933d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Copy && 2934d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Constructor->isCopyConstructor()) 2935d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions = true; 2936d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor } 2937dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 293851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (!Constructor->isInvalidDecl() && 293999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (AllowExplicit || !Constructor->isExplicit())) { 294051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 29419aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 294286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 2943d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Args, NumArgs, CandidateSet, 2944d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions); 294551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor else 29469aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 2947d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Args, NumArgs, CandidateSet, 2948d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions); 294951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 2950dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 2951dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 295251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceLocation DeclLoc = Kind.getLocation(); 2953dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2954dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 295551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 2956dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (OverloadingResult Result 2957120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall = CandidateSet.BestViableFunction(S, DeclLoc, Best)) { 295851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Sequence.SetOverloadFailure( 2959dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializationSequence::FK_ConstructorOverloadFailed, 296051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Result); 296151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return; 296251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 29639db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 29649db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // C++0x [dcl.init]p6: 29659db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // If a program calls for the default initialization of an object 29669db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // of a const-qualified type T, T shall be a class type with a 29679db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // user-provided default constructor. 29689db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 29699db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getType().isConstQualified() && 29709db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor cast<CXXConstructorDecl>(Best->Function)->isImplicit()) { 29719db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 29729db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor return; 29739db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 29749db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 297551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Add the constructor initialization step. Any cv-qualification conversion is 297651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // subsumed by the initialization. 29772f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Sequence.AddConstructorInitializationStep( 2978dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi cast<CXXConstructorDecl>(Best->Function), 29799aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Best->FoundDecl.getAccess(), 298018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DestType); 298120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 298220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 298371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor/// \brief Attempt value initialization (C++ [dcl.init]p7). 2984dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryValueInitialization(Sema &S, 298571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializedEntity &Entity, 298671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializationKind &Kind, 298771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor InitializationSequence &Sequence) { 298871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // C++ [dcl.init]p5: 298971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 299071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // To value-initialize an object of type T means: 2991d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType T = Entity.getType(); 2992dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 299371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is an array type, then each element is value-initialized; 299471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor while (const ArrayType *AT = S.Context.getAsArrayType(T)) 299571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor T = AT->getElementType(); 2996dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 299771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (const RecordType *RT = T->getAs<RecordType>()) { 299871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 299971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is a class type (clause 9) with a user-declared 300071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // constructor (12.1), then the default constructor for T is 300171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // called (and the initialization is ill-formed if T has no 300271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // accessible default constructor); 300371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 300471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // FIXME: we really want to refer to a single subobject of the array, 300571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // but Entity doesn't have a way to capture that (yet). 300671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (ClassDecl->hasUserDeclaredConstructor()) 300771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 3008dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 300916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // -- if T is a (possibly cv-qualified) non-union class type 301016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // without a user-provided constructor, then the object is 30110099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi // zero-initialized and, if T's implicitly-declared default 301216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // constructor is non-trivial, that constructor is called. 3013465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if ((ClassDecl->getTagKind() == TTK_Class || 3014ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor ClassDecl->getTagKind() == TTK_Struct)) { 3015d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 3016dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 301716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 301871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 301971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 302071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 3021d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 302271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 302371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 302499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor/// \brief Attempt default initialization (C++ [dcl.init]p6). 302599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregorstatic void TryDefaultInitialization(Sema &S, 302699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializedEntity &Entity, 302799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializationKind &Kind, 302899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitializationSequence &Sequence) { 302999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(Kind.getKind() == InitializationKind::IK_Default); 3030dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 303199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // C++ [dcl.init]p6: 303299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // To default-initialize an object of type T means: 303399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is an array type, each element is default-initialized; 3034f85e193739c953358c865005855253af4f68a497John McCall QualType DestType = S.Context.getBaseElementType(Entity.getType()); 3035f85e193739c953358c865005855253af4f68a497John McCall 303699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is a (possibly cv-qualified) class type (Clause 9), the default 303799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // constructor for T is called (and the initialization is ill-formed if 303899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // T has no accessible default constructor); 303960c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (DestType->isRecordType() && S.getLangOptions().CPlusPlus) { 30404e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth TryConstructorInitialization(S, Entity, Kind, 0, 0, DestType, Sequence); 30414e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth return; 304299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 3043dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 304499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - otherwise, no initialization is performed. 3045dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 304699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // If a program calls for the default initialization of an object of 3047dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // a const-qualified type T, T shall be a class type with a user-provided 304899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // default constructor. 3049f85e193739c953358c865005855253af4f68a497John McCall if (DestType.isConstQualified() && S.getLangOptions().CPlusPlus) { 305099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 3051f85e193739c953358c865005855253af4f68a497John McCall return; 3052f85e193739c953358c865005855253af4f68a497John McCall } 3053f85e193739c953358c865005855253af4f68a497John McCall 3054f85e193739c953358c865005855253af4f68a497John McCall // If the destination type has a lifetime property, zero-initialize it. 3055f85e193739c953358c865005855253af4f68a497John McCall if (DestType.getQualifiers().hasObjCLifetime()) { 3056f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddZeroInitializationStep(Entity.getType()); 3057f85e193739c953358c865005855253af4f68a497John McCall return; 3058f85e193739c953358c865005855253af4f68a497John McCall } 305999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 306099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 306120093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]), 306220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// which enumerates all conversion functions and performs overload resolution 306320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// to select the best. 3064dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryUserDefinedConversion(Sema &S, 306520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 306620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 306720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 306820093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3069d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 30704a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert(!DestType->isReferenceType() && "References are handled elsewhere"); 30714a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType SourceType = Initializer->getType(); 30724a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert((DestType->isRecordType() || SourceType->isRecordType()) && 30734a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor "Must have a class type to perform a user-defined conversion"); 3074dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 30754a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Build the candidate set directly in the initialization sequence 30764a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // structure, so that it will persist if we fail. 30774a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 30784a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CandidateSet.clear(); 3079dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 30804a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Determine whether we are allowed to call explicit constructors or 30814a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // explicit conversion operators. 30824a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 3083dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 30844a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) { 30854a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting to is a class type. Enumerate its constructors 30864a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // to see if there is a suitable conversion. 30874a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXRecordDecl *DestRecordDecl 30884a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 3089dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3090087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Try to complete the type we're converting to. 3091dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (!S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 3092087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 3093e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl); 3094087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Con != ConEnd; ++Con) { 3095087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor NamedDecl *D = *Con; 3096087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 3097dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3098087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Find the constructor (which may be a template). 3099087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor CXXConstructorDecl *Constructor = 0; 3100087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor FunctionTemplateDecl *ConstructorTmpl 3101087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor = dyn_cast<FunctionTemplateDecl>(D); 31024a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 3103087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>( 3104087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 31054712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor else 3106087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>(D); 3107dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3108087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (!Constructor->isInvalidDecl() && 3109087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 3110087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (ConstructorTmpl) 3111087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 3112087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor /*ExplicitArgs*/ 0, 3113087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor &Initializer, 1, CandidateSet, 31144712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 3115087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor else 3116087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddOverloadCandidate(Constructor, FoundDecl, 3117087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor &Initializer, 1, CandidateSet, 31184712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 3119087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 3120dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 3121087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 31224a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 3123cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3124cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman SourceLocation DeclLoc = Initializer->getLocStart(); 3125cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 31264a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) { 31274a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting from is a class type, enumerate its conversion 31284a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // functions. 3129cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 313033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // We can only enumerate the conversion functions for a complete type; if 313133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // the type isn't complete, simply skip this step. 313233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (!S.RequireCompleteType(DeclLoc, SourceType, 0)) { 313333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *SourceRecordDecl 313433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = cast<CXXRecordDecl>(SourceRecordType->getDecl()); 3135dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3136eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 313733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = SourceRecordDecl->getVisibleConversionFunctions(); 3138eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 3139dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi E = Conversions->end(); 314033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman I != E; ++I) { 314133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman NamedDecl *D = *I; 314233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 314333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (isa<UsingShadowDecl>(D)) 314433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman D = cast<UsingShadowDecl>(D)->getTargetDecl(); 3145dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 314633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 314733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXConversionDecl *Conv; 31484a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConvTemplate) 314933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 31504a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 315132daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall Conv = cast<CXXConversionDecl>(D); 3152dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 315333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (AllowExplicit || !Conv->isExplicit()) { 315433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (ConvTemplate) 31559aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 315686820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, DestType, 315733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CandidateSet); 315833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman else 31599aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 316086820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Initializer, DestType, CandidateSet); 316133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman } 31624a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 31634a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 31644a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 3165dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3166dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 31674a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet::iterator Best; 31681d31833450e6d2947a33cb0840d87661d92eec07John McCall if (OverloadingResult Result 31698fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) { 31704a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.SetOverloadFailure( 3171dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializationSequence::FK_UserConversionOverloadFailed, 31724a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Result); 31734a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 31744a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 31751d31833450e6d2947a33cb0840d87661d92eec07John McCall 31764a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionDecl *Function = Best->Function; 317725ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth S.MarkDeclarationReferenced(DeclLoc, Function); 3178dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 31794a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (isa<CXXConstructorDecl>(Function)) { 31804a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step. Any cv-qualification conversion is 31814a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // subsumed by the initialization. 31829aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType); 31834a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 31844a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 31854a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 31864a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step that calls the conversion function. 31875291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor QualType ConvType = Function->getCallResultType(); 31883fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor if (ConvType->getAs<RecordType>()) { 31893fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If we're converting to a class type, there may be an copy if 31903fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // the resulting temporary object (possible to create an object of 31913fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // a base class type). That copy is not a separate conversion, so 31923fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // we just make a note of the actual destination type (possibly a 31933fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // base class of the type returned by the conversion function) and 31943fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // let the user-defined conversion step handle the conversion. 31953fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType); 31963fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor return; 31973fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor } 31984a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 31993fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType); 3200dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 32013fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If the conversion following the call to the conversion function 32023fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // is interesting, add it as a separate step. 32034a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (Best->FinalConversion.First || Best->FinalConversion.Second || 32044a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Best->FinalConversion.Third) { 32054a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ImplicitConversionSequence ICS; 32061d31833450e6d2947a33cb0840d87661d92eec07John McCall ICS.setStandard(); 32074a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ICS.Standard = Best->FinalConversion; 32084a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.AddConversionSequenceStep(ICS, DestType); 32094a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 321020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 321120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3212f85e193739c953358c865005855253af4f68a497John McCall/// The non-zero enum values here are indexes into diagnostic alternatives. 3213f85e193739c953358c865005855253af4f68a497John McCallenum InvalidICRKind { IIK_okay, IIK_nonlocal, IIK_nonscalar }; 3214f85e193739c953358c865005855253af4f68a497John McCall 3215f85e193739c953358c865005855253af4f68a497John McCall/// Determines whether this expression is an acceptable ICR source. 3216c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCallstatic InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e, 3217c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall bool isAddressOf) { 3218f85e193739c953358c865005855253af4f68a497John McCall // Skip parens. 3219f85e193739c953358c865005855253af4f68a497John McCall e = e->IgnoreParens(); 3220f85e193739c953358c865005855253af4f68a497John McCall 3221f85e193739c953358c865005855253af4f68a497John McCall // Skip address-of nodes. 3222f85e193739c953358c865005855253af4f68a497John McCall if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) { 3223f85e193739c953358c865005855253af4f68a497John McCall if (op->getOpcode() == UO_AddrOf) 3224c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true); 3225f85e193739c953358c865005855253af4f68a497John McCall 3226f85e193739c953358c865005855253af4f68a497John McCall // Skip certain casts. 3227c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) { 3228c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall switch (ce->getCastKind()) { 3229f85e193739c953358c865005855253af4f68a497John McCall case CK_Dependent: 3230f85e193739c953358c865005855253af4f68a497John McCall case CK_BitCast: 3231f85e193739c953358c865005855253af4f68a497John McCall case CK_LValueBitCast: 3232f85e193739c953358c865005855253af4f68a497John McCall case CK_NoOp: 3233c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf); 3234f85e193739c953358c865005855253af4f68a497John McCall 3235f85e193739c953358c865005855253af4f68a497John McCall case CK_ArrayToPointerDecay: 3236f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonscalar; 3237f85e193739c953358c865005855253af4f68a497John McCall 3238f85e193739c953358c865005855253af4f68a497John McCall case CK_NullToPointer: 3239f85e193739c953358c865005855253af4f68a497John McCall return IIK_okay; 3240f85e193739c953358c865005855253af4f68a497John McCall 3241f85e193739c953358c865005855253af4f68a497John McCall default: 3242f85e193739c953358c865005855253af4f68a497John McCall break; 3243f85e193739c953358c865005855253af4f68a497John McCall } 3244f85e193739c953358c865005855253af4f68a497John McCall 3245f85e193739c953358c865005855253af4f68a497John McCall // If we have a declaration reference, it had better be a local variable. 3246c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else if (isa<DeclRefExpr>(e) || isa<BlockDeclRefExpr>(e)) { 3247c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (!isAddressOf) return IIK_nonlocal; 3248c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall 3249c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall VarDecl *var; 3250c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (isa<DeclRefExpr>(e)) { 3251c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl()); 3252c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (!var) return IIK_nonlocal; 3253c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else { 3254c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall var = cast<BlockDeclRefExpr>(e)->getDecl(); 3255c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } 3256c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall 3257c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal); 3258f85e193739c953358c865005855253af4f68a497John McCall 3259f85e193739c953358c865005855253af4f68a497John McCall // If we have a conditional operator, check both sides. 3260f85e193739c953358c865005855253af4f68a497John McCall } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) { 3261c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf)) 3262f85e193739c953358c865005855253af4f68a497John McCall return iik; 3263f85e193739c953358c865005855253af4f68a497John McCall 3264c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return isInvalidICRSource(C, cond->getRHS(), isAddressOf); 3265f85e193739c953358c865005855253af4f68a497John McCall 3266f85e193739c953358c865005855253af4f68a497John McCall // These are never scalar. 3267f85e193739c953358c865005855253af4f68a497John McCall } else if (isa<ArraySubscriptExpr>(e)) { 3268f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonscalar; 3269f85e193739c953358c865005855253af4f68a497John McCall 3270f85e193739c953358c865005855253af4f68a497John McCall // Otherwise, it needs to be a null pointer constant. 3271f85e193739c953358c865005855253af4f68a497John McCall } else { 3272f85e193739c953358c865005855253af4f68a497John McCall return (e->isNullPointerConstant(C, Expr::NPC_ValueDependentIsNull) 3273f85e193739c953358c865005855253af4f68a497John McCall ? IIK_okay : IIK_nonlocal); 3274f85e193739c953358c865005855253af4f68a497John McCall } 3275f85e193739c953358c865005855253af4f68a497John McCall 3276f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonlocal; 3277f85e193739c953358c865005855253af4f68a497John McCall} 3278f85e193739c953358c865005855253af4f68a497John McCall 3279f85e193739c953358c865005855253af4f68a497John McCall/// Check whether the given expression is a valid operand for an 3280f85e193739c953358c865005855253af4f68a497John McCall/// indirect copy/restore. 3281f85e193739c953358c865005855253af4f68a497John McCallstatic void checkIndirectCopyRestoreSource(Sema &S, Expr *src) { 3282f85e193739c953358c865005855253af4f68a497John McCall assert(src->isRValue()); 3283f85e193739c953358c865005855253af4f68a497John McCall 3284c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall InvalidICRKind iik = isInvalidICRSource(S.Context, src, false); 3285f85e193739c953358c865005855253af4f68a497John McCall if (iik == IIK_okay) return; 3286f85e193739c953358c865005855253af4f68a497John McCall 3287f85e193739c953358c865005855253af4f68a497John McCall S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback) 3288f85e193739c953358c865005855253af4f68a497John McCall << ((unsigned) iik - 1) // shift index into diagnostic explanations 3289f85e193739c953358c865005855253af4f68a497John McCall << src->getSourceRange(); 3290f85e193739c953358c865005855253af4f68a497John McCall} 3291f85e193739c953358c865005855253af4f68a497John McCall 3292cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor/// \brief Determine whether we have compatible array types for the 3293cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor/// purposes of GNU by-copy array initialization. 3294cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregorstatic bool hasCompatibleArrayTypes(ASTContext &Context, 3295cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *Dest, 3296cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *Source) { 3297cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // If the source and destination array types are equivalent, we're 3298cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // done. 3299cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0))) 3300cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return true; 3301cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3302cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Make sure that the element types are the same. 3303cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!Context.hasSameType(Dest->getElementType(), Source->getElementType())) 3304cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return false; 3305cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3306cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // The only mismatch we allow is when the destination is an 3307cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // incomplete array type and the source is a constant array type. 3308cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return Source->isConstantArrayType() && Dest->isIncompleteArrayType(); 3309cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor} 3310cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3311f85e193739c953358c865005855253af4f68a497John McCallstatic bool tryObjCWritebackConversion(Sema &S, 3312f85e193739c953358c865005855253af4f68a497John McCall InitializationSequence &Sequence, 3313f85e193739c953358c865005855253af4f68a497John McCall const InitializedEntity &Entity, 3314f85e193739c953358c865005855253af4f68a497John McCall Expr *Initializer) { 3315f85e193739c953358c865005855253af4f68a497John McCall bool ArrayDecay = false; 3316f85e193739c953358c865005855253af4f68a497John McCall QualType ArgType = Initializer->getType(); 3317f85e193739c953358c865005855253af4f68a497John McCall QualType ArgPointee; 3318f85e193739c953358c865005855253af4f68a497John McCall if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) { 3319f85e193739c953358c865005855253af4f68a497John McCall ArrayDecay = true; 3320f85e193739c953358c865005855253af4f68a497John McCall ArgPointee = ArgArrayType->getElementType(); 3321f85e193739c953358c865005855253af4f68a497John McCall ArgType = S.Context.getPointerType(ArgPointee); 3322f85e193739c953358c865005855253af4f68a497John McCall } 3323f85e193739c953358c865005855253af4f68a497John McCall 3324f85e193739c953358c865005855253af4f68a497John McCall // Handle write-back conversion. 3325f85e193739c953358c865005855253af4f68a497John McCall QualType ConvertedArgType; 3326f85e193739c953358c865005855253af4f68a497John McCall if (!S.isObjCWritebackConversion(ArgType, Entity.getType(), 3327f85e193739c953358c865005855253af4f68a497John McCall ConvertedArgType)) 3328f85e193739c953358c865005855253af4f68a497John McCall return false; 3329f85e193739c953358c865005855253af4f68a497John McCall 3330f85e193739c953358c865005855253af4f68a497John McCall // We should copy unless we're passing to an argument explicitly 3331f85e193739c953358c865005855253af4f68a497John McCall // marked 'out'. 3332f85e193739c953358c865005855253af4f68a497John McCall bool ShouldCopy = true; 3333f85e193739c953358c865005855253af4f68a497John McCall if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl())) 3334f85e193739c953358c865005855253af4f68a497John McCall ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out); 3335f85e193739c953358c865005855253af4f68a497John McCall 3336f85e193739c953358c865005855253af4f68a497John McCall // Do we need an lvalue conversion? 3337f85e193739c953358c865005855253af4f68a497John McCall if (ArrayDecay || Initializer->isGLValue()) { 3338f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS; 3339f85e193739c953358c865005855253af4f68a497John McCall ICS.setStandard(); 3340f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.setAsIdentityConversion(); 3341f85e193739c953358c865005855253af4f68a497John McCall 3342f85e193739c953358c865005855253af4f68a497John McCall QualType ResultType; 3343f85e193739c953358c865005855253af4f68a497John McCall if (ArrayDecay) { 3344f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First = ICK_Array_To_Pointer; 3345f85e193739c953358c865005855253af4f68a497John McCall ResultType = S.Context.getPointerType(ArgPointee); 3346f85e193739c953358c865005855253af4f68a497John McCall } else { 3347f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First = ICK_Lvalue_To_Rvalue; 3348f85e193739c953358c865005855253af4f68a497John McCall ResultType = Initializer->getType().getNonLValueExprType(S.Context); 3349f85e193739c953358c865005855253af4f68a497John McCall } 3350f85e193739c953358c865005855253af4f68a497John McCall 3351f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddConversionSequenceStep(ICS, ResultType); 3352f85e193739c953358c865005855253af4f68a497John McCall } 3353f85e193739c953358c865005855253af4f68a497John McCall 3354f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy); 3355f85e193739c953358c865005855253af4f68a497John McCall return true; 3356f85e193739c953358c865005855253af4f68a497John McCall} 3357f85e193739c953358c865005855253af4f68a497John McCall 335820093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::InitializationSequence(Sema &S, 335920093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 336020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 336120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, 33625769d6195087229770d7ac90449443e026c47103John McCall unsigned NumArgs) 33635769d6195087229770d7ac90449443e026c47103John McCall : FailedCandidateSet(Kind.getLocation()) { 336412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola ASTContext &Context = S.Context; 3365dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 336620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init]p16: 3367dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // The semantics of initializers are as follows. The destination type is 3368dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // the type of the object or reference being initialized and the source 336920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type is the type of the initializer expression. The source type is not 3370dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // defined when the initializer is a braced-init-list or when it is a 337120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // parenthesized list of expressions. 337212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola QualType DestType = Entity.getType(); 337320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 337412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola if (DestType->isDependentType() || 337520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 337620093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = DependentSequence; 337720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 337820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 337920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 33807491c499e826682e128a400038361ebcbde30eecSebastian Redl // Almost everything is a normal sequence. 33817491c499e826682e128a400038361ebcbde30eecSebastian Redl setSequenceKind(NormalSequence); 33827491c499e826682e128a400038361ebcbde30eecSebastian Redl 3383241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall for (unsigned I = 0; I != NumArgs; ++I) 3384429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Args[I]->getObjectKind() == OK_ObjCProperty) { 3385429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult Result = S.ConvertPropertyForRValue(Args[I]); 3386429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Result.isInvalid()) { 338712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ConversionFromPropertyFailed); 3388429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return; 3389429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 3390429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley Args[I] = Result.take(); 3391429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 3392241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall 339320093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType SourceType; 339420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer = 0; 339599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs == 1) { 339620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer = Args[0]; 339720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!isa<InitListExpr>(Initializer)) 339820093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceType = Initializer->getType(); 339920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3400dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3401dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the initializer is a braced-init-list, the object is 340220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // list-initialized (8.5.4). 340320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) { 340412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryListInitialization(S, Entity, Kind, InitList, *this); 3405d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 340620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3407dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 340820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a reference type, see 8.5.3. 340920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isReferenceType()) { 341020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p1: 341120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A variable declared to be a T& or T&&, that is, "reference to type T" 341220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (8.3.2), shall be initialized by an object, or function, of type T or 341320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // by an object that can be converted into a T. 341420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (Therefore, multiple arguments are not permitted.) 341520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (NumArgs != 1) 341612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_TooManyInitsForReference); 341720093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 341812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryReferenceInitialization(S, Entity, Kind, Args[0], *this); 341920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 342020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3421dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 342220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is (), the object is value-initialized. 342399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Value || 342499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct && NumArgs == 0)) { 342512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryValueInitialization(S, Entity, Kind, *this); 342620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 342720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3428dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 342999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Handle default initialization. 34307663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky if (Kind.getKind() == InitializationKind::IK_Default) { 343112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryDefaultInitialization(S, Entity, Kind, *this); 343299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 343399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 343418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 3435ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // - If the destination type is an array of characters, an array of 3436ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // char16_t, an array of char32_t, or an array of wchar_t, and the 3437ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // initializer is a string literal, see 8.5.2. 3438dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the destination type is an array, the program is 343920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // ill-formed. 3440cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const ArrayType *DestAT = Context.getAsArrayType(DestType)) { 3441cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (Initializer && IsStringInit(Initializer, DestAT, Context)) { 344212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this); 3443ce6c9b7da219c8640a0559f75770cfc6622de083John McCall return; 3444ce6c9b7da219c8640a0559f75770cfc6622de083John McCall } 3445ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 3446cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Note: as an GNU C extension, we allow initialization of an 3447cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // array from a compound literal that creates an array of the same 3448cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // type, so long as the initializer has no side effects. 3449cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!S.getLangOptions().CPlusPlus && Initializer && 3450cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) && 3451cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Initializer->getType()->isArrayType()) { 3452cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *SourceAT 3453cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor = Context.getAsArrayType(Initializer->getType()); 3454cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT)) 345512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayTypeMismatch); 3456cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor else if (Initializer->HasSideEffects(S.Context)) 345712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_NonConstantArrayInit); 3458cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor else { 345912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddArrayInitStep(DestType); 3460cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 3461cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } else if (DestAT->getElementType()->isAnyCharacterType()) 346212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayNeedsInitListOrStringLiteral); 346320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 346412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayNeedsInitList); 3465dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 346620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 346720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3468cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3469f85e193739c953358c865005855253af4f68a497John McCall // Determine whether we should consider writeback conversions for 3470f85e193739c953358c865005855253af4f68a497John McCall // Objective-C ARC. 3471f85e193739c953358c865005855253af4f68a497John McCall bool allowObjCWritebackConversion = S.getLangOptions().ObjCAutoRefCount && 3472f85e193739c953358c865005855253af4f68a497John McCall Entity.getKind() == InitializedEntity::EK_Parameter; 3473f85e193739c953358c865005855253af4f68a497John McCall 3474f85e193739c953358c865005855253af4f68a497John McCall // We're at the end of the line for C: it's either a write-back conversion 3475f85e193739c953358c865005855253af4f68a497John McCall // or it's a C assignment. There's no need to check anything else. 3476cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman if (!S.getLangOptions().CPlusPlus) { 3477f85e193739c953358c865005855253af4f68a497John McCall // If allowed, check whether this is an Objective-C writeback conversion. 3478f85e193739c953358c865005855253af4f68a497John McCall if (allowObjCWritebackConversion && 347912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola tryObjCWritebackConversion(S, *this, Entity, Initializer)) { 3480f85e193739c953358c865005855253af4f68a497John McCall return; 3481f85e193739c953358c865005855253af4f68a497John McCall } 3482f85e193739c953358c865005855253af4f68a497John McCall 3483f85e193739c953358c865005855253af4f68a497John McCall // Handle initialization in C 348412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddCAssignmentStep(DestType); 348512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 3486cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman return; 3487cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 3488dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3489f85e193739c953358c865005855253af4f68a497John McCall assert(S.getLangOptions().CPlusPlus); 3490f85e193739c953358c865005855253af4f68a497John McCall 349120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a (possibly cv-qualified) class type: 349220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isRecordType()) { 3493dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the initialization is direct-initialization, or if it is 3494dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy-initialization where the cv-unqualified version of the 3495dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // source type is the same class as, or a derived class of, the 349620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // class of the destination, constructors are considered. [...] 349720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Direct || 349820093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Kind.getKind() == InitializationKind::IK_Copy && 349920093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Context.hasSameUnqualifiedType(SourceType, DestType) || 350020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.IsDerivedFrom(SourceType, DestType)))) 3501dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TryConstructorInitialization(S, Entity, Kind, Args, NumArgs, 350212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Entity.getType(), *this); 3503dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise (i.e., for the remaining copy-initialization cases), 350420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // user-defined conversion sequences that can convert from the source 3505dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // type to the destination type or (when a conversion function is 350620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // used) to a derived class thereof are enumerated as described in 350720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 13.3.1.4, and the best one is chosen through overload resolution 350820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (13.3). 350920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 351012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 351120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 351220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3513dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 351499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs > 1) { 351512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_TooManyInitsForScalar); 351699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 351799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 351899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(NumArgs == 1 && "Zero-argument case handled above"); 3519dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3520dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the source type is a (possibly cv-qualified) class 352120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type, conversion functions are considered. 352299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (!SourceType.isNull() && SourceType->isRecordType()) { 352312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 352412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 352520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 352620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3527dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 352820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the initial value of the object being initialized is the 35294a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // (possibly converted) value of the initializer expression. Standard 353020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversions (Clause 4) will be used, if necessary, to convert the 3531dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // initializer expression to the cv-unqualified version of the 353220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // destination type; no user-defined conversions are considered. 3533f85e193739c953358c865005855253af4f68a497John McCall 3534f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS 3535f85e193739c953358c865005855253af4f68a497John McCall = S.TryImplicitConversion(Initializer, Entity.getType(), 3536f85e193739c953358c865005855253af4f68a497John McCall /*SuppressUserConversions*/true, 3537369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*AllowExplicitConversions*/ false, 353814d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*InOverloadResolution*/ false, 3539f85e193739c953358c865005855253af4f68a497John McCall /*CStyle=*/Kind.isCStyleOrFunctionalCast(), 3540f85e193739c953358c865005855253af4f68a497John McCall allowObjCWritebackConversion); 3541f85e193739c953358c865005855253af4f68a497John McCall 3542f85e193739c953358c865005855253af4f68a497John McCall if (ICS.isStandard() && 3543f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.Second == ICK_Writeback_Conversion) { 3544f85e193739c953358c865005855253af4f68a497John McCall // Objective-C ARC writeback conversion. 3545f85e193739c953358c865005855253af4f68a497John McCall 3546f85e193739c953358c865005855253af4f68a497John McCall // We should copy unless we're passing to an argument explicitly 3547f85e193739c953358c865005855253af4f68a497John McCall // marked 'out'. 3548f85e193739c953358c865005855253af4f68a497John McCall bool ShouldCopy = true; 3549f85e193739c953358c865005855253af4f68a497John McCall if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl())) 3550f85e193739c953358c865005855253af4f68a497John McCall ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out); 3551f85e193739c953358c865005855253af4f68a497John McCall 3552f85e193739c953358c865005855253af4f68a497John McCall // If there was an lvalue adjustment, add it as a separate conversion. 3553f85e193739c953358c865005855253af4f68a497John McCall if (ICS.Standard.First == ICK_Array_To_Pointer || 3554f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First == ICK_Lvalue_To_Rvalue) { 3555f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence LvalueICS; 3556f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.setStandard(); 3557f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.setAsIdentityConversion(); 3558f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0)); 3559f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.First = ICS.Standard.First; 356012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0)); 3561f85e193739c953358c865005855253af4f68a497John McCall } 356212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 356312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy); 3564f85e193739c953358c865005855253af4f68a497John McCall } else if (ICS.isBad()) { 35651be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor DeclAccessPair dap; 35661be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor if (Initializer->getType() == Context.OverloadTy && 35671be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor !S.ResolveAddressOfOverloadedFunction(Initializer 35681be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor , DestType, false, dap)) 356912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 35708e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor else 357112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(InitializationSequence::FK_ConversionFailed); 3572f85e193739c953358c865005855253af4f68a497John McCall } else { 357312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddConversionSequenceStep(ICS, Entity.getType()); 3574856d3798af7c2f7251e4a295f3da7a09ce4c62abJohn McCall 357512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 35768e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor } 357720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 357820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 357920093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::~InitializationSequence() { 35805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner for (SmallVectorImpl<Step>::iterator Step = Steps.begin(), 358120093b4bf698f292c664676987541d5103b65b15Douglas Gregor StepEnd = Steps.end(); 358220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) 358320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Destroy(); 358420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 358520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 358620093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 358720093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Perform initialization 358820093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 3589dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic Sema::AssignmentAction 359018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorgetAssignmentAction(const InitializedEntity &Entity) { 359118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch(Entity.getKind()) { 359218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 359318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 3594a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Exception: 3595a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Base: 3596059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 359718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 359818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 359918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 3600dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (Entity.getDecl() && 3601688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext())) 3602688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor return Sema::AA_Sending; 3603688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor 360418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Passing; 360518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 360618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 360718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Returning; 360818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 360918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 361018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell apart casting vs. converting? 361118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Casting; 3612dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 361318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Member: 3614d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_ArrayElement: 3615d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 3616310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 361718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 361818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 361918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 362018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Converting; 362118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 362218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 36234154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether we should binding a created object as a temporary when 36244154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// initializing the given entity. 36252f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregorstatic bool shouldBindAsTemporary(const InitializedEntity &Entity) { 362618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 36271b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 36281b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 36292f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor case InitializedEntity::EK_Result: 363018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 363118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 363218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 3633059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 3634d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 3635a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson case InitializedEntity::EK_Exception: 3636310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 363718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return false; 3638dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 363918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 364018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 364118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return true; 364218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 3643dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 364418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("missed an InitializedEntity kind?"); 364518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 364618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 36474154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether the given entity, when initialized with an object 36484154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// created for that initialization, requires destruction. 36494154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregorstatic bool shouldDestroyTemporary(const InitializedEntity &Entity) { 36504154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor switch (Entity.getKind()) { 36514154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Member: 36524154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Result: 36534154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_New: 36544154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Base: 3655059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 36564154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_VectorElement: 3657310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 36584154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return false; 3659dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 36604154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Variable: 36614154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Parameter: 36624154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Temporary: 36634154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_ArrayElement: 36644154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Exception: 36654154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return true; 36664154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 3667dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3668dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi llvm_unreachable("missed an InitializedEntity kind?"); 36694154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor} 36704154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 3671523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \brief Make a (potentially elidable) temporary copy of the object 3672523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// provided by the given initializer by calling the appropriate copy 3673523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// constructor. 3674523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3675523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param S The Sema object used for type-checking. 3676523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 367763e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// \param T The type of the temporary object, which must either be 3678523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// the type of the initializer expression or a superclass thereof. 3679523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3680523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param Enter The entity being initialized. 3681523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3682523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param CurInit The initializer expression. 3683523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3684523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param IsExtraneousCopy Whether this is an "extraneous" copy that 3685523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// is permitted in C++03 (but not C++0x) when binding a reference to 3686523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// an rvalue. 3687523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 3688523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \returns An expression that copies the initializer expression into 3689523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// a temporary object, or an error expression if a copy could not be 3690523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// created. 369160d7b3a319d84d688752be3870615ac0f111fb16John McCallstatic ExprResult CopyObject(Sema &S, 36928fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor QualType T, 36938fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor const InitializedEntity &Entity, 36948fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor ExprResult CurInit, 36958fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor bool IsExtraneousCopy) { 36963fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine which class type we're copying to. 36971b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Expr *CurInitExpr = (Expr *)CurInit.get(); 3698dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXRecordDecl *Class = 0; 3699523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) 37002f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Class = cast<CXXRecordDecl>(Record->getDecl()); 37012f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (!Class) 37022f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor return move(CurInit); 37032f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 3704f5d8f466c3eebaffc51468812bdcbe7f0fe4891aDouglas Gregor // C++0x [class.copy]p32: 37052f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // When certain criteria are met, an implementation is allowed to 37062f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // omit the copy/move construction of a class object, even if the 37072f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // copy/move constructor and/or destructor for the object have 37082f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // side effects. [...] 37092f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // - when a temporary class object that has not been bound to a 37102f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // reference (12.2) would be copied/moved to a class object 37112f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // with the same cv-unqualified type, the copy/move operation 37122f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // can be omitted by constructing the temporary object 37132f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // directly into the target of the omitted copy/move 3714dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // 37152f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // Note that the other three bullets are handled elsewhere. Copy 37163c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // elision for return statements and throw expressions are handled as part 3717dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // of constructor initialization, while copy elision for exception handlers 37183c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // is handled by the run-time. 3719558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall bool Elidable = CurInitExpr->isTemporaryObject(S.Context, Class); 372018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation Loc; 372118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 372218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 372318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Loc = Entity.getReturnLoc(); 372418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 3725dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 372618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Exception: 372718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Loc = Entity.getThrowLoc(); 372818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 3729dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 373018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 37317abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor Loc = Entity.getDecl()->getLocation(); 37327abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor break; 37337abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 37341b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 37351b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 373618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 373718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 37382f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor case InitializedEntity::EK_New: 373918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 3740059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 3741d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 3742310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 37432f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Loc = CurInitExpr->getLocStart(); 37442f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor break; 374518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 3746f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 3747dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Make sure that the type we are copying is complete. 3748f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor if (S.RequireCompleteType(Loc, T, S.PDiag(diag::err_temp_copy_incomplete))) 3749f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor return move(CurInit); 3750f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 3751cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Perform overload resolution using the class's copy/move constructors. 375218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor DeclContext::lookup_iterator Con, ConEnd; 37535769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 3754e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(Class); 375518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Con != ConEnd; ++Con) { 3756cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Only consider copy/move constructors and constructor templates. Per 37578ff338bfd8abd9ac5d0c1d89c1b05e2c02727174Douglas Gregor // C++0x [dcl.init]p16, second bullet to class types, this 37588ff338bfd8abd9ac5d0c1d89c1b05e2c02727174Douglas Gregor // initialization is direct-initialization. 37596493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor CXXConstructorDecl *Constructor = 0; 37606493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor 37616493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor if ((Constructor = dyn_cast<CXXConstructorDecl>(*Con))) { 3762cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Handle copy/moveconstructors, only. 37636493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor if (!Constructor || Constructor->isInvalidDecl() || 3764cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor !Constructor->isCopyOrMoveConstructor() || 37658ff338bfd8abd9ac5d0c1d89c1b05e2c02727174Douglas Gregor !Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 37666493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor continue; 37676493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor 37686493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor DeclAccessPair FoundDecl 37696493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor = DeclAccessPair::make(Constructor, Constructor->getAccess()); 37706493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor S.AddOverloadCandidate(Constructor, FoundDecl, 37716493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor &CurInitExpr, 1, CandidateSet); 37726493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor continue; 3773dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 37746493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor 37756493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor // Handle constructor templates. 37766493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor FunctionTemplateDecl *ConstructorTmpl = cast<FunctionTemplateDecl>(*Con); 37776493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor if (ConstructorTmpl->isInvalidDecl()) 37786493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor continue; 37796493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor 37806493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor Constructor = cast<CXXConstructorDecl>( 37816493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor ConstructorTmpl->getTemplatedDecl()); 37828ff338bfd8abd9ac5d0c1d89c1b05e2c02727174Douglas Gregor if (!Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 378318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor continue; 37849aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 37856493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor // FIXME: Do we need to limit this to copy-constructor-like 37866493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor // candidates? 37879aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl 37886493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor = DeclAccessPair::make(ConstructorTmpl, ConstructorTmpl->getAccess()); 37896493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 0, 37906493cc50b66c2d097b3e22514bbe303048c4a8ffDouglas Gregor &CurInitExpr, 1, CandidateSet, true); 37912f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor } 3792dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 379318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OverloadCandidateSet::iterator Best; 379425ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth switch (CandidateSet.BestViableFunction(S, Loc, Best)) { 379518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Success: 379618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 3797dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 379818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_No_Viable_Function: 379957d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin S.Diag(Loc, IsExtraneousCopy && !S.isSFINAEContext() 380057d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin ? diag::ext_rvalue_to_reference_temp_copy_no_viable 380157d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin : diag::err_temp_copy_no_viable) 38027abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 380318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 3804120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall CandidateSet.NoteCandidates(S, OCD_AllCandidates, &CurInitExpr, 1); 380557d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin if (!IsExtraneousCopy || S.isSFINAEContext()) 3806f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 380757d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin return move(CurInit); 3808dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 380918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Ambiguous: 381018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_ambiguous) 38117abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 381218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 3813120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall CandidateSet.NoteCandidates(S, OCD_ViableCandidates, &CurInitExpr, 1); 3814f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 3815dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 381618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Deleted: 381718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_deleted) 38187abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 381918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 382018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 3821f85e193739c953358c865005855253af4f68a497John McCall << 1 << Best->Function->isDeleted(); 3822f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 382318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 382418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 38253fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function); 3826ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 38273fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 3828523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 38299a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 383057d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin Best->FoundDecl.getAccess(), IsExtraneousCopy); 3831523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 3832523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (IsExtraneousCopy) { 3833523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // If this is a totally extraneous copy for C++03 reference 3834523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // binding purposes, just return the original initialization 38352559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // expression. We don't generate an (elided) copy operation here 38362559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // because doing so would require us to pass down a flag to avoid 38372559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // infinite recursion, where each step adds another extraneous, 38382559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // elidable copy. 38392559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 38402559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Instantiate the default arguments of any extra parameters in 38412559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // the selected copy constructor, as if we were going to create a 38422559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // proper call to the copy constructor. 38432559a7045a74679c80376305397a5953d038e1d0Douglas Gregor for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) { 38442559a7045a74679c80376305397a5953d038e1d0Douglas Gregor ParmVarDecl *Parm = Constructor->getParamDecl(I); 38452559a7045a74679c80376305397a5953d038e1d0Douglas Gregor if (S.RequireCompleteType(Loc, Parm->getType(), 38462559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.PDiag(diag::err_call_incomplete_argument))) 38472559a7045a74679c80376305397a5953d038e1d0Douglas Gregor break; 38482559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 38492559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Build the default argument expression; we don't actually care 38502559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if this succeeds or not, because this routine will complain 38512559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if there was a problem. 38522559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm); 38532559a7045a74679c80376305397a5953d038e1d0Douglas Gregor } 3854523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 3855523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor return S.Owned(CurInitExpr); 3856523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor } 3857dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 385825ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth S.MarkDeclarationReferenced(Loc, Constructor); 385925ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth 38603fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine the arguments required to actually perform the 3861523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // constructor call (we might have derived-to-base conversions, or 3862523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // the copy constructor may have default arguments). 3863f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (S.CompleteConstructorCall(Constructor, MultiExprArg(&CurInitExpr, 1), 38643fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Loc, ConstructorArgs)) 3865f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 38663fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 3867b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // Actually perform the constructor call. 3868b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, T, Constructor, Elidable, 38697a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall move_arg(ConstructorArgs), 38707a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 3871428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 3872428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 3873dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3874b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // If we're supposed to bind temporaries, do so. 3875b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity)) 3876b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 3877b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor return move(CurInit); 387818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 387920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3880a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregorvoid InitializationSequence::PrintInitLocationNote(Sema &S, 3881a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor const InitializedEntity &Entity) { 3882a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Parameter && Entity.getDecl()) { 3883a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getLocation().isInvalid()) 3884a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor return; 3885a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 3886a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getDeclName()) 3887a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here) 3888a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor << Entity.getDecl()->getDeclName(); 3889a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor else 3890a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here); 3891a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } 3892a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor} 3893a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 38943b80232b50c29b245e674f5aa02047b408e41018Sebastian Redlstatic bool isReferenceBinding(const InitializationSequence::Step &s) { 38953b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl return s.Kind == InitializationSequence::SK_BindReference || 38963b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl s.Kind == InitializationSequence::SK_BindReferenceToTemporary; 38973b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl} 38983b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl 3899dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 390020093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::Perform(Sema &S, 390120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 390220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 3903f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiExprArg Args, 3904d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType *ResultType) { 3905d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (Failed()) { 390620093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 390720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Diagnose(S, Entity, Kind, (Expr **)Args.release(), NumArgs); 3908f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 390920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3910dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 39117491c499e826682e128a400038361ebcbde30eecSebastian Redl if (getKind() == DependentSequence) { 3912d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If the declaration is a non-dependent, incomplete array type 3913d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // that has an initializer, then its type will be completed once 3914d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // the initializer is instantiated. 3915d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (ResultType && !Entity.getType()->isDependentType() && 3916d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Args.size() == 1) { 3917d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DeclType = Entity.getType(); 3918d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (const IncompleteArrayType *ArrayT 3919d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getAsIncompleteArrayType(DeclType)) { 3920d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We don't currently have the ability to accurately 3921d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // compute the length of an initializer list without 3922d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // performing full type-checking of the initializer list 3923d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // (since we have to determine where braces are implicitly 3924d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // introduced and such). So, we fall back to making the array 3925d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // type a dependently-sized array type with no specified 3926d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // bound. 3927d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (isa<InitListExpr>((Expr *)Args.get()[0])) { 3928d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor SourceRange Brackets; 3929d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor 3930d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Scavange the location of the brackets from the entity, if we can. 3931d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (DeclaratorDecl *DD = Entity.getDecl()) { 3932d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) { 3933d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor TypeLoc TL = TInfo->getTypeLoc(); 3934d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (IncompleteArrayTypeLoc *ArrayLoc 3935d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor = dyn_cast<IncompleteArrayTypeLoc>(&TL)) 3936d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Brackets = ArrayLoc->getBracketsRange(); 3937d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor } 3938d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3939d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3940d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor *ResultType 3941d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getDependentSizedArrayType(ArrayT->getElementType(), 3942d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor /*NumElts=*/0, 3943d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getSizeModifier(), 3944d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getIndexTypeCVRQualifiers(), 3945d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Brackets); 3946d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3947d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 3948d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 3949d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 39500d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek assert(Kind.getKind() == InitializationKind::IK_Copy || 39510d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek Kind.isExplicitCast()); 39520d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek return ExprResult(Args.release()[0]); 395320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 395420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 39557491c499e826682e128a400038361ebcbde30eecSebastian Redl // No steps means no initialization. 39567491c499e826682e128a400038361ebcbde30eecSebastian Redl if (Steps.empty()) 395799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return S.Owned((Expr *)0); 3958dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3959d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType().getNonReferenceType(); 3960d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor // FIXME: Ugly hack around the fact that Entity.getType() is not 3961a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // the same as Entity.getDecl()->getType() in cases involving type merging, 3962a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // and we want latter when it makes sense. 3963d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (ResultType) 3964a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() : 3965d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(); 396620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 396760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult CurInit = S.Owned((Expr *)0); 3968dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3969dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // For initialization steps that start with a single initializer, 397099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // grab the only argument out the Args and place it into the "current" 397199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // initializer. 397299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (Steps.front().Kind) { 397318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ResolveAddressOfOverloadedFunction: 397418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseRValue: 3975906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 397618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseLValue: 397718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReference: 397818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReferenceToTemporary: 3979523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 398018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_UserConversion: 398118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionLValue: 3982906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 398318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionRValue: 398418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConversionSequence: 398518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ListInitialization: 398618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 3987cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 3988cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ObjCObjectConversion: 3989f85e193739c953358c865005855253af4f68a497John McCall case SK_ArrayInit: 3990f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 3991f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 3992f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: { 399318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(Args.size() == 1); 3994429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = Args.get()[0]; 3995429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (!CurInit.get()) return ExprError(); 3996f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 3997f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall // Read from a property when initializing something with it. 3998429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInit.get()->getObjectKind() == OK_ObjCProperty) { 3999429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = S.ConvertPropertyForRValue(CurInit.take()); 4000429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInit.isInvalid()) 4001429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 4002429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 400318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 4004f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 4005dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 400618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConstructorInitialization: 400718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ZeroInitialization: 400818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 400920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4010dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4011dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Walk through the computed steps for the initialization sequence, 401220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // performing the specified conversions along the way. 401316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool ConstructorInitRequiresZeroInit = false; 401420093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (step_iterator Step = step_begin(), StepEnd = step_end(); 401520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) { 401620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 4017f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4018dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4019429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType(); 4020dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 402120093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Step->Kind) { 402220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 4023dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Overload resolution determined which function invoke; update the 402420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer to reflect that choice. 4025429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckAddressOfMemberAccess(CurInit.get(), Step->Function.FoundDecl); 4026b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()); 4027b13b737a2450167c82e148590e8019b839ce6b98John McCall CurInit = S.FixOverloadedFunctionReference(move(CurInit), 40286bb8017bb9e828d118e15e59d71c66bba323c364John McCall Step->Function.FoundDecl, 40299aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.Function); 403020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4031dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 403220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 4033906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 403420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: { 403520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a derived-to-base cast that produces either an rvalue or an 403620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue. Perform that cast. 4037dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4038f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 40395cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 404020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Casts to inaccessible base classes are allowed with C-style casts. 404120093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast(); 404220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckDerivedToBaseConversion(SourceType, Step->Type, 4043429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getLocStart(), 4044429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getSourceRange(), 40455cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson &BasePath, IgnoreBaseAccess)) 4046f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4047dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 40486fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (S.BasePathInvolvesVirtualBase(BasePath)) { 40496fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor QualType T = SourceType; 40506fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) 40516fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor T = Pointer->getPointeeType(); 40526fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const RecordType *RecordTy = T->getAs<RecordType>()) 4053429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.MarkVTableUsed(CurInit.get()->getLocStart(), 40546fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor cast<CXXRecordDecl>(RecordTy->getDecl())); 40556fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor } 40566fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 40575baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 4058906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_CastDerivedToBaseLValue ? 40595baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 4060906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_CastDerivedToBaseXValue ? 40615baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 40625baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 4063f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 4064f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Step->Type, 40652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_DerivedToBase, 40665baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall CurInit.get(), 40675baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall &BasePath, VK)); 406820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 406920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4070dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 407120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 4072429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (FieldDecl *BitField = CurInit.get()->getBitField()) { 407320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // References cannot bind to bit fields (C++ [dcl.init.ref]p5). 407420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield) 4075d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor << Entity.getType().isVolatileQualified() 407620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << BitField->getDeclName() 4077429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 407820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(BitField->getLocation(), diag::note_bitfield_decl); 4079f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 408020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4081a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 4082429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInit.get()->refersToVectorElement()) { 408341593e3b7da967b52bc3c7f488b8752dee63f38eJohn McCall // References cannot bind to vector elements. 4084093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element) 4085093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << Entity.getType().isVolatileQualified() 4086429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 4087a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 4088f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4089093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson } 4090dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 409120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Reference binding does not have any corresponding ASTs. 409220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 409320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 4094429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType)) 4095f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 40963aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 409720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 40983aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 409920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 410020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 4101429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType)) 4102f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 410320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 410403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // Materialize the temporary into memory. 4105b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor CurInit = new (S.Context) MaterializeTemporaryExpr( 4106b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor Entity.getType().getNonReferenceType(), 4107b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor CurInit.get(), 410803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor Entity.getType()->isLValueReferenceType()); 4109d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor 4110d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor // If we're binding to an Objective-C object that has lifetime, we 4111d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor // need cleanups. 4112d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor if (S.getLangOptions().ObjCAutoRefCount && 4113d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor CurInit.get()->getType()->isObjCLifetimeType()) 4114d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor S.ExprNeedsCleanups = true; 4115d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor 411620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4117dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4118523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 4119dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInit = CopyObject(S, Step->Type, Entity, move(CurInit), 4120523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor /*IsExtraneousCopy=*/true); 4121523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 4122523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 412320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: { 412420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a user-defined conversion that invokes either a constructor 412520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // or a conversion function. 4126daa8e4e888758d55a7a759dd4a91b83921cef222John McCall CastKind CastKind; 412718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy = false; 41289aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionDecl *Fn = Step->Function.Function; 41299aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundFn = Step->Function.FoundDecl; 41304154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor bool CreatedObject = false; 4131f0e0b17d0504d25b4673de015cf7401e2296323cDouglas Gregor bool IsLvalue = false; 4132b13b737a2450167c82e148590e8019b839ce6b98John McCall if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) { 413320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the selected constructor. 4134ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 4135429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley SourceLocation Loc = CurInit.get()->getLocStart(); 413620093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 4137b13b737a2450167c82e148590e8019b839ce6b98John McCall 413820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the arguments required to actually perform the constructor 413920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // call. 4140429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley Expr *Arg = CurInit.get(); 414120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CompleteConstructorCall(Constructor, 4142429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley MultiExprArg(&Arg, 1), 414320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Loc, ConstructorArgs)) 4144f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4145dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 414620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the an expression that constructs a temporary. 4147dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInit = S.BuildCXXConstructExpr(Loc, Step->Type, Constructor, 41487a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall move_arg(ConstructorArgs), 41497a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 4150428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 4151428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 415220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 4153f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4154b13b737a2450167c82e148590e8019b839ce6b98John McCall 41559a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Kind.getLocation(), Constructor, Entity, 41569aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn.getAccess()); 4157b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 4158dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 41592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_ConstructorConversion; 416018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType Class = S.Context.getTypeDeclType(Constructor->getParent()); 416118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.Context.hasSameUnqualifiedType(SourceType, Class) || 416218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.IsDerivedFrom(SourceType, Class)) 416318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor IsCopy = true; 4164dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 41654154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = true; 416620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 416720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the conversion function. 4168b13b737a2450167c82e148590e8019b839ce6b98John McCall CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn); 4169f0e0b17d0504d25b4673de015cf7401e2296323cDouglas Gregor IsLvalue = Conversion->getResultType()->isLValueReferenceType(); 4170429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), 0, 41719aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn); 4172b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 4173dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4174dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Should we move this initialization into a separate 417520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // derived-to-base conversion? I believe the answer is "no", because 417620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // we don't want to turn off access control here for c-style casts. 4177429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = 4178429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.PerformObjectArgumentInitialization(CurInit.take(), /*Qualifier=*/0, 4179429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley FoundFn, Conversion); 4180429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if(CurInitExprRes.isInvalid()) 4181f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4182429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(CurInitExprRes); 4183dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 418420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the actual call to the conversion function. 4185429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion); 418620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid() || !CurInit.get()) 4187f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4188dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 41892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_UserDefinedConversion; 4190dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 41914154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = Conversion->getResultType()->isRecordType(); 419220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4193dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 41943b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl bool RequiresCopy = !IsCopy && !isReferenceBinding(Steps.back()); 41952f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (RequiresCopy || shouldBindAsTemporary(Entity)) 419618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 41974154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor else if (CreatedObject && shouldDestroyTemporary(Entity)) { 4198429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType T = CurInit.get()->getType(); 41994154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) { 4200dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXDestructorDecl *Destructor 4201db89f289a22897f1031c92f3e49f7a9ba7bae61eDouglas Gregor = S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl())); 4202429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckDestructorAccess(CurInit.get()->getLocStart(), Destructor, 42034154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor S.PDiag(diag::err_access_dtor_temp) << T); 4204429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.MarkDeclarationReferenced(CurInit.get()->getLocStart(), Destructor); 4205429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getLocStart()); 42064154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 42074154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 4208dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4209906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl // FIXME: xvalues 4210f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 4211429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getType(), 4212429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CastKind, CurInit.get(), 0, 42135baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall IsLvalue ? VK_LValue : VK_RValue)); 4214dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 42152f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (RequiresCopy) 4216523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor CurInit = CopyObject(S, Entity.getType().getNonReferenceType(), Entity, 4217523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor move(CurInit), /*IsExtraneousCopy=*/false); 4218906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 421920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 422020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4221906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 422220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 4223906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 4224906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionRValue: { 422520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform a qualification conversion; these can never go wrong. 42265baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 4227906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_QualificationConversionLValue ? 42285baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 4229906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_QualificationConversionXValue ? 42305baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 42315baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 4232429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = S.ImpCastExprToType(CurInit.take(), Step->Type, CK_NoOp, VK); 423320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4234906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 4235906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 4236f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor case SK_ConversionSequence: { 4237f85e193739c953358c865005855253af4f68a497John McCall Sema::CheckedConversionKind CCK 4238f85e193739c953358c865005855253af4f68a497John McCall = Kind.isCStyleCast()? Sema::CCK_CStyleCast 4239f85e193739c953358c865005855253af4f68a497John McCall : Kind.isFunctionalCast()? Sema::CCK_FunctionalCast 4240f85e193739c953358c865005855253af4f68a497John McCall : Kind.isExplicitCast()? Sema::CCK_OtherCast 4241f85e193739c953358c865005855253af4f68a497John McCall : Sema::CCK_ImplicitConversion; 4242429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = 4243429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.PerformImplicitConversion(CurInit.get(), Step->Type, *Step->ICS, 4244f85e193739c953358c865005855253af4f68a497John McCall getAssignmentAction(Entity), CCK); 4245429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInitExprRes.isInvalid()) 4246f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4247429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(CurInitExprRes); 424820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4249f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor } 4250dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4251d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: { 4252429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley InitListExpr *InitList = cast<InitListExpr>(CurInit.get()); 4253d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType Ty = Step->Type; 4254cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (S.CheckInitList(Entity, InitList, ResultType? *ResultType : Ty)) 4255f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4256d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4257d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit.release(); 4258d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit = S.Owned(InitList); 4259d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4260d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 426151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 426251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: { 4263d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor unsigned NumArgs = Args.size(); 426451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor 42659aa472c45d2bd81b7b52c225e8acc560d716db97John McCall = cast<CXXConstructorDecl>(Step->Function.Function); 4266dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 426751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build a call to the selected constructor. 4268ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 42690a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid()) 42700a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian ? Kind.getEqualLoc() 42710a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian : Kind.getLocation(); 42724e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth 42734e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth if (Kind.getKind() == InitializationKind::IK_Default) { 42744e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // Force even a trivial, implicit default constructor to be 42754e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // semantically checked. We do this explicitly because we don't build 42764e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // the definition for completely trivial constructors. 42774e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth CXXRecordDecl *ClassDecl = Constructor->getParent(); 42784e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth assert(ClassDecl && "No parent class for constructor."); 42791e23865d0e148a3951a9b418e57b7e0762dc3098Sean Hunt if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() && 4280023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt ClassDecl->hasTrivialDefaultConstructor() && 4281023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt !Constructor->isUsed(false)) 42824e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth S.DefineImplicitDefaultConstructor(Loc, Constructor); 42834e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth } 42844e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth 428551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine the arguments required to actually perform the constructor 428651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // call. 4287dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (S.CompleteConstructorCall(Constructor, move(Args), 428851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Loc, ConstructorArgs)) 4289f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4290dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4291dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 429291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor if (Entity.getKind() == InitializedEntity::EK_Temporary && 4293d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor NumArgs != 1 && // FIXME: Hack to work around cast weirdness 429491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct || 429591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Kind.getKind() == InitializationKind::IK_Value)) { 429691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor // An explicitly-constructed temporary, e.g., X(1, 2). 429791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor unsigned NumExprs = ConstructorArgs.size(); 429891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Expr **Exprs = (Expr **)ConstructorArgs.take(); 429910f8e319569c8b8b4603d8a72ce01a7a01502c85Fariborz Jahanian S.MarkDeclarationReferenced(Loc, Constructor); 43009b623639378d53a675921ddfa7316034d571881eDouglas Gregor S.DiagnoseUseOfDecl(Constructor, Loc); 4301dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4302ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 4303ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!TSInfo) 4304ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc); 4305dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 430691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor CurInit = S.Owned(new (S.Context) CXXTemporaryObjectExpr(S.Context, 430791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Constructor, 4308ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo, 4309dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Exprs, 431091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor NumExprs, 4311428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth Kind.getParenRange(), 43121c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor ConstructorInitRequiresZeroInit)); 431372e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } else { 431472e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::ConstructionKind ConstructKind = 431572e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::CK_Complete; 4316dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 431772e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson if (Entity.getKind() == InitializedEntity::EK_Base) { 431872e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson ConstructKind = Entity.getBaseSpecifier()->isVirtual() ? 4319dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXConstructExpr::CK_VirtualBase : 432072e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::CK_NonVirtualBase; 4321d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt } else if (Entity.getKind() == InitializedEntity::EK_Delegating) { 4322059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt ConstructKind = CXXConstructExpr::CK_Delegating; 4323059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt } 4324dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4325428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth // Only get the parenthesis range if it is a direct construction. 4326428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange parenRange = 4327428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth Kind.getKind() == InitializationKind::IK_Direct ? 4328428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth Kind.getParenRange() : SourceRange(); 4329428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth 43303c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // If the entity allows NRVO, mark the construction as elidable 43313c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // unconditionally. 43323c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor if (Entity.allowsNRVO()) 43333c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 43343c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor Constructor, /*Elidable=*/true, 43353c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor move_arg(ConstructorArgs), 43363c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor ConstructorInitRequiresZeroInit, 4337428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth ConstructKind, 4338428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth parenRange); 43393c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor else 43403c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 4341dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Constructor, 43423c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor move_arg(ConstructorArgs), 43433c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor ConstructorInitRequiresZeroInit, 4344428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth ConstructKind, 4345428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth parenRange); 434672e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } 434751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (CurInit.isInvalid()) 4348f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4349b13b737a2450167c82e148590e8019b839ce6b98John McCall 4350b13b737a2450167c82e148590e8019b839ce6b98John McCall // Only check access if all of that succeeded. 43519a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 43529aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.FoundDecl.getAccess()); 4353b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Loc); 4354dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 43552f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (shouldBindAsTemporary(Entity)) 435618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 4357dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 435851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 435951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 4360dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 436171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: { 436216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor step_iterator NextStep = Step; 436316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ++NextStep; 4364dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (NextStep != StepEnd && 436516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor NextStep->Kind == SK_ConstructorInitialization) { 436616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // The need for zero-initialization is recorded directly into 436716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // the call to the object's constructor within the next step. 436816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ConstructorInitRequiresZeroInit = true; 436916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else if (Kind.getKind() == InitializationKind::IK_Value && 437016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor S.getLangOptions().CPlusPlus && 437116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !Kind.isImplicitValueInit()) { 4372ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 4373ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!TSInfo) 4374dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TSInfo = S.Context.getTrivialTypeSourceInfo(Step->Type, 4375ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Kind.getRange().getBegin()); 4376ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 4377ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CurInit = S.Owned(new (S.Context) CXXScalarValueInitExpr( 4378ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo->getType().getNonLValueExprType(S.Context), 4379ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo, 438071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getEnd())); 438116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else { 438271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitValueInitExpr(Step->Type)); 438316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 438471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor break; 438571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 438618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 438718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: { 4388429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType SourceType = CurInit.get()->getType(); 4389429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult Result = move(CurInit); 439018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::AssignConvertType ConvTy = 4391429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckSingleAssignmentConstraints(Step->Type, Result); 4392429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Result.isInvalid()) 4393429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 4394429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(Result); 4395aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 4396aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor // If this is a call, allow conversion to a transparent union. 4397429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = move(CurInit); 4398aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor if (ConvTy != Sema::Compatible && 4399aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor Entity.getKind() == InitializedEntity::EK_Parameter && 4400429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExprRes) 4401aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor == Sema::Compatible) 4402aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor ConvTy = Sema::Compatible; 4403429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInitExprRes.isInvalid()) 4404429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 4405429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(CurInitExprRes); 4406aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 4407a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor bool Complained; 440818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(), 440918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step->Type, SourceType, 4410429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get(), 4411a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor getAssignmentAction(Entity), 4412a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor &Complained)) { 4413a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 4414f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4415a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } else if (Complained) 4416a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 441718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 441818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 4419cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 4420cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: { 4421cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman QualType Ty = Step->Type; 4422429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CheckStringInit(CurInit.get(), ResultType ? *ResultType : Ty, 4423fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall S.Context.getAsArrayType(Ty), S); 4424cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman break; 4425cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 4426569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 4427569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 4428429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = S.ImpCastExprToType(CurInit.take(), Step->Type, 44292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_ObjCObjectLValueCast, 4430429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CastCategory(CurInit.get())); 4431569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 4432cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 4433cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 4434cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Okay: we checked everything before creating this step. Note that 4435cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // this is a GNU extension. 4436cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Diag(Kind.getLocation(), diag::ext_array_init_copy) 4437429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << Step->Type << CurInit.get()->getType() 4438429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 4439cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 4440cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // If the destination type is an incomplete array type, update the 4441cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // type accordingly. 4442cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (ResultType) { 4443cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const IncompleteArrayType *IncompleteDest 4444cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor = S.Context.getAsIncompleteArrayType(Step->Type)) { 4445cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const ConstantArrayType *ConstantSource 4446429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley = S.Context.getAsConstantArrayType(CurInit.get()->getType())) { 4447cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor *ResultType = S.Context.getConstantArrayType( 4448cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor IncompleteDest->getElementType(), 4449cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ConstantSource->getSize(), 4450cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ArrayType::Normal, 0); 4451cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 4452cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 4453cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 4454f85e193739c953358c865005855253af4f68a497John McCall break; 4455cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 4456f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 4457f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 4458f85e193739c953358c865005855253af4f68a497John McCall checkIndirectCopyRestoreSource(S, CurInit.get()); 4459f85e193739c953358c865005855253af4f68a497John McCall CurInit = S.Owned(new (S.Context) 4460f85e193739c953358c865005855253af4f68a497John McCall ObjCIndirectCopyRestoreExpr(CurInit.take(), Step->Type, 4461f85e193739c953358c865005855253af4f68a497John McCall Step->Kind == SK_PassByIndirectCopyRestore)); 4462f85e193739c953358c865005855253af4f68a497John McCall break; 4463f85e193739c953358c865005855253af4f68a497John McCall 4464f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 4465f85e193739c953358c865005855253af4f68a497John McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, Step->Type, 4466f85e193739c953358c865005855253af4f68a497John McCall CK_ObjCProduceObject, 4467f85e193739c953358c865005855253af4f68a497John McCall CurInit.take(), 0, VK_RValue)); 4468cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 446920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 447020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 447115d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall 447215d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall // Diagnose non-fatal problems with the completed initialization. 447315d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall if (Entity.getKind() == InitializedEntity::EK_Member && 447415d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl())->isBitField()) 447515d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall S.CheckBitFieldInitialization(Kind.getLocation(), 447615d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl()), 447715d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall CurInit.get()); 4478dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 447920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return move(CurInit); 448020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 448120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 448220093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 448320093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Diagnose initialization failures 448420093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 4485dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumibool InitializationSequence::Diagnose(Sema &S, 448620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 448720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 448820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs) { 4489d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (!Failed()) 449020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return false; 4491dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4492d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 449320093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Failure) { 449420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_TooManyInitsForReference: 44959db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // FIXME: Customize for the initialized entity? 44969db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (NumArgs == 0) 44979db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_without_init) 44989db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType.getNonReferenceType(); 44999db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor else // FIXME: diagnostic below could be better! 45009db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits) 45019db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 450220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4503dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 450420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitList: 450520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 450620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) 450720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Failure == FK_ArrayNeedsInitListOrStringLiteral); 450820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4509dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4510cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 4511cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 4512cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Diag(Kind.getLocation(), 4513cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor (Failure == FK_ArrayTypeMismatch 4514cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ? diag::err_array_init_different_type 4515cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor : diag::err_array_init_non_constant_array)) 4516cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << DestType.getNonReferenceType() 4517cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << Args[0]->getType() 4518cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << Args[0]->getSourceRange(); 4519cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 4520cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 45216bb8017bb9e828d118e15e59d71c66bba323c364John McCall case FK_AddressOfOverloadFailed: { 45226bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found; 4523dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.ResolveAddressOfOverloadedFunction(Args[0], 452420093b4bf698f292c664676987541d5103b65b15Douglas Gregor DestType.getNonReferenceType(), 45256bb8017bb9e828d118e15e59d71c66bba323c364John McCall true, 45266bb8017bb9e828d118e15e59d71c66bba323c364John McCall Found); 452720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 45286bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 4529dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 453020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitOverloadFailed: 45314a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor case FK_UserConversionOverloadFailed: 453220093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (FailedOverloadResult) { 453320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Ambiguous: 453418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Failure == FK_UserConversionOverloadFailed) 453518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_ambiguous_condition) 453618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getType() << DestType 453718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 453818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 453918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_ref_init_ambiguous) 454018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << DestType << Args[0]->getType() 454118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 454218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 4543120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, Args, NumArgs); 454420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4545dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 454620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_No_Viable_Function: 454720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition) 454820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 454920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 4550120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args, NumArgs); 455120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4552dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 455320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Deleted: { 455420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function) 455520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 455620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 455720093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 4558120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 45598fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best, 45608fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor true); 456120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Ovl == OR_Deleted) { 456220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 4563f85e193739c953358c865005855253af4f68a497John McCall << 1 << Best->Function->isDeleted(); 456420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 45659f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Inconsistent overload resolution?"); 456620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 456720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 456820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4569dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 457020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Success: 45719f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Conversion did not fail!"); 457220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 457320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 457420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4575dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 457620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 457720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 4578dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Kind.getLocation(), 457920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Failure == FK_NonConstLValueReferenceBindingToTemporary 458020093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? diag::err_lvalue_reference_bind_to_temporary 458120093b4bf698f292c664676987541d5103b65b15Douglas Gregor : diag::err_lvalue_reference_bind_to_unrelated) 4582ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor << DestType.getNonReferenceType().isVolatileQualified() 458320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 458420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 458520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 458620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4587dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 458820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_RValueReferenceBindingToLValue: 458920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref) 4590fb5d7efc279335bde2cdc0a73da525d6b28201e9Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getType() 459120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 459220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4593dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 459420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitDropsQualifiers: 459520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) 459620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 459720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 459820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 459920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4600dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 460120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitFailed: 460220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_failed) 460320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 46047eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 460520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 460620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 4607926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor if (DestType.getNonReferenceType()->isObjCObjectPointerType() && 4608926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor Args[0]->getType()->isObjCObjectPointerType()) 4609926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor S.EmitRelatedResultTypeNote(Args[0]); 461020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4611dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 46121be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor case FK_ConversionFailed: { 46131be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor QualType FromType = Args[0]->getType(); 461418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_init_conversion_failed) 461518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << (int)Entity.getKind() 461620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType 46177eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 46181be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor << FromType 461920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 4620926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor if (DestType.getNonReferenceType()->isObjCObjectPointerType() && 4621926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor Args[0]->getType()->isObjCObjectPointerType()) 4622926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor S.EmitRelatedResultTypeNote(Args[0]); 4623d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 46241be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor } 4625429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 4626429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 4627429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley // No-op. This error has already been reported. 4628429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley break; 4629429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 4630d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_TooManyInitsForScalar: { 463199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceRange R; 463299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 463399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (InitListExpr *InitList = dyn_cast<InitListExpr>(Args[0])) 463419311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R = SourceRange(InitList->getInit(0)->getLocEnd(), 463599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitList->getLocEnd()); 4636dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi else 463719311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R = SourceRange(Args[0]->getLocEnd(), Args[NumArgs - 1]->getLocEnd()); 4638d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 463919311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R.setBegin(S.PP.getLocForEndOfToken(R.getBegin())); 464019311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor if (Kind.isCStyleOrFunctionalCast()) 464119311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg) 464219311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << R; 464319311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor else 464419311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_excess_initializers) 464519311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << /*scalar=*/2 << R; 4646d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4647d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4648d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4649d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_ReferenceBindingToInitList: 4650d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list) 4651d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getSourceRange(); 4652d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4653d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4654d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_InitListBadDestinationType: 4655d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type) 4656d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange(); 4657d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4658dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 465951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case FK_ConstructorOverloadFailed: { 466051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceRange ArgsRange; 466151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (NumArgs) 4662dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ArgsRange = SourceRange(Args[0]->getLocStart(), 466351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Args[NumArgs - 1]->getLocEnd()); 4664dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 466551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // FIXME: Using "DestType" for the entity we're printing is probably 466651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // bad. 466751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor switch (FailedOverloadResult) { 466851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Ambiguous: 466951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_ambiguous_init) 467051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 4671120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, 4672120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall Args, NumArgs); 467351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 4674dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 467551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_No_Viable_Function: 46769db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 46779db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor (Entity.getKind() == InitializedEntity::EK_Base || 46789db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Member) && 46799db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 46809db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default initialization of a member or 46819db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // base within a constructor. If no viable function was 46829db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // found, notify the user that she needs to explicitly 46839db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialize this base/member. 46849db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor 46859db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = cast<CXXConstructorDecl>(S.CurContext); 46869db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Base) { 46879db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 46889db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 46899db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 46909db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*base=*/0 46919db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getType(); 46929db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 46939db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor RecordDecl *BaseDecl 46949db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getBaseSpecifier()->getType()->getAs<RecordType>() 46959db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ->getDecl(); 46969db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(BaseDecl->getLocation(), diag::note_previous_decl) 46979db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(BaseDecl); 46989db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 46999db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 47009db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 47019db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 47029db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*member=*/1 47039db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 47049db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_field_decl); 47059db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 47069db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (const RecordType *Record 47079db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getType()->getAs<RecordType>()) 4708dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Record->getDecl()->getLocation(), 47099db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor diag::note_previous_decl) 47109db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(Record->getDecl()); 47119db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 47129db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor break; 47139db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 47149db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 471551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init) 471651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 4717120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args, NumArgs); 471851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 4719dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 472051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Deleted: { 472151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 472251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << true << DestType << ArgsRange; 472351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 4724120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 4725120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best); 472651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (Ovl == OR_Deleted) { 472751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 4728f85e193739c953358c865005855253af4f68a497John McCall << 1 << Best->Function->isDeleted(); 472951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } else { 473051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Inconsistent overload resolution?"); 473151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 473251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 473351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 4734dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 473551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Success: 473651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Conversion did not fail!"); 473751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 473851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 473951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 474051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 4741dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 474299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case FK_DefaultInitOfConst: 47439db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Member && 47449db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 47459db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default-initialization of a const member in 47469db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // a constructor. Complain that it needs to be explicitly 47479db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialized. 47489db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext); 47499db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor) 47509db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 47519db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 47529db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*const=*/1 47539db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 47549db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl) 47559db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 47569db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 47579db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_default_init_const) 47589db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType << (bool)DestType->getAs<RecordType>(); 47599db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 476099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor break; 4761dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 476272a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 4763dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.RequireCompleteType(Kind.getLocation(), DestType, 476472a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor diag::err_init_incomplete_type); 4765dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi break; 476620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4767dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4768a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 476920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return true; 477020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 477118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 47725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid InitializationSequence::dump(raw_ostream &OS) const { 4773de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (SequenceKind) { 4774de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FailedSequence: { 4775de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Failed sequence: "; 4776de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (Failure) { 4777de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForReference: 4778de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for reference"; 4779de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4780dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4781de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitList: 4782de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list"; 4783de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4784dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4785de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 4786de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list or string literal"; 4787de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4788dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4789cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 4790cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "array type mismatch"; 4791cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 4792cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 4793cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 4794cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "non-constant array initializer"; 4795cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 4796cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 4797de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_AddressOfOverloadFailed: 4798de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "address of overloaded function failed"; 4799de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4800dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4801de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitOverloadFailed: 4802de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overload resolution for reference initialization failed"; 4803de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4804dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4805de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 4806de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to temporary"; 4807de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4808dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4809de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 4810de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to unrelated type"; 4811de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4812dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4813de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_RValueReferenceBindingToLValue: 4814de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "rvalue reference bound to an lvalue"; 4815de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4816dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4817de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitDropsQualifiers: 4818de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization drops qualifiers"; 4819de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4820dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4821de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitFailed: 4822de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization failed"; 4823de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4824dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4825de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConversionFailed: 4826de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "conversion failed"; 4827de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4828dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4829429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 4830429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley OS << "conversion from property failed"; 4831429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley break; 4832429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 4833de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForScalar: 4834de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for scalar"; 4835de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4836dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4837de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceBindingToInitList: 4838de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "referencing binding to initializer list"; 4839de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4840dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4841de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_InitListBadDestinationType: 4842de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "initializer list for non-aggregate, non-scalar type"; 4843de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4844dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4845de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_UserConversionOverloadFailed: 4846de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overloading failed for user-defined conversion"; 4847de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4848dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4849de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConstructorOverloadFailed: 4850de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor overloading failed"; 4851de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4852dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4853de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_DefaultInitOfConst: 4854de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "default initialization of a const variable"; 4855de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4856dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 485772a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 485872a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor OS << "initialization of incomplete type"; 485972a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor break; 4860dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 4861de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << '\n'; 4862de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 4863de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4864dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4865de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case DependentSequence: 48667491c499e826682e128a400038361ebcbde30eecSebastian Redl OS << "Dependent sequence\n"; 4867de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 4868dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 48697491c499e826682e128a400038361ebcbde30eecSebastian Redl case NormalSequence: 48707491c499e826682e128a400038361ebcbde30eecSebastian Redl OS << "Normal sequence: "; 4871de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4872de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4873dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4874de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) { 4875de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor if (S != step_begin()) { 4876de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << " -> "; 4877de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4878dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4879de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (S->Kind) { 4880de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 4881de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "resolve address of overloaded function"; 4882de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4883dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4884de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseRValue: 4885de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (rvalue" << S->Type.getAsString() << ")"; 4886de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4887dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4888906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 4889906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "derived-to-base case (xvalue" << S->Type.getAsString() << ")"; 4890906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 4891dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4892de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseLValue: 4893de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (lvalue" << S->Type.getAsString() << ")"; 4894de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4895dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4896de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReference: 4897de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to lvalue"; 4898de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4899dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4900de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReferenceToTemporary: 4901de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to a temporary"; 4902de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4903dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4904523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 4905523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor OS << "extraneous C++03 copy to temporary"; 4906523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 4907523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 4908de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_UserConversion: 4909900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << "user-defined conversion via " << S->Function.Function; 4910de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4911906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 4912de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionRValue: 4913de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (rvalue)"; 4914de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4915906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 4916906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "qualification conversion (xvalue)"; 4917906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 4918de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionLValue: 4919de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (lvalue)"; 4920de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4921dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4922de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConversionSequence: 4923de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "implicit conversion sequence ("; 4924de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor S->ICS->DebugPrint(); // FIXME: use OS 4925de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << ")"; 4926de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4927dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4928de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ListInitialization: 4929de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "list initialization"; 4930de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4931dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4932de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConstructorInitialization: 4933de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor initialization"; 4934de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4935dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4936de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ZeroInitialization: 4937de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "zero initialization"; 4938de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4939dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4940de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CAssignment: 4941de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment"; 4942de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4943dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4944de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_StringInit: 4945de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "string initialization"; 4946de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 4947569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 4948569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 4949569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor OS << "Objective-C object conversion"; 4950569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 4951cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 4952cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 4953cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "array initialization"; 4954cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 4955f85e193739c953358c865005855253af4f68a497John McCall 4956f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 4957f85e193739c953358c865005855253af4f68a497John McCall OS << "pass by indirect copy and restore"; 4958f85e193739c953358c865005855253af4f68a497John McCall break; 4959f85e193739c953358c865005855253af4f68a497John McCall 4960f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 4961f85e193739c953358c865005855253af4f68a497John McCall OS << "pass by indirect restore"; 4962f85e193739c953358c865005855253af4f68a497John McCall break; 4963f85e193739c953358c865005855253af4f68a497John McCall 4964f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 4965f85e193739c953358c865005855253af4f68a497John McCall OS << "Objective-C object retension"; 4966f85e193739c953358c865005855253af4f68a497John McCall break; 4967de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4968de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 4969de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 4970de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 4971de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump() const { 4972de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor dump(llvm::errs()); 4973de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 4974de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 497518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 497618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// Initialization helper functions 497718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 49782be7e90b81509204b99b7bbf9753ad17b894a12aSean Huntbool 49792be7e90b81509204b99b7bbf9753ad17b894a12aSean HuntSema::CanPerformCopyInitialization(const InitializedEntity &Entity, 49802be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt ExprResult Init) { 49812be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt if (Init.isInvalid()) 49822be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt return false; 49832be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 49842be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt Expr *InitE = Init.get(); 49852be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt assert(InitE && "No initialization expression"); 49862be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 49872be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt InitializationKind Kind = InitializationKind::CreateCopy(SourceLocation(), 49882be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt SourceLocation()); 49892be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 4990383616cd2e61131a534afd9364ef53f643e1f834Sebastian Redl return !Seq.Failed(); 49912be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt} 49922be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 4993dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 499418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::PerformCopyInitialization(const InitializedEntity &Entity, 499518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation EqualLoc, 499660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Init) { 499718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Init.isInvalid()) 499818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return ExprError(); 499918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 500015d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall Expr *InitE = Init.get(); 500118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(InitE && "No initialization expression?"); 500218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 500318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (EqualLoc.isInvalid()) 500418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc = InitE->getLocStart(); 500518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 500618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationKind Kind = InitializationKind::CreateCopy(InitE->getLocStart(), 500718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc); 500818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 500918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Init.release(); 5010f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return Seq.Perform(*this, Entity, Kind, MultiExprArg(&InitE, 1)); 501118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 5012