SemaInit.cpp revision 13dc8f98f6108dca8aaa9721567ed5a2d9911e0f
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// 105d3d41d0873d51b405972baf38e1f3a7ef5b49e0Sebastian Redl// This file implements semantic analysis for initializers. 11dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// 120cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff//===----------------------------------------------------------------------===// 130cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1419510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Designator.h" 15e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Initialization.h" 16e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h" 172d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall#include "clang/Sema/SemaInternal.h" 181e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner#include "clang/Lex/Preprocessor.h" 190cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff#include "clang/AST/ASTContext.h" 207cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 212078bb9c9336da56ea521e98e718556b227541f6Anders Carlsson#include "clang/AST/ExprCXX.h" 2279e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner#include "clang/AST/ExprObjC.h" 23d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor#include "clang/AST/TypeLoc.h" 2420093b4bf698f292c664676987541d5103b65b15Douglas Gregor#include "llvm/Support/ErrorHandling.h" 25191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin#include "llvm/Support/raw_ostream.h" 26c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor#include <map> 2705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorusing namespace clang; 280cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 29dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 30dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Sema Initialization Checking 31dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 32dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 33ce6c9b7da219c8640a0559f75770cfc6622de083John McCallstatic Expr *IsStringInit(Expr *Init, const ArrayType *AT, 34ce6c9b7da219c8640a0559f75770cfc6622de083John McCall ASTContext &Context) { 358718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT)) 368718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman return 0; 378718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman 388879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // See if this is a string literal or @encode. 398879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner Init = Init->IgnoreParens(); 401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 418879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Handle @encode, which is a narrow string. 428879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType()) 438879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 448879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 458879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Otherwise we can only handle string literals. 468879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner StringLiteral *SL = dyn_cast<StringLiteral>(Init); 47220b6369d7717bfe6894b46cef055d3e763827f2Chris Lattner if (SL == 0) return 0; 48bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman 49bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman QualType ElemTy = Context.getCanonicalType(AT->getElementType()); 505cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor 515cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor switch (SL->getKind()) { 525cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::Ascii: 535cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF8: 545cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // char array can be initialized with a narrow string. 555cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // Only allow char x[] = "foo"; not char x[] = L"foo"; 56bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman return ElemTy->isCharType() ? Init : 0; 575cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF16: 585cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return ElemTy->isChar16Type() ? Init : 0; 595cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF32: 605cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return ElemTy->isChar32Type() ? Init : 0; 615cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::Wide: 625cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // wchar_t array can be initialized with a wide string: C99 6.7.8p15 (with 635cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // correction from DR343): "An array with element type compatible with a 645cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // qualified or unqualified version of wchar_t may be initialized by a wide 655cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // string literal, optionally enclosed in braces." 665cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor if (Context.typesAreCompatible(Context.getWCharType(), 675cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor ElemTy.getUnqualifiedType())) 685cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return Init; 698879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 705cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return 0; 715cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor } 721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 735cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor llvm_unreachable("missed a StringLiteral kind?"); 74dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 75dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 76ce6c9b7da219c8640a0559f75770cfc6622de083John McCallstatic Expr *IsStringInit(Expr *init, QualType declType, ASTContext &Context) { 77ce6c9b7da219c8640a0559f75770cfc6622de083John McCall const ArrayType *arrayType = Context.getAsArrayType(declType); 78ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (!arrayType) return 0; 79ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 80ce6c9b7da219c8640a0559f75770cfc6622de083John McCall return IsStringInit(init, arrayType, Context); 81ce6c9b7da219c8640a0559f75770cfc6622de083John McCall} 82ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 83fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCallstatic void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT, 84fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall Sema &S) { 8579e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner // Get the length of the string as parsed. 8679e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner uint64_t StrLength = 8779e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner cast<ConstantArrayType>(Str->getType())->getSize().getZExtValue(); 8879e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 90dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p14. We have an array of character type with unknown size 92dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // being initialized to a string literal. 93dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner llvm::APSInt ConstVal(32); 9419da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner ConstVal = StrLength; 95dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // Return a new array type (C99 6.7.8p22). 9646a617a792bfab0d9b1e057371ea3b9540802226John McCall DeclT = S.Context.getConstantArrayType(IAT->getElementType(), 9746a617a792bfab0d9b1e057371ea3b9540802226John McCall ConstVal, 9846a617a792bfab0d9b1e057371ea3b9540802226John McCall ArrayType::Normal, 0); 9919da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner return; 100dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner } 1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1028718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman const ConstantArrayType *CAT = cast<ConstantArrayType>(AT); 1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 104bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // We have an array of character type with known size. However, 1058718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // the size may be smaller or larger than the string we are initializing. 1068718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // FIXME: Avoid truncation for 64-bit length strings. 107bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (S.getLangOptions().CPlusPlus) { 108b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson if (StringLiteral *SL = dyn_cast<StringLiteral>(Str)) { 109b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // For Pascal strings it's OK to strip off the terminating null character, 110b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // so the example below is valid: 111b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // 112b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // unsigned char a[2] = "\pa"; 113b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson if (SL->isPascal()) 114b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson StrLength--; 115b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson } 116b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson 117bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // [dcl.init.string]p2 118bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (StrLength > CAT->getSize().getZExtValue()) 119bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman S.Diag(Str->getSourceRange().getBegin(), 120bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman diag::err_initializer_string_for_char_array_too_long) 121bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman << Str->getSourceRange(); 122bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman } else { 123bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // C99 6.7.8p14. 124bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (StrLength-1 > CAT->getSize().getZExtValue()) 125bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman S.Diag(Str->getSourceRange().getBegin(), 126bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman diag::warn_initializer_string_for_char_array_too_long) 127bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman << Str->getSourceRange(); 128bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman } 1291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1308718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // Set the type to the actual size that we are initializing. If we have 1318718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // something like: 1328718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // char x[1] = "foo"; 1338718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // then this will set the string literal's type to char[1]. 1348718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman Str->setType(DeclT); 135dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 136dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 137dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 138dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Semantic checking for initializer lists. 139dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 140dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 1419e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// @brief Semantic checking for initializer lists. 1429e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1439e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// The InitListChecker class contains a set of routines that each 1449e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// handle the initialization of a certain kind of entity, e.g., 1459e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arrays, vectors, struct/union types, scalars, etc. The 1469e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// InitListChecker itself performs a recursive walk of the subobject 1479e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure of the type to be initialized, while stepping through 1489e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// the initializer list one element at a time. The IList and Index 1499e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// parameters to each of the Check* routines contain the active 1509e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// (syntactic) initializer list and the index into that initializer 1519e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list that represents the current initializer. Each routine is 1529e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// responsible for moving that Index forward as it consumes elements. 1539e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1549e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// Each Check* routine also has a StructuredList/StructuredIndex 15563e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// arguments, which contains the current "structured" (semantic) 1569e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initializer list and the index into that initializer list where we 1579e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// are copying initializers as we map them over to the semantic 1589e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. Once we have completed our recursive walk of the subobject 1599e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure, we will have constructed a full semantic initializer 1609e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. 1619e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1629e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// C99 designators cause changes in the initializer list traversal, 1639e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// because they make the initialization "jump" into a specific 1649e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// subobject and then continue the initialization from that 1659e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// point. CheckDesignatedInitializer() recursively steps into the 1669e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// designated subobject and manages backing out the recursion to 1679e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initialize the subobjects after the one designated. 1688b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattnernamespace { 169c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorclass InitListChecker { 1700820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner Sema &SemaRef; 171c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool hadError; 17214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool VerifyOnly; // no diagnostics, no structure building 173c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl bool AllowBraceElision; 174c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor std::map<InitListExpr *, InitListExpr *> SyntacticToSemantic; 175c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *FullyStructuredList; 1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1778ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckImplicitInitList(const InitializedEntity &Entity, 178987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, QualType T, 1799e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 180629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman unsigned &StructuredIndex); 1818ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckExplicitInitList(const InitializedEntity &Entity, 18246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 1839e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 184eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 185eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1868ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckListElementTypes(const InitializedEntity &Entity, 18746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &DeclType, 1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 189c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1909e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 191eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 192eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1938ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckSubElementType(const InitializedEntity &Entity, 19446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType ElemType, 195c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1969e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1979e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 1980c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman void CheckComplexType(const InitializedEntity &Entity, 1990c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *IList, QualType DeclType, 2000c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &Index, 2010c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *StructuredList, 2020c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &StructuredIndex); 2038ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckScalarType(const InitializedEntity &Entity, 20446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 205c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 2069e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2079e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2088ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckReferenceType(const InitializedEntity &Entity, 2098ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 210930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 211930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 212930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex); 2138ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckVectorType(const InitializedEntity &Entity, 21446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, unsigned &Index, 2159e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2169e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2178ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckStructUnionTypes(const InitializedEntity &Entity, 2182bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, QualType DeclType, 2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator Field, 220c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 2219e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 222eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 223eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 2248ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckArrayType(const InitializedEntity &Entity, 225784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 2261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::APSInt elementIndex, 227c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 2289e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2299e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2308ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson bool CheckDesignatedInitializer(const InitializedEntity &Entity, 2319a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, DesignatedInitExpr *DIE, 232711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 2331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &CurrentObjectType, 234c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor RecordDecl::field_iterator *NextField, 235c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor llvm::APSInt *NextElementIndex, 236c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 237c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 238c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &StructuredIndex, 239eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 240eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject); 241c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 242c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor QualType CurrentObjectType, 243c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 244c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned StructuredIndex, 245c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor SourceRange InitRange); 2469e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor void UpdateStructuredListElement(InitListExpr *StructuredList, 2479e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex, 248c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor Expr *expr); 249c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numArrayElements(QualType DeclType); 250c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numStructUnionElements(QualType DeclType); 251930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 252d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor void FillInValueInitForField(unsigned Init, FieldDecl *Field, 253d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 254d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 255cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor void FillInValueInitializations(const InitializedEntity &Entity, 256cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 257f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool CheckFlexibleArrayInit(const InitializedEntity &Entity, 258f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman Expr *InitExpr, FieldDecl *Field, 259f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool TopLevelObject); 2603ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl void CheckValueInitializable(const InitializedEntity &Entity); 2613ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 262c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorpublic: 263cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker(Sema &S, const InitializedEntity &Entity, 264c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl InitListExpr *IL, QualType &T, bool VerifyOnly, 265c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl bool AllowBraceElision); 266c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool HadError() { return hadError; } 267c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 268c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // @brief Retrieves the fully-structured initializer list used for 269c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // semantic analysis and code generation. 270c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } 271c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor}; 2728b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattner} // end anonymous namespace 27368355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 2743ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redlvoid InitListChecker::CheckValueInitializable(const InitializedEntity &Entity) { 2753ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl assert(VerifyOnly && 2763ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl "CheckValueInitializable is only inteded for verification mode."); 2773ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 2783ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl SourceLocation Loc; 2793ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 2803ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl true); 2813ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializationSequence InitSeq(SemaRef, Entity, Kind, 0, 0); 2823ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (InitSeq.Failed()) 2833ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl hadError = true; 2843ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl} 2853ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 286d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregorvoid InitListChecker::FillInValueInitForField(unsigned Init, FieldDecl *Field, 287d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 288dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitListExpr *ILE, 289d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor bool &RequiresSecondPass) { 290d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 291d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned NumInits = ILE->getNumInits(); 292dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity MemberEntity 293d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitializedEntity::InitializeMember(Field, &ParentEntity); 294d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 295d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // FIXME: We probably don't need to handle references 296d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // specially here, since value-initialization of references is 297d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // handled in InitializationSequence. 298d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->getType()->isReferenceType()) { 299d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // C++ [dcl.init.aggr]p9: 300d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // If an incomplete or empty initializer-list leaves a 301d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // member of reference type uninitialized, the program is 302d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // ill-formed. 303d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized) 304d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << Field->getType() 305d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << ILE->getSyntacticForm()->getSourceRange(); 306d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Field->getLocation(), 307d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor diag::note_uninit_reference_member); 308d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 309d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 310d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 311dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 312d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 313d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor true); 314d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationSequence InitSeq(SemaRef, MemberEntity, Kind, 0, 0); 315d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (!InitSeq) { 316d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitSeq.Diagnose(SemaRef, MemberEntity, Kind, 0, 0); 317d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 318d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 319d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 320dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 32160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult MemberInit 322f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall = InitSeq.Perform(SemaRef, MemberEntity, Kind, MultiExprArg()); 323d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (MemberInit.isInvalid()) { 324d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 325d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 326d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 327dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 328d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) { 329d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Do nothing 330d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (Init < NumInits) { 331d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->setInit(Init, MemberInit.takeAs<Expr>()); 3327491c499e826682e128a400038361ebcbde30eecSebastian Redl } else if (InitSeq.isConstructorInitialization()) { 333d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Value-initialization requires a constructor call, so 334d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // extend the initializer list to include the constructor 335d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // call and make a note that we'll need to take another pass 336d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // through the initializer list. 337709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek ILE->updateInit(SemaRef.Context, Init, MemberInit.takeAs<Expr>()); 338d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass = true; 339d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 340d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitListExpr *InnerILE 341d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 342dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FillInValueInitializations(MemberEntity, InnerILE, 343dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi RequiresSecondPass); 344d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor} 345d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 3464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Recursively replaces NULL values within the given initializer list 3474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// with expressions that perform value-initialization of the 3484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// appropriate type. 349dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 350cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::FillInValueInitializations(const InitializedEntity &Entity, 351cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, 352cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool &RequiresSecondPass) { 3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((ILE->getType() != SemaRef.Context.VoidTy) && 354930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor "Should not have void type"); 35587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 35687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (ILE->getSyntacticForm()) 35787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor Loc = ILE->getSyntacticForm()->getSourceRange().getBegin(); 3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3596217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) { 360d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion() && 361d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->getInitializedFieldInUnion()) 362d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(0, ILE->getInitializedFieldInUnion(), 363d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Entity, ILE, RequiresSecondPass); 364d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor else { 365d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned Init = 0; 366d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor for (RecordDecl::field_iterator 367d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field = RType->getDecl()->field_begin(), 368d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FieldEnd = RType->getDecl()->field_end(); 369d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field != FieldEnd; ++Field) { 370d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->isUnnamedBitfield()) 371d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor continue; 372d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 373d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 37487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 37587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 376d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(Init, *Field, Entity, ILE, RequiresSecondPass); 377d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 378cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 379cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 380d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ++Init; 381d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 382d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Only look at the first initialization of a union. 383d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion()) 384d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor break; 385d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 3864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 3874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 3891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType ElementType; 3921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 393cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializedEntity ElementEntity = Entity; 39487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumInits = ILE->getNumInits(); 39587fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumElements = NumInits; 3960820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) { 3974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = AType->getElementType(); 39887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) 39987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = CAType->getSize().getZExtValue(); 400dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 401cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 402183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) { 4034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = VType->getElementType(); 40487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = VType->getNumElements(); 405dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 406cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 4071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else 4084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = ILE->getType(); 4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 410dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 41187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor for (unsigned Init = 0; Init != NumElements; ++Init) { 41216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (hadError) 41316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return; 41416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 415d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement || 416d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson ElementEntity.getKind() == InitializedEntity::EK_VectorElement) 417cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity.setElementIndex(Init); 418cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 41921f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis Expr *InitExpr = (Init < NumInits ? ILE->getInit(Init) : 0); 42021f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis if (!InitExpr && !ILE->hasArrayFiller()) { 421cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 422cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor true); 423cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationSequence InitSeq(SemaRef, ElementEntity, Kind, 0, 0); 424cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!InitSeq) { 425cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitSeq.Diagnose(SemaRef, ElementEntity, Kind, 0, 0); 42687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor hadError = true; 42787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 42887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 42987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 43060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult ElementInit 431f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall = InitSeq.Perform(SemaRef, ElementEntity, Kind, MultiExprArg()); 432cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (ElementInit.isInvalid()) { 43316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor hadError = true; 434cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 435cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 436cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 437cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (hadError) { 438cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Do nothing 439cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (Init < NumInits) { 4403e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis // For arrays, just set the expression used for value-initialization 4413e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis // of the "holes" in the array. 4423e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) 4433e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis ILE->setArrayFiller(ElementInit.takeAs<Expr>()); 4443e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis else 4453e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis ILE->setInit(Init, ElementInit.takeAs<Expr>()); 4464423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } else { 4474423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // For arrays, just set the expression used for value-initialization 4484423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // of the rest of elements and exit. 4494423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) { 4504423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis ILE->setArrayFiller(ElementInit.takeAs<Expr>()); 4514423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis return; 4524423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 4534423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis 4547491c499e826682e128a400038361ebcbde30eecSebastian Redl if (InitSeq.isConstructorInitialization()) { 4554423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // Value-initialization requires a constructor call, so 4564423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // extend the initializer list to include the constructor 4574423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // call and make a note that we'll need to take another pass 4584423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // through the initializer list. 4594423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis ILE->updateInit(SemaRef.Context, Init, ElementInit.takeAs<Expr>()); 4604423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis RequiresSecondPass = true; 4614423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 462cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 463ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else if (InitListExpr *InnerILE 46421f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis = dyn_cast_or_null<InitListExpr>(InitExpr)) 465cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(ElementEntity, InnerILE, RequiresSecondPass); 4664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 4674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 4684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 46968355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 470cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity, 47114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr *IL, QualType &T, 472c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl bool VerifyOnly, bool AllowBraceElision) 473c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl : SemaRef(S), VerifyOnly(VerifyOnly), AllowBraceElision(AllowBraceElision) { 4740cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff hadError = false; 475c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 476b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman unsigned newIndex = 0; 4774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FullyStructuredList 479ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor = getStructuredSubobjectInit(IL, newIndex, T, 0, 0, IL->getSourceRange()); 480dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckExplicitInitList(Entity, IL, T, newIndex, 48146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson FullyStructuredList, newStructuredIndex, 482eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor /*TopLevelObject=*/true); 483c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 48414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!hadError && !VerifyOnly) { 485cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool RequiresSecondPass = false; 486cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, RequiresSecondPass); 48716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (RequiresSecondPass && !hadError) 488dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FillInValueInitializations(Entity, FullyStructuredList, 489cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass); 490cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 4910cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4920cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4930cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numArrayElements(QualType DeclType) { 494638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // FIXME: use a proper constant 495638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman int maxElements = 0x7FFFFFFF; 496c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = 4970820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 4980cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = static_cast<int>(CAT->getSize().getZExtValue()); 4990cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 5000cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return maxElements; 5010cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5020cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5030cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numStructUnionElements(QualType DeclType) { 5046217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl(); 5054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor int InitializableMembers = 0; 5061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (RecordDecl::field_iterator 50717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = structDecl->field_begin(), 50817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = structDecl->field_end(); 5094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Field != FieldEnd; ++Field) { 510d61db33331c264d6361283602b248a7423040597Douglas Gregor if (!Field->isUnnamedBitfield()) 5114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++InitializableMembers; 5124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 51339ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (structDecl->isUnion()) 514f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return std::min(InitializableMembers, 1); 515f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return InitializableMembers - structDecl->hasFlexibleArrayMember(); 5160cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5170cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5188ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity, 519987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, 5204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType T, unsigned &Index, 5214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 522629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman unsigned &StructuredIndex) { 5230cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff int maxElements = 0; 5241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5250cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (T->isArrayType()) 5260cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numArrayElements(T); 527fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor else if (T->isRecordType()) 5280cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numStructUnionElements(T); 529b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman else if (T->isVectorType()) 530183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall maxElements = T->getAs<VectorType>()->getNumElements(); 5310cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else 532b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("CheckImplicitInitList(): Illegal type"); 533b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 534402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman if (maxElements == 0) { 53514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 53614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(ParentIList->getInit(Index)->getLocStart(), 53714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_implicit_empty_initializer); 5384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 539402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman hadError = true; 540402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman return; 541402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman } 542402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman 5434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Build a structured initializer list corresponding to this subobject. 5444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredSubobjectInitList 5451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList, 5461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredIndex, 547ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor SourceRange(ParentIList->getInit(Index)->getSourceRange().getBegin(), 548ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor ParentIList->getSourceRange().getEnd())); 5494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredSubobjectInitIndex = 0; 5504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 5514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Check the element types and build the structural subobject. 55287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned StartIndex = Index; 553dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, ParentIList, T, 554987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 5551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredSubobjectInitList, 556629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman StructuredSubobjectInitIndex); 557c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl 558c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl if (VerifyOnly) { 559c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl if (!AllowBraceElision && (T->isArrayType() || T->isRecordType())) 560c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl hadError = true; 561c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl } else { 56214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->setType(T); 56314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 564c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1); 56514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Update the structured sub-object initializer so that it's ending 56614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // range corresponds with the end of the last initializer it used. 56714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (EndIndex < ParentIList->getNumInits()) { 56814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SourceLocation EndLoc 56914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl = ParentIList->getInit(EndIndex)->getSourceRange().getEnd(); 57014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->setRBraceLoc(EndLoc); 57114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 57214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 573c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl // Complain about missing braces. 57414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (T->isArrayType() || T->isRecordType()) { 57514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), 576c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl AllowBraceElision ? diag::warn_missing_braces : 577c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl diag::err_missing_braces) 57814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << StructuredSubobjectInitList->getSourceRange() 57914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << FixItHint::CreateInsertion( 58014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->getLocStart(), "{") 58114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << FixItHint::CreateInsertion( 58214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.PP.getLocForEndOfToken( 583dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi StructuredSubobjectInitList->getLocEnd()), 58414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl "}"); 585c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl if (!AllowBraceElision) 586c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl hadError = true; 58714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 5881e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner } 5890cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5900cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5918ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, 59246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 5934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 595eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 596eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 597c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman assert(IList->isExplicit() && "Illegal Implicit InitListExpr"); 59814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 59914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SyntacticToSemantic[IList] = StructuredList; 60014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setSyntacticForm(IList); 60114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 602dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true, 60346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson Index, StructuredList, StructuredIndex, TopLevelObject); 60414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 60514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl QualType ExprTy = T.getNonLValueExprType(SemaRef.Context); 60614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->setType(ExprTy); 60714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setType(ExprTy); 60814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 609638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (hadError) 610638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 611c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 612638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (Index < IList->getNumInits()) { 613c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman // We have leftover initializers 61414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 61514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (SemaRef.getLangOptions().CPlusPlus || 61614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl (SemaRef.getLangOptions().OpenCL && 61714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->getType()->isVectorType())) { 61814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 61914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 62014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 62114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 62214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 623e540858b289b23653bcb23646f135729203635cbEli Friedman if (StructuredIndex == 1 && 624e540858b289b23653bcb23646f135729203635cbEli Friedman IsStringInit(StructuredList->getInit(0), T, SemaRef.Context)) { 6257c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers_in_char_array_initializer; 626e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 6277c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor DK = diag::err_excess_initializers_in_char_array_initializer; 628e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 629e540858b289b23653bcb23646f135729203635cbEli Friedman } 630bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman // Special-case 6310820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 632dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getInit(Index)->getSourceRange(); 633d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman } else if (!T->isIncompleteType()) { 634b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // Don't complain for incomplete types, since we'll get an error 635b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // elsewhere 636eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType CurrentObjectType = StructuredList->getType(); 6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int initKind = 638eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isArrayType()? 0 : 639eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isVectorType()? 1 : 640eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isScalarType()? 2 : 641eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isUnionType()? 3 : 642eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 4; 6437c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 6447c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers; 645e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 646e540858b289b23653bcb23646f135729203635cbEli Friedman DK = diag::err_excess_initializers; 6470863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman hadError = true; 6480863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman } 6490863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman if (SemaRef.getLangOptions().OpenCL && initKind == 1) { 6500863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman DK = diag::err_excess_initializers; 651e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 652e540858b289b23653bcb23646f135729203635cbEli Friedman } 6537c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 6540820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 655eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << initKind << IList->getInit(Index)->getSourceRange(); 656c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 657c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 658cda25a977e4b7fe4e080b87586410eaeab7b62f6Eli Friedman 65914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && T->isScalarType() && IList->getNumInits() == 1 && 66014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !TopLevelObject) 6610820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::warn_braces_around_scalar_init) 662a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor << IList->getSourceRange() 663849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocStart()) 664849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocEnd()); 6650cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6660cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6678ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckListElementTypes(const InitializedEntity &Entity, 66846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &DeclType, 67087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool SubobjectIsDesignatorContext, 6714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 6724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 673eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 674eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 6750c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman if (DeclType->isAnyComplexType() && SubobjectIsDesignatorContext) { 6760c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // Explicitly braced initializer for complex type can be real+imaginary 6770c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // parts. 6780c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman CheckComplexType(Entity, IList, DeclType, Index, 6790c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredList, StructuredIndex); 6800c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else if (DeclType->isScalarType()) { 68146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, DeclType, Index, 68246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 683c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (DeclType->isVectorType()) { 684dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckVectorType(Entity, IList, DeclType, Index, 68546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 686d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor } else if (DeclType->isAggregateType()) { 687d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor if (DeclType->isRecordType()) { 6886217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 6892bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson CheckStructUnionTypes(Entity, IList, DeclType, RD->field_begin(), 6904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubobjectIsDesignatorContext, Index, 691eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 692eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 69387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } else if (DeclType->isArrayType()) { 694f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor llvm::APSInt Zero( 6950820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()), 696f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor false); 697dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckArrayType(Entity, IList, DeclType, Zero, 698784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson SubobjectIsDesignatorContext, Index, 6994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 700ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else 701b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Aggregate that isn't a structure or array?!"); 702613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff } else if (DeclType->isVoidType() || DeclType->isFunctionType()) { 703613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff // This type is invalid, issue a diagnostic. 7044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 70514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 70614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 70714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 708d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman hadError = true; 709930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isRecordType()) { 710930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init]p14: 711930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] If the class is an aggregate (8.5.1), and the initializer 712930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // is a brace-enclosed list, see 8.5.1. 713930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 714930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Note: 8.5.1 is handled below; here, we diagnose the case where 715930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // we have an initializer list and a destination type that is not 716930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an aggregate. 717930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // FIXME: In C++0x, this is yet another form of initialization. 71814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 71914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 72014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType << IList->getSourceRange(); 721930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 722930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isReferenceType()) { 7238ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, DeclType, Index, 7248ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 725c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall } else if (DeclType->isObjCObjectType()) { 72614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 72714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_init_objc_class) 72814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 7294d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 7300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } else { 73114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 73214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 73314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 7344d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 7350cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 7360cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 7370cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 7388ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckSubElementType(const InitializedEntity &Entity, 73946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 7401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElemType, 7414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 7424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 7434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 7446fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 745c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) { 746c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman unsigned newIndex = 0; 7474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 7481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *newStructuredList 7494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor = getStructuredSubobjectInit(IList, Index, ElemType, 7504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex, 7514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubInitList->getSourceRange()); 75246f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckExplicitInitList(Entity, SubInitList, ElemType, newIndex, 7534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor newStructuredList, newStructuredIndex); 7544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 7554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 756fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 757c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (ElemType->isScalarType()) { 758fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return CheckScalarType(Entity, IList, ElemType, Index, 759fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredList, StructuredIndex); 760930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (ElemType->isReferenceType()) { 761fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return CheckReferenceType(Entity, IList, ElemType, Index, 762fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredList, StructuredIndex); 763fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 764930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 765fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (const ArrayType *arrayType = SemaRef.Context.getAsArrayType(ElemType)) { 766fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // arrayType can be incomplete if we're initializing a flexible 767fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // array member. There's nothing we can do with the completed 768fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // type here, though. 769930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 770fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (Expr *Str = IsStringInit(expr, arrayType, SemaRef.Context)) { 7718a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman if (!VerifyOnly) { 7728a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman CheckStringInit(Str, ElemType, arrayType, SemaRef); 7738a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 7748a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman } 775fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 776fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 777930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 778930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 779fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization. 780fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 781fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else if (SemaRef.getLangOptions().CPlusPlus) { 782930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 783fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // All implicit type conversions (clause 4) are considered when 7845d3d41d0873d51b405972baf38e1f3a7ef5b49e0Sebastian Redl // initializing the aggregate member with an initializer from 785fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // an initializer-list. If the initializer can initialize a 786fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // member, the member is initialized. [...] 787fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 788fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // FIXME: Better EqualLoc? 789fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationKind Kind = 790fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationKind::CreateCopy(expr->getLocStart(), SourceLocation()); 791fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationSequence Seq(SemaRef, Entity, Kind, &expr, 1); 792fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 793fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (Seq) { 79414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 79514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ExprResult Result = 79614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Seq.Perform(SemaRef, Entity, Kind, MultiExprArg(&expr, 1)); 79714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (Result.isInvalid()) 79814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 79914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 80014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, 80114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Result.takeAs<Expr>()); 80214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 803fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 804fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 805fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 806fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 807fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization 808fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else { 809fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // C99 6.7.8p13: 8101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 811fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // The initializer for a structure or union object that has 812fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // automatic storage duration shall be either an initializer 813fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // list as described below, or a single expression that has 814fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // compatible structure or union type. In the latter case, the 815fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // initial value of the object, including unnamed members, is 816fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // that of the expression. 817429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult ExprRes = SemaRef.Owned(expr); 818fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if ((ElemType->isRecordType() || ElemType->isVectorType()) && 81914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.CheckSingleAssignmentConstraints(ElemType, ExprRes, 82014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !VerifyOnly) 821fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall == Sema::Compatible) { 822429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (ExprRes.isInvalid()) 823429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley hadError = true; 824429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley else { 825429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes = SemaRef.DefaultFunctionArrayLvalueConversion(ExprRes.take()); 826429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (ExprRes.isInvalid()) 827429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley hadError = true; 828429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 829429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley UpdateStructuredListElement(StructuredList, StructuredIndex, 830429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes.takeAs<Expr>()); 831930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 832fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 833930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 834429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes.release(); 835fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization 836fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 837fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 838fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // C++ [dcl.init.aggr]p12: 839fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // 840fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // [...] Otherwise, if the member is itself a non-empty 841fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // subaggregate, brace elision is assumed and the initializer is 842fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // considered for the initialization of the first member of 843fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // the subaggregate. 84461b4bc80e943578ae855810918a1dc9697dbd15bTanya Lattner if (!SemaRef.getLangOptions().OpenCL && 84561b4bc80e943578ae855810918a1dc9697dbd15bTanya Lattner (ElemType->isAggregateType() || ElemType->isVectorType())) { 846fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList, 847fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredIndex); 848fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++StructuredIndex; 849fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else { 85014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 85114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // We cannot initialize this element, so let 85214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // PerformCopyInitialization produce the appropriate diagnostic. 85314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.PerformCopyInitialization(Entity, SourceLocation(), 85414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Owned(expr), 85514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl /*TopLevelOfInitList=*/true); 85614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 857fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall hadError = true; 858fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 859fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++StructuredIndex; 860930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 861b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman} 862b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 8630c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedmanvoid InitListChecker::CheckComplexType(const InitializedEntity &Entity, 8640c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *IList, QualType DeclType, 8650c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &Index, 8660c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *StructuredList, 8670c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &StructuredIndex) { 8680c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman assert(Index == 0 && "Index in explicit init list must be zero"); 8690c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8700c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // As an extension, clang supports complex initializers, which initialize 8710c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // a complex number component-wise. When an explicit initializer list for 8720c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // a complex number contains two two initializers, this extension kicks in: 8730c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // it exepcts the initializer list to contain two elements convertible to 8740c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // the element type of the complex type. The first element initializes 8750c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // the real part, and the second element intitializes the imaginary part. 8760c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8770c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman if (IList->getNumInits() != 2) 8780c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman return CheckScalarType(Entity, IList, DeclType, Index, StructuredList, 8790c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredIndex); 8800c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8810c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // This is an extension in C. (The builtin _Complex type does not exist 8820c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // in the C++ standard.) 88314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.getLangOptions().CPlusPlus && !VerifyOnly) 8840c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman SemaRef.Diag(IList->getLocStart(), diag::ext_complex_component_init) 8850c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman << IList->getSourceRange(); 8860c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8870c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // Initialize the complex number. 8880c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman QualType elementType = DeclType->getAs<ComplexType>()->getElementType(); 8890c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitializedEntity ElementEntity = 8900c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 8910c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8920c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman for (unsigned i = 0; i < 2; ++i) { 8930c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman ElementEntity.setElementIndex(Index); 8940c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman CheckSubElementType(ElementEntity, IList, elementType, Index, 8950c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredList, StructuredIndex); 8960c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } 8970c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman} 8980c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8990c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 9008ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckScalarType(const InitializedEntity &Entity, 90146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 9026fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned &Index, 9034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 9044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 905b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Index >= IList->getNumInits()) { 9066b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith if (!VerifyOnly) 9076b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith SemaRef.Diag(IList->getLocStart(), 9086b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith SemaRef.getLangOptions().CPlusPlus0x ? 9096b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith diag::warn_cxx98_compat_empty_scalar_initializer : 9106b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith diag::err_empty_scalar_initializer) 9116b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith << IList->getSourceRange(); 9126b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith hadError = !SemaRef.getLangOptions().CPlusPlus0x; 9134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 9144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 915bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 9160cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 917b934c2d77144471f35c5ebae9e925b056dac8112John McCall 918b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *expr = IList->getInit(Index); 919b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) { 92014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 92114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(SubIList->getLocStart(), 92214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::warn_many_braces_around_scalar_init) 92314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << SubIList->getSourceRange(); 924b934c2d77144471f35c5ebae9e925b056dac8112John McCall 925b934c2d77144471f35c5ebae9e925b056dac8112John McCall CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList, 926b934c2d77144471f35c5ebae9e925b056dac8112John McCall StructuredIndex); 927b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 928b934c2d77144471f35c5ebae9e925b056dac8112John McCall } else if (isa<DesignatedInitExpr>(expr)) { 92914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 93014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(expr->getSourceRange().getBegin(), 93114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_designator_for_scalar_init) 93214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType << expr->getSourceRange(); 933b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; 934b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 935b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 936b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 937b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 938b934c2d77144471f35c5ebae9e925b056dac8112John McCall 93914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 94014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.CanPerformCopyInitialization(Entity, SemaRef.Owned(expr))) 94114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 94214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 94314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 94414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 94514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 946b934c2d77144471f35c5ebae9e925b056dac8112John McCall ExprResult Result = 947b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 948191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin SemaRef.Owned(expr), 949191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin /*TopLevelOfInitList=*/true); 950b934c2d77144471f35c5ebae9e925b056dac8112John McCall 951b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *ResultExpr = 0; 952b934c2d77144471f35c5ebae9e925b056dac8112John McCall 953b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Result.isInvalid()) 954b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; // types weren't compatible. 955b934c2d77144471f35c5ebae9e925b056dac8112John McCall else { 956b934c2d77144471f35c5ebae9e925b056dac8112John McCall ResultExpr = Result.takeAs<Expr>(); 957dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 958b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (ResultExpr != expr) { 959b934c2d77144471f35c5ebae9e925b056dac8112John McCall // The type was promoted, update initializer list. 960b934c2d77144471f35c5ebae9e925b056dac8112John McCall IList->setInit(Index, ResultExpr); 961b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 962b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 963b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (hadError) 964b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 965b934c2d77144471f35c5ebae9e925b056dac8112John McCall else 966b934c2d77144471f35c5ebae9e925b056dac8112John McCall UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 967b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 9680cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 9690cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 9708ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckReferenceType(const InitializedEntity &Entity, 9718ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 972930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 973930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 974930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex) { 97514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (Index >= IList->getNumInits()) { 976390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: It would be wonderful if we could point at the actual member. In 977390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // general, it would be useful to pass location information down the stack, 978390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // so that we know the location (or decl) of the "current object" being 979390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // initialized. 98014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 98114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), 98214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_init_reference_member_uninitialized) 98314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType 98414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << IList->getSourceRange(); 985930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 986930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 987930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 988930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 989930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 99014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 99114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Expr *expr = IList->getInit(Index); 99213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (isa<InitListExpr>(expr) && !SemaRef.getLangOptions().CPlusPlus0x) { 99314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 99414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 99514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType << IList->getSourceRange(); 99614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 99714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 99814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++StructuredIndex; 99914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 100014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 100114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 100214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 100314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.CanPerformCopyInitialization(Entity, SemaRef.Owned(expr))) 100414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 100514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 100614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 100714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 100814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 100914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ExprResult Result = 101014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 101114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Owned(expr), 101214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl /*TopLevelOfInitList=*/true); 101314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 101414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (Result.isInvalid()) 101514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 101614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 101714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl expr = Result.takeAs<Expr>(); 101814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->setInit(Index, expr); 101914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 102014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (hadError) 102114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++StructuredIndex; 102214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 102314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 102414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 1025930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor} 1026930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 10278ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckVectorType(const InitializedEntity &Entity, 102846f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 10294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 10304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 10314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 103220e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *VT = DeclType->getAs<VectorType>(); 103320e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned maxElements = VT->getNumElements(); 103420e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numEltsInit = 0; 103520e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType elementType = VT->getElementType(); 103620e047abc5f19dc948436c0fb891450d9cd40667John McCall 10373ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Index >= IList->getNumInits()) { 10383ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Make sure the element type can be value-initialized. 10393ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 10403ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable( 10413ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity)); 10423ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl return; 10433ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 10443ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 104520e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!SemaRef.getLangOptions().OpenCL) { 104620e047abc5f19dc948436c0fb891450d9cd40667John McCall // If the initializing element is a vector, try to copy-initialize 104720e047abc5f19dc948436c0fb891450d9cd40667John McCall // instead of breaking it apart (which is doomed to failure anyway). 104820e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *Init = IList->getInit(Index); 104920e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) { 105014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 105114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.CanPerformCopyInitialization(Entity, SemaRef.Owned(Init))) 105214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 105314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 105414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 105514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 105614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 105720e047abc5f19dc948436c0fb891450d9cd40667John McCall ExprResult Result = 105820e047abc5f19dc948436c0fb891450d9cd40667John McCall SemaRef.PerformCopyInitialization(Entity, Init->getLocStart(), 1059191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin SemaRef.Owned(Init), 1060191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin /*TopLevelOfInitList=*/true); 106120e047abc5f19dc948436c0fb891450d9cd40667John McCall 106220e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *ResultExpr = 0; 106320e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Result.isInvalid()) 106420e047abc5f19dc948436c0fb891450d9cd40667John McCall hadError = true; // types weren't compatible. 106520e047abc5f19dc948436c0fb891450d9cd40667John McCall else { 106620e047abc5f19dc948436c0fb891450d9cd40667John McCall ResultExpr = Result.takeAs<Expr>(); 1067dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 106820e047abc5f19dc948436c0fb891450d9cd40667John McCall if (ResultExpr != Init) { 106920e047abc5f19dc948436c0fb891450d9cd40667John McCall // The type was promoted, update initializer list. 107020e047abc5f19dc948436c0fb891450d9cd40667John McCall IList->setInit(Index, ResultExpr); 10712ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 10722ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 107320e047abc5f19dc948436c0fb891450d9cd40667John McCall if (hadError) 107420e047abc5f19dc948436c0fb891450d9cd40667John McCall ++StructuredIndex; 107520e047abc5f19dc948436c0fb891450d9cd40667John McCall else 107614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, 107714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ResultExpr); 107820e047abc5f19dc948436c0fb891450d9cd40667John McCall ++Index; 107920e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 10800cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 10811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 108220e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 108320e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 1084dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 108520e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { 108620e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 10873ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Index >= IList->getNumInits()) { 10883ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 10893ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable(ElementEntity); 109020e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 10913ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 1092dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 109320e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 109420e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 109520e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 109620e047abc5f19dc948436c0fb891450d9cd40667John McCall } 109720e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 109820e047abc5f19dc948436c0fb891450d9cd40667John McCall } 109920e047abc5f19dc948436c0fb891450d9cd40667John McCall 110020e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 110120e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 1102dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 110320e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL initializers allows vectors to be constructed from vectors. 110420e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i) { 110520e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 110620e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Index >= IList->getNumInits()) 110720e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 1108dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 110920e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 111020e047abc5f19dc948436c0fb891450d9cd40667John McCall 111120e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType IType = IList->getInit(Index)->getType(); 111220e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!IType->isVectorType()) { 111320e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 111420e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 111520e047abc5f19dc948436c0fb891450d9cd40667John McCall ++numEltsInit; 111620e047abc5f19dc948436c0fb891450d9cd40667John McCall } else { 111720e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType VecType; 111820e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *IVT = IType->getAs<VectorType>(); 111920e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numIElts = IVT->getNumElements(); 1120dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 112120e047abc5f19dc948436c0fb891450d9cd40667John McCall if (IType->isExtVectorType()) 112220e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getExtVectorType(elementType, numIElts); 112320e047abc5f19dc948436c0fb891450d9cd40667John McCall else 112420e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getVectorType(elementType, numIElts, 1125e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson IVT->getVectorKind()); 112620e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, VecType, Index, 112720e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 112820e047abc5f19dc948436c0fb891450d9cd40667John McCall numEltsInit += numIElts; 112920e047abc5f19dc948436c0fb891450d9cd40667John McCall } 11300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 113120e047abc5f19dc948436c0fb891450d9cd40667John McCall 113220e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL requires all elements to be initialized. 11333ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (numEltsInit != maxElements) { 11343ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!VerifyOnly) 11353ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl SemaRef.Diag(IList->getSourceRange().getBegin(), 11363ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl diag::err_vector_incorrect_num_initializers) 11373ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl << (numEltsInit < maxElements) << maxElements << numEltsInit; 11383ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl hadError = true; 11393ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 11400cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 11410cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 11428ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckArrayType(const InitializedEntity &Entity, 1143784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 114487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt elementIndex, 11451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 11464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 11474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 11484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 1149ce6c9b7da219c8640a0559f75770cfc6622de083John McCall const ArrayType *arrayType = SemaRef.Context.getAsArrayType(DeclType); 1150ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 11510cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // Check for the special-case of initializing an array with a string. 11520cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 1153ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (Expr *Str = IsStringInit(IList->getInit(Index), arrayType, 115479e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner SemaRef.Context)) { 11554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We place the string literal directly into the resulting 11564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initializer list. This is the only place where the structure 11574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // of the structured initializer list doesn't match exactly, 11584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // because doing so would involve allocating one character 11594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // constant for each string. 116014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 11618a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman CheckStringInit(Str, DeclType, arrayType, SemaRef); 116214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 116314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->resizeInits(SemaRef.Context, StructuredIndex); 116414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 11650cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 11660cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return; 11670cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 11680cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1169ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) { 1170638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // Check for VLAs; in standard C it would be possible to check this 1171638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // earlier, but I don't know where clang accepts VLAs (gcc accepts 1172638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // them in all sorts of strange places). 117314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 117414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(VAT->getSizeExpr()->getLocStart(), 117514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_variable_object_no_init) 117614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << VAT->getSizeExpr()->getSourceRange(); 1177638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman hadError = true; 11784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 11794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 1180638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 1181638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman } 1182638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman 118305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We might know the maximum number of elements in advance. 11844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor llvm::APSInt maxElements(elementIndex.getBitWidth(), 11854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor elementIndex.isUnsigned()); 118605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool maxElementsKnown = false; 1187ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(arrayType)) { 118805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = CAT->getSize(); 11899f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth()); 1190e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 119105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElementsKnown = true; 119205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 119305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1194ce6c9b7da219c8640a0559f75770cfc6622de083John McCall QualType elementType = arrayType->getElementType(); 119505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 119605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 119705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 119887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 119987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 120087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 120187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 120287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 120387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 120487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. elementIndex will be 120587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // updated to be the next array element we'll initialize. 12069a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 12074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, 0, &elementIndex, Index, 1208eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, true, 1209eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) { 121005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 121187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor continue; 121287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 121387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 1214f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor if (elementIndex.getBitWidth() > maxElements.getBitWidth()) 12159f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad maxElements = maxElements.extend(elementIndex.getBitWidth()); 1216f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor else if (elementIndex.getBitWidth() < maxElements.getBitWidth()) 12179f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extend(maxElements.getBitWidth()); 1218e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 1219f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor 122087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If the array is of incomplete type, keep track of the number of 122187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // elements in the initializer. 122287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 122387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor maxElements = elementIndex; 122405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 122505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 122605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 122705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 122805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we know the maximum number of elements, and we've already 122905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // hit it, stop consuming elements in the initializer list. 123005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElementsKnown && elementIndex == maxElements) 12310cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff break; 123205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 12338ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 1234dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex, 12358ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson Entity); 12368ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Check this element. 12378ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 12388ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 123905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++elementIndex; 124005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 124105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If the array is of incomplete type, keep track of the number of 124205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // elements in the initializer. 124305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 124405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = elementIndex; 12450cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 124614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!hadError && DeclType->isIncompleteArrayType() && !VerifyOnly) { 12470cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // If this is an incomplete array type, the actual type needs to 1248396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // be calculated here. 1249e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned()); 125005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElements == Zero) { 1251396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // Sizing an array implicitly to zero is not allowed by ISO C, 1252396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // but is supported by GNU. 12530820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 1254396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar diag::ext_typecheck_zero_array_size); 12550cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1256396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar 12571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements, 1258396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar ArrayType::Normal, 0); 12590cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 12603ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!hadError && VerifyOnly) { 12613ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Check if there are any members of the array that get value-initialized. 12623ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // If so, check if doing that is possible. 12633ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // FIXME: This needs to detect holes left by designated initializers too. 12643ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (maxElementsKnown && elementIndex < maxElements) 12653ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable(InitializedEntity::InitializeElement( 12663ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl SemaRef.Context, 0, Entity)); 12673ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 12680cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 12690cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1270f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedmanbool InitListChecker::CheckFlexibleArrayInit(const InitializedEntity &Entity, 1271f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman Expr *InitExpr, 1272f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FieldDecl *Field, 1273f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool TopLevelObject) { 1274f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Handle GNU flexible array initializers. 1275f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman unsigned FlexArrayDiag; 1276f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman if (isa<InitListExpr>(InitExpr) && 1277f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman cast<InitListExpr>(InitExpr)->getNumInits() == 0) { 1278f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Empty flexible array init always allowed as an extension 1279f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::ext_flexible_array_init; 1280f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (SemaRef.getLangOptions().CPlusPlus) { 1281f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init in C++; it is not required for gcc 1282f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // compatibility, and it needs work to IRGen correctly in general. 1283f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1284f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (!TopLevelObject) { 1285f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on non-top-level object 1286f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1287f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (Entity.getKind() != InitializedEntity::EK_Variable) { 1288f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on anything which is not a variable. 1289f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1290f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (cast<VarDecl>(Entity.getDecl())->hasLocalStorage()) { 1291f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on local variables. 1292f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1293f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else { 1294f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Allow other cases. 1295f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::ext_flexible_array_init; 1296f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } 129714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 129814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 129914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(InitExpr->getSourceRange().getBegin(), 130014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl FlexArrayDiag) 130114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << InitExpr->getSourceRange().getBegin(); 130214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 130314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << Field; 130414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1305f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman 1306f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman return FlexArrayDiag != diag::ext_flexible_array_init; 1307f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman} 1308f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman 13098ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, 13102bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, 13111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType DeclType, 131287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator Field, 13131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 13144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 13154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 1316eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 1317eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 13186217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl* structDecl = DeclType->getAs<RecordType>()->getDecl(); 13191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1320b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // If the record is invalid, some of it's members are invalid. To avoid 1321b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // confusion, we forgo checking the intializer for the entire record. 1322b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman if (structDecl->isInvalidDecl()) { 1323b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman hadError = true; 1324b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman return; 13251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 13263498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 13273498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (DeclType->isUnionType() && IList->getNumInits() == 0) { 13283ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Value-initialize the first named member of the union. 13293ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 13303ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl for (RecordDecl::field_iterator FieldEnd = RD->field_end(); 13313ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl Field != FieldEnd; ++Field) { 13323ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Field->getDeclName()) { 13333ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 13343ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable( 13353ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializedEntity::InitializeMember(*Field, &Entity)); 13363ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl else 133714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setInitializedFieldInUnion(*Field); 13383ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl break; 13393498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 13403498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 13413498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return; 13423498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 13433498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 134405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If structDecl is a forward declaration, this loop won't do 134505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // anything except look at designated initializers; That's okay, 134605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // because an error should get printed out elsewhere. It might be 134705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // worthwhile to skip over the rest of the initializer, though. 13486217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 134917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RecordDecl::field_iterator FieldEnd = RD->field_end(); 1350dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor bool InitializedSomething = false; 135180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall bool CheckForMissingFields = true; 135205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 135305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 135405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 135505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 135687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 135787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 135887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 135987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 136087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 136187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 136287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. Field will be updated to 136387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the next field that we'll be initializing. 13649a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 13654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, &Field, 0, Index, 1366eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 1367eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, TopLevelObject)) 136805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 136905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1370dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 137180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 137280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Disable check for missing fields when designators are used. 137380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // This matches gcc behaviour. 137480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall CheckForMissingFields = false; 137505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 137605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 137705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 137805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field == FieldEnd) { 137905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We've run out of fields. We're done. 138044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor break; 138105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 138244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1383dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor // We've already initialized a member of a union. We're done. 1384dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor if (InitializedSomething && DeclType->isUnionType()) 1385dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor break; 1386dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor 138705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we've hit the flexible array member at the end, we're done. 138805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field->getType()->isIncompleteArrayType()) 1389b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman break; 139044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 13910bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (Field->isUnnamedBitfield()) { 13924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Don't initialize unnamed bitfields, e.g. "int : 20;" 139305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 1394b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman continue; 13950cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 139644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 139754001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor // Make sure we can use this declaration. 139814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool InvalidUse; 139914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 140014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InvalidUse = !SemaRef.CanUseDecl(*Field); 140114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 140214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, 140314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->getInit(Index)->getLocStart()); 140414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (InvalidUse) { 140554001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Index; 140654001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Field; 140754001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor hadError = true; 140854001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor continue; 140914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 141054001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor 14118ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 14128ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 14138ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 14148ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 1415dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 14160bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 141714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (DeclType->isUnionType() && !VerifyOnly) { 14180bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor // Initialize the first field within the union. 14190bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 14200bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 142105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 142205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 14230cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 142444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 142580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Emit warnings for missing struct field initializers. 142614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && InitializedSomething && CheckForMissingFields && 142714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Field != FieldEnd && !Field->getType()->isIncompleteArrayType() && 142814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !DeclType->isUnionType()) { 142980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // It is possible we have one or more unnamed bitfields remaining. 143080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Find first (if any) named field and emit warning. 143180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall for (RecordDecl::field_iterator it = Field, end = RD->field_end(); 143280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall it != end; ++it) { 143380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall if (!it->isUnnamedBitfield()) { 143480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall SemaRef.Diag(IList->getSourceRange().getEnd(), 143580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall diag::warn_missing_field_initializers) << it->getName(); 143680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall break; 143780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 143880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 143980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 144080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 14413ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Check that any remaining fields can be value-initialized. 14423ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly && Field != FieldEnd && !DeclType->isUnionType() && 14433ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl !Field->getType()->isIncompleteArrayType()) { 14443ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // FIXME: Should check for holes left by designated initializers too. 14453ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl for (; Field != FieldEnd && !hadError; ++Field) { 14463ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!Field->isUnnamedBitfield()) 14473ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable( 14483ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializedEntity::InitializeMember(*Field, &Entity)); 14493ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 14503ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 14513ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 14521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() || 1453a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor Index >= IList->getNumInits()) 1454eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return; 1455eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1456f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman if (CheckFlexibleArrayInit(Entity, IList->getInit(Index), *Field, 1457f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman TopLevelObject)) { 1458eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor hadError = true; 1459a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor ++Index; 1460a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor return; 1461eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1462eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 14638ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 14648ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1465dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 14668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (isa<InitListExpr>(IList->getInit(Index))) 1467dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 14688ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 14698ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson else 1470dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index, 1471987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson StructuredList, StructuredIndex); 14720cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 14730cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1474ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Expand a field designator that refers to a member of an 1475ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// anonymous struct or union into a series of field designators that 1476ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// refers to the field within the appropriate subobject. 1477ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// 1478ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorstatic void ExpandAnonymousFieldDesignator(Sema &SemaRef, 14791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 14801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned DesigIdx, 1481a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IndirectFieldDecl *IndirectField) { 1482ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor typedef DesignatedInitExpr::Designator Designator; 1483ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1484ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the replacement designators. 14855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Designator, 4> Replacements; 1486a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(), 1487a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet PE = IndirectField->chain_end(); PI != PE; ++PI) { 1488a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (PI + 1 == PE) 14891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Replacements.push_back(Designator((IdentifierInfo *)0, 1490ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getDotLoc(), 1491ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getFieldLoc())); 1492ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor else 1493ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.push_back(Designator((IdentifierInfo *)0, SourceLocation(), 1494ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SourceLocation())); 1495a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(isa<FieldDecl>(*PI)); 1496a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Replacements.back().setField(cast<FieldDecl>(*PI)); 1497ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1498ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1499ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Expand the current designator into the set of replacement 1500ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // designators, so we have a full subobject path down to where the 1501ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // member of the anonymous struct/union is actually stored. 1502319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0], 1503ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor &Replacements[0] + Replacements.size()); 1504a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet} 15051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1506dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Given an implicit anonymous field, search the IndirectField that 1507a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet/// corresponds to FieldName. 1508a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichetstatic IndirectFieldDecl *FindIndirectFieldDesignator(FieldDecl *AnonField, 1509a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IdentifierInfo *FieldName) { 1510a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(AnonField->isAnonymousStructOrUnion()); 1511a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Decl *NextDecl = AnonField->getNextDeclInContext(); 1512a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet while (IndirectFieldDecl *IF = dyn_cast<IndirectFieldDecl>(NextDecl)) { 1513a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (FieldName && FieldName == IF->getAnonField()->getIdentifier()) 1514a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet return IF; 1515a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet NextDecl = NextDecl->getNextDeclInContext(); 1516ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1517a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet return 0; 1518ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 1519ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 152014b0c194b356a1204d081765b3e6699687bed97cSebastian Redlstatic DesignatedInitExpr *CloneDesignatedInitExpr(Sema &SemaRef, 152114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr *DIE) { 152214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned NumIndexExprs = DIE->getNumSubExprs() - 1; 152314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SmallVector<Expr*, 4> IndexExprs(NumIndexExprs); 152414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl for (unsigned I = 0; I < NumIndexExprs; ++I) 152514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IndexExprs[I] = DIE->getSubExpr(I + 1); 152614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return DesignatedInitExpr::Create(SemaRef.Context, DIE->designators_begin(), 152714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->size(), IndexExprs.data(), 152814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl NumIndexExprs, DIE->getEqualOrColonLoc(), 152914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->usesGNUSyntax(), DIE->getInit()); 153014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl} 153114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 153205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Check the well-formedness of a C99 designated initializer. 153305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 153405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Determines whether the designated initializer @p DIE, which 153505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// resides at the given @p Index within the initializer list @p 153605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// IList, is well-formed for a current object of type @p DeclType 153705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// (C99 6.7.8). The actual subobject that this designator refers to 15381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// within the current subobject is returned in either 15394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @p NextField or @p NextElementIndex (whichever is appropriate). 154005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 154105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param IList The initializer list in which this designated 154205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// initializer occurs. 154305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 1544711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DIE The designated initializer expression. 1545711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// 1546711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DesigIdx The index of the current designator. 154705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 154805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param DeclType The type of the "current object" (C99 6.7.8p17), 154905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// into which the designation in @p DIE should refer. 155005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 155187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextField If non-NULL and the first designator in @p DIE is 155287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// a field, this will be set to the field declaration corresponding 155387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// to the field named by the designator. 155405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 155587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextElementIndex If non-NULL and the first designator in @p 155687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// DIE is an array designator or GNU array-range designator, this 155787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// will be set to the last index initialized by this designator. 155805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 155905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param Index Index into @p IList where the designated initializer 156005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @p DIE occurs. 156105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 15624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @param StructuredList The initializer list expression that 15634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// describes all of the subobject initializers in the order they'll 15644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// actually be initialized. 15654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 156605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @returns true if there was an error, false otherwise. 15671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 15688ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders CarlssonInitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 15699a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, 157014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr *DIE, 157114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned DesigIdx, 157214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl QualType &CurrentObjectType, 157314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl RecordDecl::field_iterator *NextField, 157414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl llvm::APSInt *NextElementIndex, 157514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned &Index, 157614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr *StructuredList, 157714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned &StructuredIndex, 1578eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 1579eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 1580711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if (DesigIdx == DIE->size()) { 158187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the actual initialization for the designated object type. 158287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 15836fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 15846fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Temporarily remove the designator expression from the 15856fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // initializer list that the child calls see, so that we don't try 15866fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // to re-process the designator. 15876fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned OldIndex = Index; 15886fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE->getInit()); 15896fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 15909a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson CheckSubElementType(Entity, IList, CurrentObjectType, Index, 15914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 15926fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 15936fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Restore the designated initializer expression in the syntactic 15946fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // form of the initializer list. 15956fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor if (IList->getInit(OldIndex) != DIE->getInit()) 15966fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor DIE->setInit(IList->getInit(OldIndex)); 15976fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE); 15986fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 159987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 160087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 160105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1602711997184366d584c9c437102cae1e9d9927b986Douglas Gregor DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx); 160314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool IsFirstDesignator = (DesigIdx == 0); 160414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 160514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert((IsFirstDesignator || StructuredList) && 160614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl "Need a non-designated initializer list to start from"); 160714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 160814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Determine the structural initializer list that corresponds to the 160914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // current subobject. 161014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList = IsFirstDesignator? SyntacticToSemantic[IList] 161114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl : getStructuredSubobjectInit(IList, Index, CurrentObjectType, 161214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList, StructuredIndex, 161314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SourceRange(D->getStartLocation(), 161414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->getSourceRange().getEnd())); 161514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert(StructuredList && "Expected a structured initializer list"); 161614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 16174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 161887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (D->isFieldDesignator()) { 161987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p7: 162087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 162187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 162287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 162387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // . identifier 162487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 162587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have 162687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // structure or union type and the identifier shall be the 16271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // name of a member of that type. 16286217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = CurrentObjectType->getAs<RecordType>(); 162987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!RT) { 163087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation Loc = D->getDotLoc(); 163187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (Loc.isInvalid()) 163287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Loc = D->getFieldLoc(); 163314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 163414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Loc, diag::err_field_designator_non_aggr) 163514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << SemaRef.getLangOptions().CPlusPlus << CurrentObjectType; 163687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 163787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 163887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 163987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 16404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Note: we perform a linear search of the fields here, despite 16414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the fact that we have a faster lookup method, because we always 16424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // need to compute the field's index. 1643ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *KnownField = D->getField(); 164487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IdentifierInfo *FieldName = D->getFieldName(); 16454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned FieldIndex = 0; 16461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator 164717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = RT->getDecl()->field_begin(), 164817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RT->getDecl()->field_end(); 16494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (; Field != FieldEnd; ++Field) { 16504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field->isUnnamedBitfield()) 16514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor continue; 1652dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1653a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet // If we find a field representing an anonymous field, look in the 1654a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet // IndirectFieldDecl that follow for the designated initializer. 1655a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (!KnownField && Field->isAnonymousStructOrUnion()) { 1656a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (IndirectFieldDecl *IF = 1657a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet FindIndirectFieldDesignator(*Field, FieldName)) { 165814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // In verify mode, don't modify the original. 165914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 166014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE = CloneDesignatedInitExpr(SemaRef, DIE); 1661a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IF); 1662a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet D = DIE->getDesignator(DesigIdx); 1663a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet break; 1664a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1665a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1666022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor if (KnownField && KnownField == *Field) 1667022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor break; 1668022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor if (FieldName && FieldName == Field->getIdentifier()) 16694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor break; 16704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 16714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 167287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 167387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 16744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field == FieldEnd) { 1675a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer if (VerifyOnly) { 1676a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer ++Index; 167714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return true; // No typo correction when just trying this out. 1678a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer } 167914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 1680ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // There was no normal field in the struct with the designated 1681ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // name. Perform another lookup for this name, which may find 1682ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // something that we can't designate (e.g., a member function), 1683ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // may find nothing, or may find a member of an anonymous 16841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // struct/union. 168517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName); 1686c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldDecl *ReplacementField = 0; 16874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Lookup.first == Lookup.second) { 1688c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Name lookup didn't find anything. Determine whether this 1689c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // was a typo for another field name. 1690dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi LookupResult R(SemaRef, FieldName, D->getFieldLoc(), 1691c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Sema::LookupMemberName); 1692d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor TypoCorrection Corrected = SemaRef.CorrectTypo( 1693d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor DeclarationNameInfo(FieldName, D->getFieldLoc()), 1694d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Sema::LookupMemberName, /*Scope=*/NULL, /*SS=*/NULL, 1695d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor RT->getDecl(), false, Sema::CTC_NoKeywords); 1696d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor if ((ReplacementField = Corrected.getCorrectionDeclAs<FieldDecl>()) && 16977a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl ReplacementField->getDeclContext()->getRedeclContext() 1698c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ->Equals(RT->getDecl())) { 1699d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor std::string CorrectedStr( 1700d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Corrected.getAsString(SemaRef.getLangOptions())); 1701d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor std::string CorrectedQuotedStr( 1702d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Corrected.getQuoted(SemaRef.getLangOptions())); 1703dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.Diag(D->getFieldLoc(), 1704c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor diag::err_field_designator_unknown_suggest) 1705d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << FieldName << CurrentObjectType << CorrectedQuotedStr 1706d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << FixItHint::CreateReplacement(D->getFieldLoc(), CorrectedStr); 1707dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.Diag(ReplacementField->getLocation(), 1708d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor diag::note_previous_decl) << CorrectedQuotedStr; 1709a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer hadError = true; 1710c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else { 1711c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown) 1712c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType; 1713c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++Index; 1714c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor return true; 1715c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1716c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1717dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1718c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!ReplacementField) { 17194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Name lookup found something, but it wasn't a field. 17200820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield) 17214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << FieldName; 17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag((*Lookup.first)->getLocation(), 17234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_field_designator_found); 1724ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman ++Index; 1725ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman return true; 1726ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1727c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1728a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (!KnownField) { 1729c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // The replacement field comes from typo correction; find it 1730c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // in the list of fields. 1731c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldIndex = 0; 1732c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field = RT->getDecl()->field_begin(); 1733c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor for (; Field != FieldEnd; ++Field) { 1734c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (Field->isUnnamedBitfield()) 1735c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor continue; 1736c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1737dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (ReplacementField == *Field || 1738c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field->getIdentifier() == ReplacementField->getIdentifier()) 1739c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor break; 1740c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1741c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++FieldIndex; 1742c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1743c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 174487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 17454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // All of the fields of a union are located at the same place in 17474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the initializer list. 17480bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (RT->getDecl()->isUnion()) { 17494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor FieldIndex = 0; 175014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 175114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setInitializedFieldInUnion(*Field); 17520bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 17534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 175454001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor // Make sure we can use this declaration. 175514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool InvalidUse; 175614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 175714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InvalidUse = !SemaRef.CanUseDecl(*Field); 175814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 175914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc()); 176014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (InvalidUse) { 176154001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Index; 176254001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor return true; 176314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 176454001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor 176514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 176614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Update the designator with the field declaration. 176714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl D->setField(*Field); 17681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 176914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Make sure that our non-designated initializer list has space 177014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // for a subobject corresponding to this field. 177114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (FieldIndex >= StructuredList->getNumInits()) 177214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1); 177314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 17744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1775eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // This designator names a flexible array member. 1776eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Field->getType()->isIncompleteArrayType()) { 1777eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool Invalid = false; 1778711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if ((DesigIdx + 1) != DIE->size()) { 1779eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // We can't designate an object within the flexible array 1780eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // member (because GCC doesn't allow it). 178114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 178214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr::Designator *NextD 178314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl = DIE->getDesignator(DesigIdx + 1); 178414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(NextD->getStartLocation(), 178514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_designator_into_flexible_array_member) 178614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << SourceRange(NextD->getStartLocation(), 178714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->getSourceRange().getEnd()); 178814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 178914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << *Field; 179014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1791eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1792eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1793eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 17949046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner if (!hadError && !isa<InitListExpr>(DIE->getInit()) && 17959046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner !isa<StringLiteral>(DIE->getInit())) { 1796eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // The initializer is not an initializer list. 179714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 179814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(DIE->getInit()->getSourceRange().getBegin(), 179914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_flexible_array_init_needs_braces) 180014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DIE->getInit()->getSourceRange(); 180114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 180214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << *Field; 180314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1804eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1805eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1806eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1807f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Check GNU flexible array initializer. 1808f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman if (!Invalid && CheckFlexibleArrayInit(Entity, DIE->getInit(), *Field, 1809f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman TopLevelObject)) 1810eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1811eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1812eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Invalid) { 1813eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Index; 1814eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1815eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1816eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1817eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Initialize the array. 1818eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool prevHadError = hadError; 1819eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1820eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned OldIndex = Index; 1821eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(Index, DIE->getInit()); 18228ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 18238ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 18248ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 18258ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 1826eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, newStructuredIndex); 18278ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 1828eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(OldIndex, DIE); 1829eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (hadError && !prevHadError) { 1830eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Field; 1831eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++FieldIndex; 1832eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (NextField) 1833eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor *NextField = Field; 1834eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredIndex = FieldIndex; 1835eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1836eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1837eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } else { 1838eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Recurse to check later designated subobjects. 1839eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType FieldType = (*Field)->getType(); 1840eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1841dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 18429a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity MemberEntity = 18438ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1844dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1, 1845dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FieldType, 0, 0, Index, 18469a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, newStructuredIndex, 1847eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, false)) 1848eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1849eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 185087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 185187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Find the position of the next field to be initialized in this 185287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // subobject. 185387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Field; 18544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 185505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 185687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 185787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this struct/class/union subobject. 185887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 185987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextField) 186087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor *NextField = Field; 18614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = FieldIndex; 186287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 186387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 186405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 186534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 186634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 186734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1868ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // We've already initialized something in the union; we're done. 1869ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (RT->getDecl()->isUnion()) 1870ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return hadError; 1871ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 187287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining fields within this class/struct/union subobject. 187387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 1874dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 18758ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckStructUnionTypes(Entity, IList, CurrentObjectType, Field, false, Index, 18764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, FieldIndex); 187787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 187887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 187905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 188087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p6: 188187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 188287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 188387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 188487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ] 188587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 188687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have array 188787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // type and the expression shall be an integer constant 188887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // expression. If the array is of unknown size, any 188987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // nonnegative value is valid. 189087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 189187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Additionally, cope with the GNU extension that permits 189287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designators of the form 189387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 189487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ... constant-expression ] 18950820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType); 189687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!AT) { 189714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 189814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array) 189914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << CurrentObjectType; 190087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 190187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 190287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 190305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 190487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Expr *IndexExpr = 0; 190534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor llvm::APSInt DesignatedStartIndex, DesignatedEndIndex; 190634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (D->isArrayDesignator()) { 190787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayIndex(*D); 1908a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DesignatedStartIndex = IndexExpr->EvaluateKnownConstInt(SemaRef.Context); 190934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex = DesignatedStartIndex; 191034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 191187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(D->isArrayRangeDesignator() && "Need array-range designator"); 19123bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 19131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedStartIndex = 1914a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DIE->getArrayRangeStart(*D)->EvaluateKnownConstInt(SemaRef.Context); 19151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedEndIndex = 1916a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DIE->getArrayRangeEnd(*D)->EvaluateKnownConstInt(SemaRef.Context); 191787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayRangeEnd(*D); 191834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1919e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // Codegen can't handle evaluating array range designators that have side 1920e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // effects, because we replicate the AST value for each initialized element. 1921e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // As such, set the sawArrayRangeDesignator() bit if we initialize multiple 1922e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // elements with something that has a side effect, so codegen can emit an 1923e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // "error unsupported" error instead of miscompiling the app. 1924e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&& 192514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->getInit()->HasSideEffects(SemaRef.Context) && !VerifyOnly) 1926a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor FullyStructuredList->sawArrayRangeDesignator(); 192787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 192805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 192987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (isa<ConstantArrayType>(AT)) { 193087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false); 19319f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 19329f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth()); 193334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned()); 19349f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 19359f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth()); 193634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned()); 193734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex >= MaxElements) { 1938a4e20e1e43df39e39328035c84c46fdcbbf3a01eEli Friedman if (!VerifyOnly) 193914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IndexExpr->getSourceRange().getBegin(), 194014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_array_designator_too_large) 194114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DesignatedEndIndex.toString(10) << MaxElements.toString(10) 194214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << IndexExpr->getSourceRange(); 194387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 194487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 194505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 194634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 194734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Make sure the bit-widths and signedness match. 194834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedStartIndex.getBitWidth() > DesignatedEndIndex.getBitWidth()) 19499f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 19509f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extend(DesignatedStartIndex.getBitWidth()); 19513bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner else if (DesignatedStartIndex.getBitWidth() < 19523bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedEndIndex.getBitWidth()) 19539f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 19549f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extend(DesignatedEndIndex.getBitWidth()); 195534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(true); 195634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(true); 195705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 19581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 19604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this array element. 196114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && 196214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits()) 19631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredList->resizeInits(SemaRef.Context, 196434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.getZExtValue() + 1); 196534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 196634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Repeatedly perform subobject initializations in the range 196734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // [DesignatedStartIndex, DesignatedEndIndex]. 196834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 196934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next designator 197034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned ElementIndex = DesignatedStartIndex.getZExtValue(); 197134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned OldIndex = Index; 1972dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 19739a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity ElementEntity = 19748ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 19759a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 197634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor while (DesignatedStartIndex <= DesignatedEndIndex) { 197734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Recurse to check later designated subobjects. 197834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor QualType ElementType = AT->getElementType(); 197934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor Index = OldIndex; 1980dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 19819a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementEntity.setElementIndex(ElementIndex); 1982dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(ElementEntity, IList, DIE, DesigIdx + 1, 1983dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementType, 0, 0, Index, 19849a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, ElementIndex, 1985eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor (DesignatedStartIndex == DesignatedEndIndex), 1986eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) 198734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return true; 198887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 198934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next index in the array that we'll be initializing. 199034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ++DesignatedStartIndex; 199134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ElementIndex = DesignatedStartIndex.getZExtValue(); 199234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } 199387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 199487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 199587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this array subobject. 199687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 199787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextElementIndex) 199834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor *NextElementIndex = DesignatedStartIndex; 19994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = ElementIndex; 200087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 200187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 20021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 200334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 200434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 200534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 200687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining elements within this array subobject. 200705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool prevHadError = hadError; 2008dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex, 2009784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 20104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, ElementIndex); 20111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return hadError && !prevHadError; 201205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 201305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 20144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// Get the structured initializer list for a subobject of type 20154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// @p CurrentObjectType. 20164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListExpr * 20174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 20184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType CurrentObjectType, 20194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 20204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredIndex, 20214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange InitRange) { 202214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 202314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return 0; // No structured list in verification-only mode. 20244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *ExistingInit = 0; 20254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 20264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = SyntacticToSemantic[IList]; 20274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else if (StructuredIndex < StructuredList->getNumInits()) 20284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = StructuredList->getInit(StructuredIndex); 20291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit)) 20314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 20324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 20334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (ExistingInit) { 20344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We are creating an initializer list that initializes the 20354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobjects of the current object, but there was already an 20364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initialization that completely initialized the current 20374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject, e.g., by a compound literal: 20381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 20394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X { int a, b; }; 20404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 }; 20411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 20424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Here, xs[0].a == 0 and xs[0].b == 3, since the second, 20434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // designated initializer re-initializes the whole 20444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject [0], overwriting previous initializers. 20451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(InitRange.getBegin(), 2046ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor diag::warn_subobject_initializer_overrides) 20474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << InitRange; 20481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(ExistingInit->getSourceRange().getBegin(), 20494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 205054f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 20514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << ExistingInit->getSourceRange(); 20524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 20534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 20541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *Result 2055709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek = new (SemaRef.Context) InitListExpr(SemaRef.Context, 2056709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitRange.getBegin(), 0, 0, 2057ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek InitRange.getEnd()); 2058ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor 20596398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor Result->setType(CurrentObjectType.getNonLValueExprType(SemaRef.Context)); 20604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 2061fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Pre-allocate storage for the structured initializer list. 2062fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor unsigned NumElements = 0; 206308457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor unsigned NumInits = 0; 2064f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis bool GotNumInits = false; 2065f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (!StructuredList) { 206608457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = IList->getNumInits(); 2067f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis GotNumInits = true; 2068f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis } else if (Index < IList->getNumInits()) { 2069f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) { 207008457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = SubList->getNumInits(); 2071f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis GotNumInits = true; 2072f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis } 207308457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor } 207408457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor 20751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ArrayType *AType 2076fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor = SemaRef.Context.getAsArrayType(CurrentObjectType)) { 2077fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) { 2078fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = CAType->getSize().getZExtValue(); 2079fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Simple heuristic so that we don't allocate a very large 2080fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // initializer with many empty entries at the end. 2081f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (GotNumInits && NumElements > NumInits) 2082fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 0; 2083fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 2084183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) 2085fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = VType->getNumElements(); 20866217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const RecordType *RType = CurrentObjectType->getAs<RecordType>()) { 2087fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor RecordDecl *RDecl = RType->getDecl(); 2088fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (RDecl->isUnion()) 2089fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 1; 2090fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor else 20911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumElements = std::distance(RDecl->field_begin(), 209217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RDecl->field_end()); 2093fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 2094fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 2095709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Result->reserveInits(SemaRef.Context, NumElements); 2096fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 20974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Link this new initializer list into the structured initializer 20984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // lists. 20994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (StructuredList) 2100709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result); 21014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else { 21024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Result->setSyntacticForm(IList); 21034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = Result; 21044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 21054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 21064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 21074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 21084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 21094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Update the initializer at index @p StructuredIndex within the 21104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// structured initializer list to the value @p expr. 21114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregorvoid InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, 21124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex, 21134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *expr) { 21144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // No structured initializer list to update 21154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 21164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 21174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 2118709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, 2119709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredIndex, expr)) { 21204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // This initializer overwrites a previous initializer. Warn. 21211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(expr->getSourceRange().getBegin(), 21224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::warn_initializer_overrides) 21234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << expr->getSourceRange(); 21241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(PrevInit->getSourceRange().getBegin(), 21254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 212654f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 21274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << PrevInit->getSourceRange(); 21284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 21291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 21314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 21324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 213305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Check that the given Index expression is a valid array designator 213405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// value. This is essentailly just a wrapper around 21353bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner/// VerifyIntegerConstantExpression that also checks for negative values 213605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// and produces a reasonable diagnostic if there is a 213705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// failure. Returns true if there was an error, false otherwise. If 213805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// everything went okay, Value will receive the value of the constant 213905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// expression. 21401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool 21413bf6893b77c30cb774100e0fa7ae029331675ec1Chris LattnerCheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) { 214205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation Loc = Index->getSourceRange().getBegin(); 214305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 214405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Make sure this is an integer constant expression. 21453bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (S.VerifyIntegerConstantExpression(Index, &Value)) 21463bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return true; 21473bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 21483bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (Value.isSigned() && Value.isNegative()) 21493bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return S.Diag(Loc, diag::err_array_designator_negative) 215005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << Value.toString(10) << Index->getSourceRange(); 215105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 215253d3d8e0662197f7245d8f5ff697a72a2b4b3f54Douglas Gregor Value.setIsUnsigned(true); 215305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return false; 215405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 215505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 215660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, 21577663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky SourceLocation Loc, 21587663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky bool GNUSyntax, 21597663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky ExprResult Init) { 216005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef DesignatedInitExpr::Designator ASTDesignator; 216105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 216205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool Invalid = false; 21635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ASTDesignator, 32> Designators; 21645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Expr *, 32> InitExpressions; 216505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 216605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Build designators and check array designator expressions. 216705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) { 216805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor const Designator &D = Desig.getDesignator(Idx); 216905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor switch (D.getKind()) { 217005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::FieldDesignator: 21711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(), 217205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getFieldLoc())); 217305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 217405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 217505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayDesignator: { 217605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Index = static_cast<Expr *>(D.getArrayIndex()); 217705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt IndexValue; 21789ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (!Index->isTypeDependent() && 21799ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor !Index->isValueDependent() && 21809ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, Index, IndexValue)) 218105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 218205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else { 218305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 21841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 218505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getRBracketLoc())); 218605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor InitExpressions.push_back(Index); 218705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 218805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 218905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 219005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 219105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayRangeDesignator: { 219205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart()); 219305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd()); 219405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt StartValue; 219505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt EndValue; 21969ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool StartDependent = StartIndex->isTypeDependent() || 21979ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor StartIndex->isValueDependent(); 21989ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool EndDependent = EndIndex->isTypeDependent() || 21999ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor EndIndex->isValueDependent(); 22009ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if ((!StartDependent && 22019ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, StartIndex, StartValue)) || 22029ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor (!EndDependent && 22039ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor CheckArrayDesignatorExpr(*this, EndIndex, EndValue))) 220405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 2205d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else { 2206d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor // Make sure we're comparing values with the same bit width. 22079ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (StartDependent || EndDependent) { 22089ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Nothing to compute. 22099ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (StartValue.getBitWidth() > EndValue.getBitWidth()) 22109f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad EndValue = EndValue.extend(StartValue.getBitWidth()); 2211d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else if (StartValue.getBitWidth() < EndValue.getBitWidth()) 22129f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad StartValue = StartValue.extend(EndValue.getBitWidth()); 2213d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor 2214c4bb7bfe8328f79004517dd268f6146c8066c205Douglas Gregor if (!StartDependent && !EndDependent && EndValue < StartValue) { 2215d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range) 22161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << StartValue.toString(10) << EndValue.toString(10) 2217d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor << StartIndex->getSourceRange() << EndIndex->getSourceRange(); 2218d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Invalid = true; 2219d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } else { 2220d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 22211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 2222d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getEllipsisLoc(), 2223d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getRBracketLoc())); 2224d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(StartIndex); 2225d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(EndIndex); 2226d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } 222705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 222805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 222905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 223005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 223105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 223205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 223305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Invalid || Init.isInvalid()) 223405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return ExprError(); 223505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 223605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Clear out the expressions within the designation. 223705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Desig.ClearExprs(*this); 223805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 223905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor DesignatedInitExpr *DIE 2240beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad = DesignatedInitExpr::Create(Context, 2241beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Designators.data(), Designators.size(), 2242beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad InitExpressions.data(), InitExpressions.size(), 2243e9146f2e9f1c4e281544e8c080934c72d41012caAnders Carlsson Loc, GNUSyntax, Init.takeAs<Expr>()); 2244dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 22452d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor if (getLangOptions().CPlusPlus) 2246a47317bbeef839ef86323e3feacd9962ca9c383aEli Friedman Diag(DIE->getLocStart(), diag::ext_designated_init_cxx) 2247a47317bbeef839ef86323e3feacd9962ca9c383aEli Friedman << DIE->getSourceRange(); 2248a47317bbeef839ef86323e3feacd9962ca9c383aEli Friedman else if (!getLangOptions().C99) 22492d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor Diag(DIE->getLocStart(), diag::ext_designated_init) 22502d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor << DIE->getSourceRange(); 2251dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 225205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return Owned(DIE); 225305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 2254c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 2255cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 2256cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor// Initialization entity 2257cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 225839da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor 2259dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index, 2260cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor const InitializedEntity &Parent) 2261dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi : Parent(&Parent), Index(Index) 2262cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor{ 2263d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) { 2264d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_ArrayElement; 2265d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = AT->getElementType(); 22660c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else if (const VectorType *VT = Parent.getType()->getAs<VectorType>()) { 2267d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_VectorElement; 22680c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Type = VT->getElementType(); 22690c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else { 22700c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman const ComplexType *CT = Parent.getType()->getAs<ComplexType>(); 22710c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman assert(CT && "Unexpected type"); 22720c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Kind = EK_ComplexElement; 22730c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Type = CT->getElementType(); 2274d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } 227520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 227620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2277dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity InitializedEntity::InitializeBase(ASTContext &Context, 2278711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson CXXBaseSpecifier *Base, 2279711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson bool IsInheritedVirtualBase) 228020093b4bf698f292c664676987541d5103b65b15Douglas Gregor{ 228120093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializedEntity Result; 228220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Kind = EK_Base; 2283711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base = reinterpret_cast<uintptr_t>(Base); 2284711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson if (IsInheritedVirtualBase) 2285711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base |= 0x01; 2286dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2287d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Result.Type = Base->getType(); 228820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 228920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 229020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 229199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas GregorDeclarationName InitializedEntity::getName() const { 229299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (getKind()) { 2293f85e193739c953358c865005855253af4f68a497John McCall case EK_Parameter: { 2294f85e193739c953358c865005855253af4f68a497John McCall ParmVarDecl *D = reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1); 2295f85e193739c953358c865005855253af4f68a497John McCall return (D ? D->getDeclName() : DeclarationName()); 2296f85e193739c953358c865005855253af4f68a497John McCall } 2297a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor 2298a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor case EK_Variable: 229999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Member: 230099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return VariableOrMember->getDeclName(); 230199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 230299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Result: 230399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Exception: 230418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case EK_New: 230599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Temporary: 230699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Base: 2307059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 2308d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2309d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 23100c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2311310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 231299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 231399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 2314dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 231599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Silence GCC warning 231699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 231799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 231899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 23197abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas GregorDeclaratorDecl *InitializedEntity::getDecl() const { 23207abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor switch (getKind()) { 23217abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Variable: 23227abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Member: 23237abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return VariableOrMember; 23247abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 2325f85e193739c953358c865005855253af4f68a497John McCall case EK_Parameter: 2326f85e193739c953358c865005855253af4f68a497John McCall return reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1); 2327f85e193739c953358c865005855253af4f68a497John McCall 23287abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Result: 23297abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Exception: 23307abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_New: 23317abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Temporary: 23327abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Base: 2333059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 2334d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2335d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 23360c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2337310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 23387abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 23397abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor } 2340dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23417abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor // Silence GCC warning 23427abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 23437abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor} 23447abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 23453c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregorbool InitializedEntity::allowsNRVO() const { 23463c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor switch (getKind()) { 23473c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Result: 23483c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Exception: 23493c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return LocAndNRVO.NRVO; 2350dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23513c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Variable: 23523c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Parameter: 23533c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Member: 23543c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_New: 23553c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Temporary: 23563c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Base: 2357059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 23583c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_ArrayElement: 23593c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_VectorElement: 23600c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2361310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 23623c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor break; 23633c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor } 23643c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 23653c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return false; 23663c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor} 23673c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 236820093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 236920093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Initialization sequence 237020093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 237120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 237220093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::Step::Destroy() { 237320093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Kind) { 237420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 237520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 2376906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 237720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: 237820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 237920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 2380523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 238120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: 238220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 2383906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 238420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 2385d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: 23868713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case SK_ListConstructorCall: 238713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 238813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 238951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: 239071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: 239118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 2392cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 2393569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 2394cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 2395f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 2396f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 2397f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 239820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 2399dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 240020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 240120093b4bf698f292c664676987541d5103b65b15Douglas Gregor delete ICS; 240220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 240320093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 240420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2405b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isDirectReferenceBinding() const { 24063b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl return !Steps.empty() && Steps.back().Kind == SK_BindReference; 2407b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2408b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2409b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isAmbiguous() const { 2410d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (!Failed()) 2411b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2412dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2413b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor switch (getFailureKind()) { 2414b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForReference: 2415b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitList: 2416b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 2417b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_AddressOfOverloadFailed: // FIXME: Could do better 2418b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 2419b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 2420b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_RValueReferenceBindingToLValue: 2421b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitDropsQualifiers: 2422b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitFailed: 2423b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConversionFailed: 2424429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 2425b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForScalar: 2426b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceBindingToInitList: 2427b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_InitListBadDestinationType: 2428b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_DefaultInitOfConst: 242972a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 2430cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 2431cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 24328713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_ListInitializationFailed: 24335acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: 2434b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2435dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2436b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitOverloadFailed: 2437b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_UserConversionOverloadFailed: 2438b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConstructorOverloadFailed: 2439b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return FailedOverloadResult == OR_Ambiguous; 2440b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor } 2441dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2442b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2443b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2444b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2445d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregorbool InitializationSequence::isConstructorInitialization() const { 2446d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization; 2447d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor} 2448d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor 2449191591336f639dad1504e863733fb831645c1644Jeffrey Yasskinbool InitializationSequence::endsWithNarrowing(ASTContext &Ctx, 2450191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin const Expr *Initializer, 2451191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin bool *isInitializerConstant, 2452191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin APValue *ConstantValue) const { 2453191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (Steps.empty() || Initializer->isValueDependent()) 2454191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return false; 2455191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 2456191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin const Step &LastStep = Steps.back(); 2457191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (LastStep.Kind != SK_ConversionSequence) 2458191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return false; 2459191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 2460191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin const ImplicitConversionSequence &ICS = *LastStep.ICS; 2461191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin const StandardConversionSequence *SCS = NULL; 2462191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin switch (ICS.getKind()) { 2463191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin case ImplicitConversionSequence::StandardConversion: 2464191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin SCS = &ICS.Standard; 2465191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin break; 2466191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin case ImplicitConversionSequence::UserDefinedConversion: 2467191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin SCS = &ICS.UserDefined.After; 2468191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin break; 2469191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin case ImplicitConversionSequence::AmbiguousConversion: 2470191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin case ImplicitConversionSequence::EllipsisConversion: 2471191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin case ImplicitConversionSequence::BadConversion: 2472191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return false; 2473191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2474191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 2475191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Check if SCS represents a narrowing conversion, according to C++0x 2476191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // [dcl.init.list]p7: 2477191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // 2478191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // A narrowing conversion is an implicit conversion ... 2479191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ImplicitConversionKind PossibleNarrowing = SCS->Second; 2480191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin QualType FromType = SCS->getToType(0); 2481191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin QualType ToType = SCS->getToType(1); 2482191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin switch (PossibleNarrowing) { 2483191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // * from a floating-point type to an integer type, or 2484191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // 2485191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // * from an integer type or unscoped enumeration type to a floating-point 2486191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // type, except where the source is a constant expression and the actual 2487191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // value after conversion will fit into the target type and will produce 2488191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // the original value when converted back to the original type, or 2489191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin case ICK_Floating_Integral: 2490191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (FromType->isRealFloatingType() && ToType->isIntegralType(Ctx)) { 2491191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin *isInitializerConstant = false; 2492191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return true; 2493191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } else if (FromType->isIntegralType(Ctx) && ToType->isRealFloatingType()) { 2494191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::APSInt IntConstantValue; 2495191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (Initializer && 2496191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin Initializer->isIntegerConstantExpr(IntConstantValue, Ctx)) { 2497191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Convert the integer to the floating type. 2498191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::APFloat Result(Ctx.getFloatTypeSemantics(ToType)); 2499191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin Result.convertFromAPInt(IntConstantValue, IntConstantValue.isSigned(), 2500191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::APFloat::rmNearestTiesToEven); 2501191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // And back. 2502191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::APSInt ConvertedValue = IntConstantValue; 2503191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin bool ignored; 2504191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin Result.convertToInteger(ConvertedValue, 2505191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::APFloat::rmTowardZero, &ignored); 2506191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // If the resulting value is different, this was a narrowing conversion. 2507191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (IntConstantValue != ConvertedValue) { 2508191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin *isInitializerConstant = true; 2509191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin *ConstantValue = APValue(IntConstantValue); 2510191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return true; 2511191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2512191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } else { 2513191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Variables are always narrowings. 2514191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin *isInitializerConstant = false; 2515191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return true; 2516191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2517191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2518191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return false; 2519191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 2520191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // * from long double to double or float, or from double to float, except 2521191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // where the source is a constant expression and the actual value after 2522191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // conversion is within the range of values that can be represented (even 2523191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // if it cannot be represented exactly), or 2524191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin case ICK_Floating_Conversion: 2525191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (1 == Ctx.getFloatingTypeOrder(FromType, ToType)) { 2526191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // FromType is larger than ToType. 2527191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin Expr::EvalResult InitializerValue; 2528191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // FIXME: Check whether Initializer is a constant expression according 2529191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // to C++0x [expr.const], rather than just whether it can be folded. 253051f4708c00110940ca3f337961915f2ca1668375Richard Smith if (Initializer->EvaluateAsRValue(InitializerValue, Ctx) && 2531191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin !InitializerValue.HasSideEffects && InitializerValue.Val.isFloat()) { 2532191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Constant! (Except for FIXME above.) 2533191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::APFloat FloatVal = InitializerValue.Val.getFloat(); 2534191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Convert the source value into the target type. 2535191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin bool ignored; 2536191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::APFloat::opStatus ConvertStatus = FloatVal.convert( 2537191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin Ctx.getFloatTypeSemantics(ToType), 2538191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::APFloat::rmNearestTiesToEven, &ignored); 2539191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // If there was no overflow, the source value is within the range of 2540191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // values that can be represented. 2541191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (ConvertStatus & llvm::APFloat::opOverflow) { 2542191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin *isInitializerConstant = true; 2543191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin *ConstantValue = InitializerValue.Val; 2544191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return true; 2545191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2546191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } else { 2547191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin *isInitializerConstant = false; 2548191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return true; 2549191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2550191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2551191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return false; 2552191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 2553191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // * from an integer type or unscoped enumeration type to an integer type 2554191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // that cannot represent all the values of the original type, except where 2555191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // the source is a constant expression and the actual value after 2556191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // conversion will fit into the target type and will produce the original 2557191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // value when converted back to the original type. 25586d0ee8d77b6d37fa0dec1d55aa13429a6608e7a9Jeffrey Yasskin case ICK_Boolean_Conversion: // Bools are integers too. 2559b89d5ed785e2eb7dd64aa38d481d939155f62c41Jeffrey Yasskin if (!FromType->isIntegralOrUnscopedEnumerationType()) { 2560b89d5ed785e2eb7dd64aa38d481d939155f62c41Jeffrey Yasskin // Boolean conversions can be from pointers and pointers to members 2561b89d5ed785e2eb7dd64aa38d481d939155f62c41Jeffrey Yasskin // [conv.bool], and those aren't considered narrowing conversions. 2562b89d5ed785e2eb7dd64aa38d481d939155f62c41Jeffrey Yasskin return false; 2563b89d5ed785e2eb7dd64aa38d481d939155f62c41Jeffrey Yasskin } // Otherwise, fall through to the integral case. 2564191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin case ICK_Integral_Conversion: { 2565191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin assert(FromType->isIntegralOrUnscopedEnumerationType()); 2566191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin assert(ToType->isIntegralOrUnscopedEnumerationType()); 2567191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin const bool FromSigned = FromType->isSignedIntegerOrEnumerationType(); 2568191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin const unsigned FromWidth = Ctx.getIntWidth(FromType); 2569191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin const bool ToSigned = ToType->isSignedIntegerOrEnumerationType(); 2570191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin const unsigned ToWidth = Ctx.getIntWidth(ToType); 2571191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 2572191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (FromWidth > ToWidth || 2573191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin (FromWidth == ToWidth && FromSigned != ToSigned)) { 2574191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Not all values of FromType can be represented in ToType. 2575191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::APSInt InitializerValue; 2576191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (Initializer->isIntegerConstantExpr(InitializerValue, Ctx)) { 2577191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin *isInitializerConstant = true; 2578191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin *ConstantValue = APValue(InitializerValue); 2579191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 2580191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Add a bit to the InitializerValue so we don't have to worry about 2581191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // signed vs. unsigned comparisons. 2582191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin InitializerValue = InitializerValue.extend( 2583191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin InitializerValue.getBitWidth() + 1); 2584191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Convert the initializer to and from the target width and signed-ness. 2585191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::APSInt ConvertedValue = InitializerValue; 2586191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ConvertedValue = ConvertedValue.trunc(ToWidth); 2587191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ConvertedValue.setIsSigned(ToSigned); 2588191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth()); 2589191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ConvertedValue.setIsSigned(InitializerValue.isSigned()); 2590191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // If the result is different, this was a narrowing conversion. 2591191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return ConvertedValue != InitializerValue; 2592191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } else { 2593191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Variables are always narrowings. 2594191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin *isInitializerConstant = false; 2595191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return true; 2596191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2597191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2598191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return false; 2599191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2600191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 2601191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin default: 2602191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Other kinds of conversions are not narrowings. 2603191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return false; 2604191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 2605191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin} 2606191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 260722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnaravoid 260822c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence 260922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara::AddAddressOverloadResolutionStep(FunctionDecl *Function, 261022c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara DeclAccessPair Found, 261122c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates) { 261220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 261320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ResolveAddressOfOverloadedFunction; 261420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Function->getType(); 261522c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 26169aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 26176bb8017bb9e828d118e15e59d71c66bba323c364John McCall S.Function.FoundDecl = Found; 261820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 261920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 262020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2621dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType, 26225baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 262320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 26245baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 26255baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: S.Kind = SK_CastDerivedToBaseRValue; break; 26265baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break; 26275baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break; 2628906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl default: llvm_unreachable("No such category"); 2629906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 263020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = BaseType; 263120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 263220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 263320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2634dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddReferenceBindingStep(QualType T, 263520093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool BindingTemporary) { 263620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 263720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference; 263820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 263920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 264020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 264120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2642523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregorvoid InitializationSequence::AddExtraneousCopyToTemporary(QualType T) { 2643523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Step S; 2644523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Kind = SK_ExtraneousCopyToTemporary; 2645523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Type = T; 2646523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Steps.push_back(S); 2647523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor} 2648523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 264922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnaravoid 265022c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence::AddUserConversionStep(FunctionDecl *Function, 265122c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara DeclAccessPair FoundDecl, 265222c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara QualType T, 265322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates) { 265420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 265520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_UserConversion; 265603981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman S.Type = T; 265722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 26589aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 26599aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = FoundDecl; 266020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 266120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 266220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 266320093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddQualificationConversionStep(QualType Ty, 26645baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 266520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 266638a4ffe5244e6be46f1b1f8394342a77836be776John McCall S.Kind = SK_QualificationConversionRValue; // work around a gcc warning 26675baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 26685baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: 2669906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionRValue; 2670906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 26715baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: 2672906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionXValue; 2673906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 26745baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: 2675906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionLValue; 2676906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 2677906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 267820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Ty; 267920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 268020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 268120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 268220093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddConversionSequenceStep( 268320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const ImplicitConversionSequence &ICS, 268420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T) { 268520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 268620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ConversionSequence; 268720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 268820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ICS = new ImplicitConversionSequence(ICS); 268920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 269020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 269120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2692d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorvoid InitializationSequence::AddListInitializationStep(QualType T) { 2693d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Step S; 2694d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Kind = SK_ListInitialization; 2695d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Type = T; 2696d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Steps.push_back(S); 2697d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor} 2698d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2699dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 270022c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence 270122c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara::AddConstructorInitializationStep(CXXConstructorDecl *Constructor, 270222c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara AccessSpecifier Access, 270322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara QualType T, 270422c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates) { 270551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Step S; 270651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Kind = SK_ConstructorInitialization; 270751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Type = T; 270822c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 27099aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Constructor; 27109aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = DeclAccessPair::make(Constructor, Access); 271151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Steps.push_back(S); 271251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor} 271351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 271471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorvoid InitializationSequence::AddZeroInitializationStep(QualType T) { 271571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Step S; 271671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Kind = SK_ZeroInitialization; 271771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Type = T; 271871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Steps.push_back(S); 271971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 272071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 272118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorvoid InitializationSequence::AddCAssignmentStep(QualType T) { 272218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step S; 272318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Kind = SK_CAssignment; 272418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Type = T; 272518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Steps.push_back(S); 272618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 272718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 2728cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedmanvoid InitializationSequence::AddStringInitStep(QualType T) { 2729cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Step S; 2730cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Kind = SK_StringInit; 2731cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Type = T; 2732cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Steps.push_back(S); 2733cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman} 2734cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2735569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorvoid InitializationSequence::AddObjCObjectConversionStep(QualType T) { 2736569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Step S; 2737569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Kind = SK_ObjCObjectConversion; 2738569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Type = T; 2739569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Steps.push_back(S); 2740569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 2741569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 2742cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregorvoid InitializationSequence::AddArrayInitStep(QualType T) { 2743cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Step S; 2744cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Kind = SK_ArrayInit; 2745cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Type = T; 2746cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Steps.push_back(S); 2747cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor} 2748cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 2749f85e193739c953358c865005855253af4f68a497John McCallvoid InitializationSequence::AddPassByIndirectCopyRestoreStep(QualType type, 2750f85e193739c953358c865005855253af4f68a497John McCall bool shouldCopy) { 2751f85e193739c953358c865005855253af4f68a497John McCall Step s; 2752f85e193739c953358c865005855253af4f68a497John McCall s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore 2753f85e193739c953358c865005855253af4f68a497John McCall : SK_PassByIndirectRestore); 2754f85e193739c953358c865005855253af4f68a497John McCall s.Type = type; 2755f85e193739c953358c865005855253af4f68a497John McCall Steps.push_back(s); 2756f85e193739c953358c865005855253af4f68a497John McCall} 2757f85e193739c953358c865005855253af4f68a497John McCall 2758f85e193739c953358c865005855253af4f68a497John McCallvoid InitializationSequence::AddProduceObjCObjectStep(QualType T) { 2759f85e193739c953358c865005855253af4f68a497John McCall Step S; 2760f85e193739c953358c865005855253af4f68a497John McCall S.Kind = SK_ProduceObjCObject; 2761f85e193739c953358c865005855253af4f68a497John McCall S.Type = T; 2762f85e193739c953358c865005855253af4f68a497John McCall Steps.push_back(S); 2763f85e193739c953358c865005855253af4f68a497John McCall} 2764f85e193739c953358c865005855253af4f68a497John McCall 276513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlvoid InitializationSequence::RewrapReferenceInitList(QualType T, 276613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *Syntactic) { 276713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl assert(Syntactic->getNumInits() == 1 && 276813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl "Can only rewrap trivial init lists."); 276913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Step S; 277013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Kind = SK_UnwrapInitList; 277113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Type = Syntactic->getInit(0)->getType(); 277213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Steps.insert(Steps.begin(), S); 277313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 277413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Kind = SK_RewrapInitList; 277513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Type = T; 277613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.WrappingSyntacticList = Syntactic; 277713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Steps.push_back(S); 277813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 277913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 2780dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::SetOverloadFailure(FailureKind Failure, 278120093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Result) { 27827491c499e826682e128a400038361ebcbde30eecSebastian Redl setSequenceKind(FailedSequence); 278320093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->Failure = Failure; 278420093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->FailedOverloadResult = Result; 278520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 278620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 278720093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 278820093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Attempt initialization 278920093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 279020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2791f85e193739c953358c865005855253af4f68a497John McCallstatic void MaybeProduceObjCObject(Sema &S, 2792f85e193739c953358c865005855253af4f68a497John McCall InitializationSequence &Sequence, 2793f85e193739c953358c865005855253af4f68a497John McCall const InitializedEntity &Entity) { 2794f85e193739c953358c865005855253af4f68a497John McCall if (!S.getLangOptions().ObjCAutoRefCount) return; 2795f85e193739c953358c865005855253af4f68a497John McCall 2796f85e193739c953358c865005855253af4f68a497John McCall /// When initializing a parameter, produce the value if it's marked 2797f85e193739c953358c865005855253af4f68a497John McCall /// __attribute__((ns_consumed)). 2798f85e193739c953358c865005855253af4f68a497John McCall if (Entity.getKind() == InitializedEntity::EK_Parameter) { 2799f85e193739c953358c865005855253af4f68a497John McCall if (!Entity.isParameterConsumed()) 2800f85e193739c953358c865005855253af4f68a497John McCall return; 2801f85e193739c953358c865005855253af4f68a497John McCall 2802f85e193739c953358c865005855253af4f68a497John McCall assert(Entity.getType()->isObjCRetainableType() && 2803f85e193739c953358c865005855253af4f68a497John McCall "consuming an object of unretainable type?"); 2804f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddProduceObjCObjectStep(Entity.getType()); 2805f85e193739c953358c865005855253af4f68a497John McCall 2806f85e193739c953358c865005855253af4f68a497John McCall /// When initializing a return value, if the return type is a 2807f85e193739c953358c865005855253af4f68a497John McCall /// retainable type, then returns need to immediately retain the 2808f85e193739c953358c865005855253af4f68a497John McCall /// object. If an autorelease is required, it will be done at the 2809f85e193739c953358c865005855253af4f68a497John McCall /// last instant. 2810f85e193739c953358c865005855253af4f68a497John McCall } else if (Entity.getKind() == InitializedEntity::EK_Result) { 2811f85e193739c953358c865005855253af4f68a497John McCall if (!Entity.getType()->isObjCRetainableType()) 2812f85e193739c953358c865005855253af4f68a497John McCall return; 2813f85e193739c953358c865005855253af4f68a497John McCall 2814f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddProduceObjCObjectStep(Entity.getType()); 2815f85e193739c953358c865005855253af4f68a497John McCall } 2816f85e193739c953358c865005855253af4f68a497John McCall} 2817f85e193739c953358c865005855253af4f68a497John McCall 281813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic bool 281913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian RedlResolveOverloadedFunctionForReferenceBinding(Sema &S, 282013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 282113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType &SourceType, 282213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType &UnqualifiedSourceType, 282313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType UnqualifiedTargetType, 282413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) { 282513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (S.Context.getCanonicalType(UnqualifiedSourceType) == 282613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Context.OverloadTy) { 282713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl DeclAccessPair Found; 282813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl bool HadMultipleCandidates = false; 282913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (FunctionDecl *Fn 283013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl = S.ResolveAddressOfOverloadedFunction(Initializer, 283113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl UnqualifiedTargetType, 283213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl false, Found, 283313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl &HadMultipleCandidates)) { 283413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.AddAddressOverloadResolutionStep(Fn, Found, 283513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl HadMultipleCandidates); 283613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceType = Fn->getType(); 283713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl UnqualifiedSourceType = SourceType.getUnqualifiedType(); 283813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } else if (!UnqualifiedTargetType->isRecordType()) { 283913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 284013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return true; 284113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 284213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 284313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return false; 284413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 284513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 284613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceInitializationCore(Sema &S, 284713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 284813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 284913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 285013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1, QualType T1, 285113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals, 285213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2, QualType T2, 285313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals, 285413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence); 285513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 285613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryListInitialization(Sema &S, 285713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 285813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 285913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *InitList, 286013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence); 286113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 286213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl/// \brief Attempt list initialization of a reference. 286313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceListInitialization(Sema &S, 286413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 286513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 286613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *InitList, 286713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) 286813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl{ 286913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // First, catch C++03 where this isn't possible. 287013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (!S.getLangOptions().CPlusPlus0x) { 287113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList); 287213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 287313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 287413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 287513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType DestType = Entity.getType(); 287613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 287713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals; 287813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 287913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 288013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Reference initialization via an initializer list works thus: 288113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // If the initializer list consists of a single element that is 288213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // reference-related to the referenced type, bind directly to that element 288313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // (possibly creating temporaries). 288413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Otherwise, initialize a temporary with the initializer list and 288513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // bind to that. 288613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (InitList->getNumInits() == 1) { 288713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer = InitList->getInit(0); 288813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2 = Initializer->getType(); 288913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals; 289013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 289113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 289213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // If this fails, creating a temporary wouldn't work either. 289313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2, 289413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1, Sequence)) 289513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 289613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 289713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceLocation DeclLoc = Initializer->getLocStart(); 289813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl bool dummy1, dummy2, dummy3; 289913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sema::ReferenceCompareResult RefRelationship 290013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, dummy1, 290113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl dummy2, dummy3); 290213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (RefRelationship >= Sema::Ref_Related) { 290313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Try to bind the reference here. 290413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1, 290513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1Quals, cv2T2, T2, T2Quals, Sequence); 290613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (Sequence) 290713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.RewrapReferenceInitList(cv1T1, InitList); 290813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 290913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 291013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 291113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 291213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Not reference-related. Create a temporary and bind to that. 291313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 291413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 291513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryListInitialization(S, TempEntity, Kind, InitList, Sequence); 291613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (Sequence) { 291713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (DestType->isRValueReferenceType() || 291813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl (T1Quals.hasConst() && !T1Quals.hasVolatile())) 291913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 292013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl else 292113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed( 292213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 292313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 292413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 292513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 292612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola/// \brief Attempt list initialization (C++0x [dcl.init.list]) 292712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindolastatic void TryListInitialization(Sema &S, 292812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola const InitializedEntity &Entity, 292912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola const InitializationKind &Kind, 293012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola InitListExpr *InitList, 293112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola InitializationSequence &Sequence) { 293212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola QualType DestType = Entity.getType(); 293312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 293414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // C++ doesn't allow scalar initialization with more than one argument. 293514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // But C99 complex numbers are scalars and it makes sense there. 293614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (S.getLangOptions().CPlusPlus && DestType->isScalarType() && 293714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !DestType->isAnyComplexType() && InitList->getNumInits() > 1) { 293814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar); 293914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 294014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 294114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (DestType->isReferenceType()) { 294213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceListInitialization(S, Entity, Kind, InitList, Sequence); 294312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola return; 294414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 294513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // FIXME: C++11 defines behavior for this case. 294614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (DestType->isRecordType() && !DestType->isAggregateType()) { 294712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType); 294814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 294914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 295014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 295114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListChecker CheckInitList(S, Entity, InitList, 2952c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl DestType, /*VerifyOnly=*/true, 2953c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl Kind.getKind() != InitializationKind::IK_Direct || 2954c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl !S.getLangOptions().CPlusPlus0x); 295514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (CheckInitList.HadError()) { 295614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Sequence.SetFailed(InitializationSequence::FK_ListInitializationFailed); 295714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 295812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola } 295912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 296014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Add the list initialization step with the built init list. 296112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Sequence.AddListInitializationStep(DestType); 296212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola} 296320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 296420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Try a reference initialization that involves calling a conversion 296520093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// function. 296620093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic OverloadingResult TryRefInitWithConversionFunction(Sema &S, 296720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 296820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 296920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 297020093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowRValues, 297120093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 2972d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 297320093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 297420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T1 = cv1T1.getUnqualifiedType(); 297520093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 297620093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T2 = cv2T2.getUnqualifiedType(); 297720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 297820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase; 2979569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion; 2980f85e193739c953358c865005855253af4f68a497John McCall bool ObjCLifetimeConversion; 2981dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi assert(!S.CompareReferenceRelationship(Initializer->getLocStart(), 2982569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T1, T2, DerivedToBase, 2983f85e193739c953358c865005855253af4f68a497John McCall ObjCConversion, 2984f85e193739c953358c865005855253af4f68a497John McCall ObjCLifetimeConversion) && 298520093b4bf698f292c664676987541d5103b65b15Douglas Gregor "Must have incompatible references when binding via conversion"); 298660cfcecaf48e4310339dcfbdb0e3f0e6d2853855Chandler Carruth (void)DerivedToBase; 2987569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor (void)ObjCConversion; 2988f85e193739c953358c865005855253af4f68a497John McCall (void)ObjCLifetimeConversion; 2989f85e193739c953358c865005855253af4f68a497John McCall 299020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the candidate set directly in the initialization sequence 299120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // structure, so that it will persist if we fail. 299220093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 299320093b4bf698f292c664676987541d5103b65b15Douglas Gregor CandidateSet.clear(); 299420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 299520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 299620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 299720093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 2998dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 299920093b4bf698f292c664676987541d5103b65b15Douglas Gregor const RecordType *T1RecordType = 0; 30006b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) && 30016b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T1, 0)) { 300220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 300320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to see if there is a suitable conversion. 300420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl()); 3005572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall 300620093b4bf698f292c664676987541d5103b65b15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 3007e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(T1RecordDecl); 300820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Con != ConEnd; ++Con) { 30099aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 30109aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 30119aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 301220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Find the constructor (which may be a template). 301320093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConstructorDecl *Constructor = 0; 30149aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 301520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 301620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 301720093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 301820093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 30199aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 3020dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 302120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Constructor->isInvalidDecl() && 302220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 302320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 30249aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 302586820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 3026b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis &Initializer, 1, CandidateSet, 3027b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 302820093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 30299aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 3030b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis &Initializer, 1, CandidateSet, 3031b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 303220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3033dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 303420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3035572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl()) 3036572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 3037dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 30386b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor const RecordType *T2RecordType = 0; 30396b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if ((T2RecordType = T2->getAs<RecordType>()) && 30406b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T2, 0)) { 304120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting from is a class type, enumerate its conversion 304220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions. 304320093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl()); 304420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3045eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 304620093b4bf698f292c664676987541d5103b65b15Douglas Gregor = T2RecordDecl->getVisibleConversionFunctions(); 3047eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 3048eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall E = Conversions->end(); I != E; ++I) { 304920093b4bf698f292c664676987541d5103b65b15Douglas Gregor NamedDecl *D = *I; 305020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 305120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<UsingShadowDecl>(D)) 305220093b4bf698f292c664676987541d5103b65b15Douglas Gregor D = cast<UsingShadowDecl>(D)->getTargetDecl(); 3053dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 305420093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 305520093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConversionDecl *Conv; 305620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 305720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 305820093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 30594680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Conv = cast<CXXConversionDecl>(D); 3060dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 306120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the conversion function doesn't return a reference type, 306220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // it can't be considered for this conversion unless we're allowed to 306320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // consider rvalues. 3064dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Do we need to make sure that we only consider conversion 3065dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // candidates with reference-compatible results? That might be needed to 306620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // break recursion. 306720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if ((AllowExplicit || !Conv->isExplicit()) && 306820093b4bf698f292c664676987541d5103b65b15Douglas Gregor (AllowRValues || Conv->getConversionType()->isLValueReferenceType())){ 306920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 30709aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 307186820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, 3072564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor DestType, CandidateSet); 307320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 30749aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 3075564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor Initializer, DestType, CandidateSet); 307620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 307720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 307820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3079572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl()) 3080572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 3081dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 308220093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 308320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3084dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 308520093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 3086dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (OverloadingResult Result 30878fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) 308820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 308903981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 309020093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function = Best->Function; 309103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 309225ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth // This is the overload that will actually be used for the initialization, so 309325ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth // mark it as used. 309425ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth S.MarkDeclarationReferenced(DeclLoc, Function); 309525ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth 309603981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Compute the returned type of the conversion. 309720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<CXXConversionDecl>(Function)) 309820093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = Function->getResultType(); 309920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 310020093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv1T1; 310103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 310203981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Add the user-defined conversion step. 310322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 31049aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, 310522c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara T2.getNonLValueExprType(S.Context), 310622c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 310703981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 3108dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Determine whether we need to perform derived-to-base or 310903981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // cv-qualification adjustments. 31105baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = VK_RValue; 3111906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl if (T2->isLValueReferenceType()) 31125baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = VK_LValue; 3113906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl else if (const RValueReferenceType *RRef = T2->getAs<RValueReferenceType>()) 31145baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue; 3115906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 311620093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool NewDerivedToBase = false; 3117569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool NewObjCConversion = false; 3118f85e193739c953358c865005855253af4f68a497John McCall bool NewObjCLifetimeConversion = false; 311920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult NewRefRelationship 3120dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi = S.CompareReferenceRelationship(DeclLoc, T1, 31216398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor T2.getNonLValueExprType(S.Context), 3122f85e193739c953358c865005855253af4f68a497John McCall NewDerivedToBase, NewObjCConversion, 3123f85e193739c953358c865005855253af4f68a497John McCall NewObjCLifetimeConversion); 3124a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor if (NewRefRelationship == Sema::Ref_Incompatible) { 3125a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // If the type we've converted to is not reference-related to the 3126a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // type we're looking for, then there is another conversion step 3127a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // we need to perform to produce a temporary of the right type 3128a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // that we'll be binding to. 3129a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ImplicitConversionSequence ICS; 3130a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.setStandard(); 3131a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.Standard = Best->FinalConversion; 3132a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor T2 = ICS.Standard.getToType(2); 3133a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor Sequence.AddConversionSequenceStep(ICS, T2); 3134a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor } else if (NewDerivedToBase) 313520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 313620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getQualifiedType(T1, 3137dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi T2.getNonReferenceType().getQualifiers()), 31385baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK); 3139569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (NewObjCConversion) 3140569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 3141569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, 3142569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T2.getNonReferenceType().getQualifiers())); 3143569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 314420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (cv1T1.getQualifiers() != T2.getNonReferenceType().getQualifiers()) 31455baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK); 3146dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 314720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, !T2->isReferenceType()); 314820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return OR_Success; 314920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 3150dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 315183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void CheckCXX98CompatAccessibleCopy(Sema &S, 315283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const InitializedEntity &Entity, 315383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr); 315483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 3155dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Attempt reference initialization (C++0x [dcl.init.ref]) 3156dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryReferenceInitialization(Sema &S, 315720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 315820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 315920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 316020093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3161d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 316220093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 31635535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T1Quals; 31645535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 316520093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 31665535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T2Quals; 31675535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 31684680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 316920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the initializer is the address of an overloaded function, try 317020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to resolve the overloaded function. If all goes well, T2 is the 317120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type of the resulting function. 317213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2, 317313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1, Sequence)) 317413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 317513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 317613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Delegate everything else to a subfunction. 317713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1, 317813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1Quals, cv2T2, T2, T2Quals, Sequence); 317913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 31804680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 318113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl/// \brief Reference initialization without resolving overloaded functions. 318213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceInitializationCore(Sema &S, 318313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 318413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 318513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 318613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1, QualType T1, 318713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals, 318813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2, QualType T2, 318913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals, 319013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) { 319113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType DestType = Entity.getType(); 319213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceLocation DeclLoc = Initializer->getLocStart(); 319320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Compute some basic properties of the types and the initializer. 319420093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isLValueRef = DestType->isLValueReferenceType(); 319520093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isRValueRef = !isLValueRef; 319620093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase = false; 3197569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion = false; 3198f85e193739c953358c865005855253af4f68a497John McCall bool ObjCLifetimeConversion = false; 31994680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Expr::Classification InitCategory = Initializer->Classify(S.Context); 320020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult RefRelationship 3201569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase, 3202f85e193739c953358c865005855253af4f68a497John McCall ObjCConversion, ObjCLifetimeConversion); 32034680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 320420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p5: 3205dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // A reference to type "cv1 T1" is initialized by an expression of type 320620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // "cv2 T2" as follows: 320720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 3208dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the reference is an lvalue reference and the initializer 320920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // expression 32104680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // Note the analogous bullet points for rvlaue refs to functions. Because 32114680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // there are no function rvalues in C++, rvalue refs to functions are treated 32124680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // like lvalue refs. 321320093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult ConvOvlResult = OR_Success; 32144680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl bool T1Function = T1->isFunctionType(); 32154680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (isLValueRef || T1Function) { 3216dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (InitCategory.isLValue() && 321714d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 3218dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 321914d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related))) { 3220dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - is an lvalue (but is not a bit-field), and "cv1 T1" is 322120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2," or 322220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 3223dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Per C++ [over.best.ics]p2, we don't diagnose whether the lvalue is a 322420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // bit-field when we're determining whether the reference initialization 3225de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // can occur. However, we do pay attention to whether it is a bit-field 3226de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // to decide whether we're actually binding to a temporary created from 3227de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // the bit-field. 322820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 322920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 3230dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Context.getQualifiedType(T1, T2Quals), 32315baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue); 3232569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (ObjCConversion) 3233569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 3234569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 3235569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 32365535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 32375baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK_LValue); 3238de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor bool BindingTemporary = T1Quals.hasConst() && !T1Quals.hasVolatile() && 3239093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson (Initializer->getBitField() || Initializer->refersToVectorElement()); 3240de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, BindingTemporary); 324120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 324220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3243dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3244dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 3245dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 3246dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible 3247dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // with "cv3 T3" (this conversion is selected by enumerating the 324820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // applicable conversion functions (13.3.1.6) and choosing the best 324920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // one through overload resolution (13.3)), 32504680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // If we have an rvalue ref to function type here, the rhs must be 32514680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // an rvalue. 32524680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() && 32534680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl (isLValueRef || InitCategory.isRValue())) { 3254dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, Kind, 325520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer, 32564680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl /*AllowRValues=*/isRValueRef, 325720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 325820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult == OR_Success) 325920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 32601d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ConvOvlResult != OR_No_Viable_Function) { 32611d31833450e6d2947a33cb0840d87661d92eec07John McCall Sequence.SetOverloadFailure( 32621d31833450e6d2947a33cb0840d87661d92eec07John McCall InitializationSequence::FK_ReferenceInitOverloadFailed, 32631d31833450e6d2947a33cb0840d87661d92eec07John McCall ConvOvlResult); 32641d31833450e6d2947a33cb0840d87661d92eec07John McCall } 326520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 326620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 32674680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 3268dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, the reference shall be an lvalue reference to a 326920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // non-volatile const type (i.e., cv1 shall be const), or the reference 327069d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor // shall be an rvalue reference. 3271b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile())) { 32723afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 32733afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 32743afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 327520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 327620093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 327720093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 3278b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor else 32794680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Sequence.SetFailed(InitCategory.isLValue() 328020093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? (RefRelationship == Sema::Ref_Related 328120093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? InitializationSequence::FK_ReferenceInitDropsQualifiers 328220093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToUnrelated) 328320093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 32844680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 328520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 328620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 32874680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 3288c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - If the initializer expression 3289c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - is an xvalue, class prvalue, array prvalue, or function lvalue and 3290c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // "cv1 T1" is reference-compatible with "cv2 T2" 3291c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // Note: functions are handled below. 3292c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (!T1Function && 329314d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 3294dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 329514d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related)) && 3296c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isXValue() || 3297c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isRecordType()) || 3298c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isArrayType()))) { 3299c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ExprValueKind ValueKind = InitCategory.isXValue()? VK_XValue : VK_RValue; 3300c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (InitCategory.isPRValue() && T2->isRecordType()) { 3301523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the 3302523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // compiler the freedom to perform a copy here or bind to the 3303523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object, while C++0x requires that we bind directly to the 3304523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object. Hence, we always bind to the object without making an 3305523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // extra copy. However, in C++03 requires that we check for the 3306523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // presence of a suitable copy constructor: 3307523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // 3308523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The constructor that would be used to make the copy shall 3309523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // be callable whether or not the copy is actually done. 331062ec1f2fd7368542bb926c04797fb07023547694Francois Pichet if (!S.getLangOptions().CPlusPlus0x && !S.getLangOptions().MicrosoftExt) 3311523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Sequence.AddExtraneousCopyToTemporary(cv2T2); 331283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith else if (S.getLangOptions().CPlusPlus0x) 331383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CheckCXX98CompatAccessibleCopy(S, Entity, Initializer); 331420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3315dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3316c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (DerivedToBase) 3317c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddDerivedToBaseCastStep(S.Context.getQualifiedType(T1, T2Quals), 3318c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ValueKind); 3319c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor else if (ObjCConversion) 3320c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddObjCObjectConversionStep( 3321c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 3322dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3323c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T1Quals != T2Quals) 3324c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddQualificationConversionStep(cv1T1, ValueKind); 3325dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Sequence.AddReferenceBindingStep(cv1T1, 332665bfd682010f599a9a04fc7523e95e28c27508baPeter Collingbourne /*bindingTemporary=*/InitCategory.isPRValue()); 3327dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi return; 3328c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor } 3329dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3330dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 3331dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 3332c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // xvalue, class prvalue, or function lvalue of type "cv3 T3", 3333c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // where "cv1 T1" is reference-compatible with "cv3 T3", 3334c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T2->isRecordType()) { 333520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible) { 333620093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, 333720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind, Initializer, 333820093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowRValues=*/true, 333920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 334020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult) 334120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 334220093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 334320093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 3344dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 334520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 334620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3347dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 334820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 334920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 335020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 33510099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi 33520099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi // - Otherwise, a temporary of type "cv1 T1" is created and initialized 335320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // from the initializer expression using the rules for a non-reference 3354dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy initialization (8.5). The reference is then bound to the 335520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // temporary. [...] 3356369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 335720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 335820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 335920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct); 3360369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 3361369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 3362369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 3363f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS 3364f85e193739c953358c865005855253af4f68a497John McCall = S.TryImplicitConversion(Initializer, TempEntity.getType(), 3365369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*SuppressUserConversions*/ false, 3366369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall AllowExplicit, 336714d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*FIXME:InOverloadResolution=*/false, 3368f85e193739c953358c865005855253af4f68a497John McCall /*CStyle=*/Kind.isCStyleOrFunctionalCast(), 3369f85e193739c953358c865005855253af4f68a497John McCall /*AllowObjCWritebackConversion=*/false); 3370f85e193739c953358c865005855253af4f68a497John McCall 3371f85e193739c953358c865005855253af4f68a497John McCall if (ICS.isBad()) { 337220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Use the conversion function set stored in ICS to turn 337320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // this into an overloading ambiguity diagnostic. However, we need 337420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to keep that set as an OverloadCandidateSet rather than as some 337520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // other kind of set. 337618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 337718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetOverloadFailure( 337818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 337918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor ConvOvlResult); 33803afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 33813afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 338218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 338318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed); 338420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 3385f85e193739c953358c865005855253af4f68a497John McCall } else { 3386f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddConversionSequenceStep(ICS, TempEntity.getType()); 338720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 338820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 338920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // [...] If T1 is reference-related to T2, cv1 must be the 339020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // same cv-qualification as, or greater cv-qualification 339120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // than, cv2; otherwise, the program is ill-formed. 33925535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T1CVRQuals = T1Quals.getCVRQualifiers(); 33935535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T2CVRQuals = T2Quals.getCVRQualifiers(); 3394dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship == Sema::Ref_Related && 33955535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth (T1CVRQuals | T2CVRQuals) != T1CVRQuals) { 339620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 339720093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 339820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 339920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3400dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // [...] If T1 is reference-related to T2 and the reference is an rvalue 3401b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor // reference, the initializer expression shall not be an lvalue. 3402dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship >= Sema::Ref_Related && !isLValueRef && 3403b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitCategory.isLValue()) { 3404b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor Sequence.SetFailed( 3405b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitializationSequence::FK_RValueReferenceBindingToLValue); 3406b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor return; 3407b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor } 3408dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 340920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 341020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 341120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 341220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 341320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt character array initialization from a string literal 3414dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// (C++ [dcl.init.string], C99 6.7.8). 3415dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryStringLiteralInitialization(Sema &S, 341620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 341720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 341820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 341920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3420d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddStringInitStep(Entity.getType()); 342120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 342220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 342320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt initialization by constructor (C++ [dcl.init]), which 342420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// enumerates the constructors of the initialized entity and performs overload 342520093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// resolution to select the best. 3426dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryConstructorInitialization(Sema &S, 342720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 342820093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 342920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs, 343071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor QualType DestType, 343120093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3432898267f67b8131c4bed4430e2cfaf69ccf4c2de1Richard Trieu // Check constructor arguments for self reference. 3433898267f67b8131c4bed4430e2cfaf69ccf4c2de1Richard Trieu if (DeclaratorDecl *DD = Entity.getDecl()) 3434898267f67b8131c4bed4430e2cfaf69ccf4c2de1Richard Trieu // Parameters arguments are occassionially constructed with itself, 3435898267f67b8131c4bed4430e2cfaf69ccf4c2de1Richard Trieu // for instance, in recursive functions. Skip them. 3436898267f67b8131c4bed4430e2cfaf69ccf4c2de1Richard Trieu if (!isa<ParmVarDecl>(DD)) 3437898267f67b8131c4bed4430e2cfaf69ccf4c2de1Richard Trieu for (unsigned i = 0; i < NumArgs; ++i) 3438898267f67b8131c4bed4430e2cfaf69ccf4c2de1Richard Trieu S.CheckSelfReference(DD, Args[i]); 3439898267f67b8131c4bed4430e2cfaf69ccf4c2de1Richard Trieu 344051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build the candidate set directly in the initialization sequence 344151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // structure, so that it will persist if we fail. 344251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 344351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CandidateSet.clear(); 3444dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 344551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 344651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // explicit conversion operators. 344751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor bool AllowExplicit = (Kind.getKind() == InitializationKind::IK_Direct || 344851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Kind.getKind() == InitializationKind::IK_Value || 34492f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Kind.getKind() == InitializationKind::IK_Default); 3450087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor 3451087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // The type we're constructing needs to be complete. 3452087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 345372a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_Incomplete); 3454087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor return; 3455087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 3456dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 345751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 345851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // to see if one is suitable. 345951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor const RecordType *DestRecordType = DestType->getAs<RecordType>(); 3460dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi assert(DestRecordType && "Constructor initialization requires record type"); 346151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXRecordDecl *DestRecordDecl 346251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 3463dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 346451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 3465e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl); 346651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Con != ConEnd; ++Con) { 34679aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 34689aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 3469d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor bool SuppressUserConversions = false; 3470dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 347151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Find the constructor (which may be a template). 347251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor = 0; 34739aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 347451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 347551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 347651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 3477d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor else { 34789aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 3479d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor 3480dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // If we're performing copy initialization using a copy constructor, we 3481d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor // suppress user-defined conversions on the arguments. 3482d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor // FIXME: Move constructors? 3483d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Copy && 3484d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Constructor->isCopyConstructor()) 3485d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions = true; 3486d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor } 3487dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 348851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (!Constructor->isInvalidDecl() && 348999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (AllowExplicit || !Constructor->isExplicit())) { 349051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (ConstructorTmpl) 34919aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 349286820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 3493d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Args, NumArgs, CandidateSet, 3494d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions); 349551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor else 34969aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 3497d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor Args, NumArgs, CandidateSet, 3498d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor SuppressUserConversions); 349951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 3500dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 3501dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 350251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceLocation DeclLoc = Kind.getLocation(); 3503dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3504dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 350551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 3506dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (OverloadingResult Result 3507120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall = CandidateSet.BestViableFunction(S, DeclLoc, Best)) { 350851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Sequence.SetOverloadFailure( 3509dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializationSequence::FK_ConstructorOverloadFailed, 351051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Result); 351151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor return; 351251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 35139db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 35149db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // C++0x [dcl.init]p6: 35159db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // If a program calls for the default initialization of an object 35169db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // of a const-qualified type T, T shall be a class type with a 35179db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // user-provided default constructor. 35189db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 35199db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getType().isConstQualified() && 35209db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor cast<CXXConstructorDecl>(Best->Function)->isImplicit()) { 35219db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 35229db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor return; 35239db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 35249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 352551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Add the constructor initialization step. Any cv-qualification conversion is 352651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // subsumed by the initialization. 352722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 352822c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function); 352922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Sequence.AddConstructorInitializationStep(CtorDecl, 353022c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Best->FoundDecl.getAccess(), 353122c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara DestType, HadMultipleCandidates); 353220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 353320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 353471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor/// \brief Attempt value initialization (C++ [dcl.init]p7). 3535dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryValueInitialization(Sema &S, 353671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializedEntity &Entity, 353771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializationKind &Kind, 353871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor InitializationSequence &Sequence) { 353971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // C++ [dcl.init]p5: 354071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 354171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // To value-initialize an object of type T means: 3542d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType T = Entity.getType(); 3543dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 354471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is an array type, then each element is value-initialized; 354571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor while (const ArrayType *AT = S.Context.getAsArrayType(T)) 354671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor T = AT->getElementType(); 3547dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 354871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (const RecordType *RT = T->getAs<RecordType>()) { 354971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 355071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is a class type (clause 9) with a user-declared 355171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // constructor (12.1), then the default constructor for T is 355271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // called (and the initialization is ill-formed if T has no 355371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // accessible default constructor); 355471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 355571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // FIXME: we really want to refer to a single subobject of the array, 355671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // but Entity doesn't have a way to capture that (yet). 355771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (ClassDecl->hasUserDeclaredConstructor()) 355871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 3559dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 356016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // -- if T is a (possibly cv-qualified) non-union class type 356116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // without a user-provided constructor, then the object is 35620099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi // zero-initialized and, if T's implicitly-declared default 356316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // constructor is non-trivial, that constructor is called. 3564465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if ((ClassDecl->getTagKind() == TTK_Class || 3565ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor ClassDecl->getTagKind() == TTK_Struct)) { 3566d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 3567dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 356816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 356971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 357071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 357171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 3572d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 357371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 357471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 357599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor/// \brief Attempt default initialization (C++ [dcl.init]p6). 357699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregorstatic void TryDefaultInitialization(Sema &S, 357799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializedEntity &Entity, 357899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializationKind &Kind, 357999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitializationSequence &Sequence) { 358099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(Kind.getKind() == InitializationKind::IK_Default); 3581dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 358299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // C++ [dcl.init]p6: 358399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // To default-initialize an object of type T means: 358499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is an array type, each element is default-initialized; 3585f85e193739c953358c865005855253af4f68a497John McCall QualType DestType = S.Context.getBaseElementType(Entity.getType()); 3586f85e193739c953358c865005855253af4f68a497John McCall 358799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is a (possibly cv-qualified) class type (Clause 9), the default 358899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // constructor for T is called (and the initialization is ill-formed if 358999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // T has no accessible default constructor); 359060c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (DestType->isRecordType() && S.getLangOptions().CPlusPlus) { 35914e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth TryConstructorInitialization(S, Entity, Kind, 0, 0, DestType, Sequence); 35924e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth return; 359399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 3594dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 359599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - otherwise, no initialization is performed. 3596dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 359799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // If a program calls for the default initialization of an object of 3598dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // a const-qualified type T, T shall be a class type with a user-provided 359999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // default constructor. 3600f85e193739c953358c865005855253af4f68a497John McCall if (DestType.isConstQualified() && S.getLangOptions().CPlusPlus) { 360199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 3602f85e193739c953358c865005855253af4f68a497John McCall return; 3603f85e193739c953358c865005855253af4f68a497John McCall } 3604f85e193739c953358c865005855253af4f68a497John McCall 3605f85e193739c953358c865005855253af4f68a497John McCall // If the destination type has a lifetime property, zero-initialize it. 3606f85e193739c953358c865005855253af4f68a497John McCall if (DestType.getQualifiers().hasObjCLifetime()) { 3607f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddZeroInitializationStep(Entity.getType()); 3608f85e193739c953358c865005855253af4f68a497John McCall return; 3609f85e193739c953358c865005855253af4f68a497John McCall } 361099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 361199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 361220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]), 361320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// which enumerates all conversion functions and performs overload resolution 361420093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// to select the best. 3615dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryUserDefinedConversion(Sema &S, 361620093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 361720093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 361820093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 361920093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3620d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 36214a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert(!DestType->isReferenceType() && "References are handled elsewhere"); 36224a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType SourceType = Initializer->getType(); 36234a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert((DestType->isRecordType() || SourceType->isRecordType()) && 36244a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor "Must have a class type to perform a user-defined conversion"); 3625dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 36264a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Build the candidate set directly in the initialization sequence 36274a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // structure, so that it will persist if we fail. 36284a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 36294a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CandidateSet.clear(); 3630dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 36314a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Determine whether we are allowed to call explicit constructors or 36324a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // explicit conversion operators. 36334a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor bool AllowExplicit = Kind.getKind() == InitializationKind::IK_Direct; 3634dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 36354a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) { 36364a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting to is a class type. Enumerate its constructors 36374a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // to see if there is a suitable conversion. 36384a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXRecordDecl *DestRecordDecl 36394a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 3640dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3641087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Try to complete the type we're converting to. 3642dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (!S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 3643087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 3644e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl); 3645087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Con != ConEnd; ++Con) { 3646087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor NamedDecl *D = *Con; 3647087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 3648dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3649087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Find the constructor (which may be a template). 3650087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor CXXConstructorDecl *Constructor = 0; 3651087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor FunctionTemplateDecl *ConstructorTmpl 3652087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor = dyn_cast<FunctionTemplateDecl>(D); 36534a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 3654087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>( 3655087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 36564712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor else 3657087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>(D); 3658dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3659087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (!Constructor->isInvalidDecl() && 3660087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 3661087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (ConstructorTmpl) 3662087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 3663087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor /*ExplicitArgs*/ 0, 3664087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor &Initializer, 1, CandidateSet, 36654712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 3666087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor else 3667087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddOverloadCandidate(Constructor, FoundDecl, 3668087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor &Initializer, 1, CandidateSet, 36694712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 3670087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 3671dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 3672087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 36734a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 3674cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3675cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman SourceLocation DeclLoc = Initializer->getLocStart(); 3676cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 36774a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) { 36784a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting from is a class type, enumerate its conversion 36794a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // functions. 3680cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 368133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // We can only enumerate the conversion functions for a complete type; if 368233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // the type isn't complete, simply skip this step. 368333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (!S.RequireCompleteType(DeclLoc, SourceType, 0)) { 368433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *SourceRecordDecl 368533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = cast<CXXRecordDecl>(SourceRecordType->getDecl()); 3686dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3687eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 368833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = SourceRecordDecl->getVisibleConversionFunctions(); 3689eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 3690dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi E = Conversions->end(); 369133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman I != E; ++I) { 369233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman NamedDecl *D = *I; 369333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 369433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (isa<UsingShadowDecl>(D)) 369533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman D = cast<UsingShadowDecl>(D)->getTargetDecl(); 3696dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 369733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 369833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXConversionDecl *Conv; 36994a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConvTemplate) 370033c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 37014a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 370232daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall Conv = cast<CXXConversionDecl>(D); 3703dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 370433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (AllowExplicit || !Conv->isExplicit()) { 370533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (ConvTemplate) 37069aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 370786820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, DestType, 370833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CandidateSet); 370933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman else 37109aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 371186820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Initializer, DestType, CandidateSet); 371233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman } 37134a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 37144a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 37154a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 3716dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3717dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 37184a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet::iterator Best; 37191d31833450e6d2947a33cb0840d87661d92eec07John McCall if (OverloadingResult Result 37208fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) { 37214a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.SetOverloadFailure( 3722dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializationSequence::FK_UserConversionOverloadFailed, 37234a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Result); 37244a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 37254a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 37261d31833450e6d2947a33cb0840d87661d92eec07John McCall 37274a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionDecl *Function = Best->Function; 372825ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth S.MarkDeclarationReferenced(DeclLoc, Function); 372922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 3730dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37314a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (isa<CXXConstructorDecl>(Function)) { 37324a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step. Any cv-qualification conversion is 37334a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // subsumed by the initialization. 373422c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType, 373522c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 37364a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 37374a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 37384a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 37394a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step that calls the conversion function. 37405291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor QualType ConvType = Function->getCallResultType(); 37413fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor if (ConvType->getAs<RecordType>()) { 37423fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If we're converting to a class type, there may be an copy if 37433fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // the resulting temporary object (possible to create an object of 37443fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // a base class type). That copy is not a separate conversion, so 37453fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // we just make a note of the actual destination type (possibly a 37463fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // base class of the type returned by the conversion function) and 37473fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // let the user-defined conversion step handle the conversion. 374822c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType, 374922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 37503fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor return; 37513fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor } 37524a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 375322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType, 375422c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 3755dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37563fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If the conversion following the call to the conversion function 37573fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // is interesting, add it as a separate step. 37584a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (Best->FinalConversion.First || Best->FinalConversion.Second || 37594a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Best->FinalConversion.Third) { 37604a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ImplicitConversionSequence ICS; 37611d31833450e6d2947a33cb0840d87661d92eec07John McCall ICS.setStandard(); 37624a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ICS.Standard = Best->FinalConversion; 37634a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.AddConversionSequenceStep(ICS, DestType); 37644a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 376520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 376620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3767f85e193739c953358c865005855253af4f68a497John McCall/// The non-zero enum values here are indexes into diagnostic alternatives. 3768f85e193739c953358c865005855253af4f68a497John McCallenum InvalidICRKind { IIK_okay, IIK_nonlocal, IIK_nonscalar }; 3769f85e193739c953358c865005855253af4f68a497John McCall 3770f85e193739c953358c865005855253af4f68a497John McCall/// Determines whether this expression is an acceptable ICR source. 3771c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCallstatic InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e, 3772c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall bool isAddressOf) { 3773f85e193739c953358c865005855253af4f68a497John McCall // Skip parens. 3774f85e193739c953358c865005855253af4f68a497John McCall e = e->IgnoreParens(); 3775f85e193739c953358c865005855253af4f68a497John McCall 3776f85e193739c953358c865005855253af4f68a497John McCall // Skip address-of nodes. 3777f85e193739c953358c865005855253af4f68a497John McCall if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) { 3778f85e193739c953358c865005855253af4f68a497John McCall if (op->getOpcode() == UO_AddrOf) 3779c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true); 3780f85e193739c953358c865005855253af4f68a497John McCall 3781f85e193739c953358c865005855253af4f68a497John McCall // Skip certain casts. 3782c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) { 3783c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall switch (ce->getCastKind()) { 3784f85e193739c953358c865005855253af4f68a497John McCall case CK_Dependent: 3785f85e193739c953358c865005855253af4f68a497John McCall case CK_BitCast: 3786f85e193739c953358c865005855253af4f68a497John McCall case CK_LValueBitCast: 3787f85e193739c953358c865005855253af4f68a497John McCall case CK_NoOp: 3788c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf); 3789f85e193739c953358c865005855253af4f68a497John McCall 3790f85e193739c953358c865005855253af4f68a497John McCall case CK_ArrayToPointerDecay: 3791f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonscalar; 3792f85e193739c953358c865005855253af4f68a497John McCall 3793f85e193739c953358c865005855253af4f68a497John McCall case CK_NullToPointer: 3794f85e193739c953358c865005855253af4f68a497John McCall return IIK_okay; 3795f85e193739c953358c865005855253af4f68a497John McCall 3796f85e193739c953358c865005855253af4f68a497John McCall default: 3797f85e193739c953358c865005855253af4f68a497John McCall break; 3798f85e193739c953358c865005855253af4f68a497John McCall } 3799f85e193739c953358c865005855253af4f68a497John McCall 3800f85e193739c953358c865005855253af4f68a497John McCall // If we have a declaration reference, it had better be a local variable. 3801c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else if (isa<DeclRefExpr>(e) || isa<BlockDeclRefExpr>(e)) { 3802c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (!isAddressOf) return IIK_nonlocal; 3803c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall 3804c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall VarDecl *var; 3805c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (isa<DeclRefExpr>(e)) { 3806c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl()); 3807c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (!var) return IIK_nonlocal; 3808c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else { 3809c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall var = cast<BlockDeclRefExpr>(e)->getDecl(); 3810c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } 3811c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall 3812c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal); 3813f85e193739c953358c865005855253af4f68a497John McCall 3814f85e193739c953358c865005855253af4f68a497John McCall // If we have a conditional operator, check both sides. 3815f85e193739c953358c865005855253af4f68a497John McCall } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) { 3816c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf)) 3817f85e193739c953358c865005855253af4f68a497John McCall return iik; 3818f85e193739c953358c865005855253af4f68a497John McCall 3819c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return isInvalidICRSource(C, cond->getRHS(), isAddressOf); 3820f85e193739c953358c865005855253af4f68a497John McCall 3821f85e193739c953358c865005855253af4f68a497John McCall // These are never scalar. 3822f85e193739c953358c865005855253af4f68a497John McCall } else if (isa<ArraySubscriptExpr>(e)) { 3823f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonscalar; 3824f85e193739c953358c865005855253af4f68a497John McCall 3825f85e193739c953358c865005855253af4f68a497John McCall // Otherwise, it needs to be a null pointer constant. 3826f85e193739c953358c865005855253af4f68a497John McCall } else { 3827f85e193739c953358c865005855253af4f68a497John McCall return (e->isNullPointerConstant(C, Expr::NPC_ValueDependentIsNull) 3828f85e193739c953358c865005855253af4f68a497John McCall ? IIK_okay : IIK_nonlocal); 3829f85e193739c953358c865005855253af4f68a497John McCall } 3830f85e193739c953358c865005855253af4f68a497John McCall 3831f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonlocal; 3832f85e193739c953358c865005855253af4f68a497John McCall} 3833f85e193739c953358c865005855253af4f68a497John McCall 3834f85e193739c953358c865005855253af4f68a497John McCall/// Check whether the given expression is a valid operand for an 3835f85e193739c953358c865005855253af4f68a497John McCall/// indirect copy/restore. 3836f85e193739c953358c865005855253af4f68a497John McCallstatic void checkIndirectCopyRestoreSource(Sema &S, Expr *src) { 3837f85e193739c953358c865005855253af4f68a497John McCall assert(src->isRValue()); 3838f85e193739c953358c865005855253af4f68a497John McCall 3839c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall InvalidICRKind iik = isInvalidICRSource(S.Context, src, false); 3840f85e193739c953358c865005855253af4f68a497John McCall if (iik == IIK_okay) return; 3841f85e193739c953358c865005855253af4f68a497John McCall 3842f85e193739c953358c865005855253af4f68a497John McCall S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback) 3843f85e193739c953358c865005855253af4f68a497John McCall << ((unsigned) iik - 1) // shift index into diagnostic explanations 3844f85e193739c953358c865005855253af4f68a497John McCall << src->getSourceRange(); 3845f85e193739c953358c865005855253af4f68a497John McCall} 3846f85e193739c953358c865005855253af4f68a497John McCall 3847cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor/// \brief Determine whether we have compatible array types for the 3848cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor/// purposes of GNU by-copy array initialization. 3849cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregorstatic bool hasCompatibleArrayTypes(ASTContext &Context, 3850cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *Dest, 3851cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *Source) { 3852cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // If the source and destination array types are equivalent, we're 3853cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // done. 3854cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0))) 3855cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return true; 3856cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3857cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Make sure that the element types are the same. 3858cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!Context.hasSameType(Dest->getElementType(), Source->getElementType())) 3859cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return false; 3860cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3861cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // The only mismatch we allow is when the destination is an 3862cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // incomplete array type and the source is a constant array type. 3863cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return Source->isConstantArrayType() && Dest->isIncompleteArrayType(); 3864cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor} 3865cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3866f85e193739c953358c865005855253af4f68a497John McCallstatic bool tryObjCWritebackConversion(Sema &S, 3867f85e193739c953358c865005855253af4f68a497John McCall InitializationSequence &Sequence, 3868f85e193739c953358c865005855253af4f68a497John McCall const InitializedEntity &Entity, 3869f85e193739c953358c865005855253af4f68a497John McCall Expr *Initializer) { 3870f85e193739c953358c865005855253af4f68a497John McCall bool ArrayDecay = false; 3871f85e193739c953358c865005855253af4f68a497John McCall QualType ArgType = Initializer->getType(); 3872f85e193739c953358c865005855253af4f68a497John McCall QualType ArgPointee; 3873f85e193739c953358c865005855253af4f68a497John McCall if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) { 3874f85e193739c953358c865005855253af4f68a497John McCall ArrayDecay = true; 3875f85e193739c953358c865005855253af4f68a497John McCall ArgPointee = ArgArrayType->getElementType(); 3876f85e193739c953358c865005855253af4f68a497John McCall ArgType = S.Context.getPointerType(ArgPointee); 3877f85e193739c953358c865005855253af4f68a497John McCall } 3878f85e193739c953358c865005855253af4f68a497John McCall 3879f85e193739c953358c865005855253af4f68a497John McCall // Handle write-back conversion. 3880f85e193739c953358c865005855253af4f68a497John McCall QualType ConvertedArgType; 3881f85e193739c953358c865005855253af4f68a497John McCall if (!S.isObjCWritebackConversion(ArgType, Entity.getType(), 3882f85e193739c953358c865005855253af4f68a497John McCall ConvertedArgType)) 3883f85e193739c953358c865005855253af4f68a497John McCall return false; 3884f85e193739c953358c865005855253af4f68a497John McCall 3885f85e193739c953358c865005855253af4f68a497John McCall // We should copy unless we're passing to an argument explicitly 3886f85e193739c953358c865005855253af4f68a497John McCall // marked 'out'. 3887f85e193739c953358c865005855253af4f68a497John McCall bool ShouldCopy = true; 3888f85e193739c953358c865005855253af4f68a497John McCall if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl())) 3889f85e193739c953358c865005855253af4f68a497John McCall ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out); 3890f85e193739c953358c865005855253af4f68a497John McCall 3891f85e193739c953358c865005855253af4f68a497John McCall // Do we need an lvalue conversion? 3892f85e193739c953358c865005855253af4f68a497John McCall if (ArrayDecay || Initializer->isGLValue()) { 3893f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS; 3894f85e193739c953358c865005855253af4f68a497John McCall ICS.setStandard(); 3895f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.setAsIdentityConversion(); 3896f85e193739c953358c865005855253af4f68a497John McCall 3897f85e193739c953358c865005855253af4f68a497John McCall QualType ResultType; 3898f85e193739c953358c865005855253af4f68a497John McCall if (ArrayDecay) { 3899f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First = ICK_Array_To_Pointer; 3900f85e193739c953358c865005855253af4f68a497John McCall ResultType = S.Context.getPointerType(ArgPointee); 3901f85e193739c953358c865005855253af4f68a497John McCall } else { 3902f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First = ICK_Lvalue_To_Rvalue; 3903f85e193739c953358c865005855253af4f68a497John McCall ResultType = Initializer->getType().getNonLValueExprType(S.Context); 3904f85e193739c953358c865005855253af4f68a497John McCall } 3905f85e193739c953358c865005855253af4f68a497John McCall 3906f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddConversionSequenceStep(ICS, ResultType); 3907f85e193739c953358c865005855253af4f68a497John McCall } 3908f85e193739c953358c865005855253af4f68a497John McCall 3909f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy); 3910f85e193739c953358c865005855253af4f68a497John McCall return true; 3911f85e193739c953358c865005855253af4f68a497John McCall} 3912f85e193739c953358c865005855253af4f68a497John McCall 391320093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::InitializationSequence(Sema &S, 391420093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 391520093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 391620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, 39175769d6195087229770d7ac90449443e026c47103John McCall unsigned NumArgs) 39185769d6195087229770d7ac90449443e026c47103John McCall : FailedCandidateSet(Kind.getLocation()) { 391912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola ASTContext &Context = S.Context; 3920dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 392120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init]p16: 3922dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // The semantics of initializers are as follows. The destination type is 3923dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // the type of the object or reference being initialized and the source 392420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type is the type of the initializer expression. The source type is not 3925dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // defined when the initializer is a braced-init-list or when it is a 392620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // parenthesized list of expressions. 392712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola QualType DestType = Entity.getType(); 392820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 392912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola if (DestType->isDependentType() || 393020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 393120093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = DependentSequence; 393220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 393320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 393420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 39357491c499e826682e128a400038361ebcbde30eecSebastian Redl // Almost everything is a normal sequence. 39367491c499e826682e128a400038361ebcbde30eecSebastian Redl setSequenceKind(NormalSequence); 39377491c499e826682e128a400038361ebcbde30eecSebastian Redl 3938241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall for (unsigned I = 0; I != NumArgs; ++I) 393932509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall if (Args[I]->getType()->isNonOverloadPlaceholderType()) { 39405acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall // FIXME: should we be doing this here? 394132509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall ExprResult result = S.CheckPlaceholderExpr(Args[I]); 394232509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall if (result.isInvalid()) { 394332509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall SetFailed(FK_PlaceholderType); 394432509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall return; 39455acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall } 394632509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall Args[I] = result.take(); 3947429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 3948241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall 39495acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 395020093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType SourceType; 395120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer = 0; 395299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs == 1) { 395320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer = Args[0]; 395420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!isa<InitListExpr>(Initializer)) 395520093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceType = Initializer->getType(); 395620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3957dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3958dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the initializer is a braced-init-list, the object is 395920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // list-initialized (8.5.4). 396020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) { 396112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryListInitialization(S, Entity, Kind, InitList, *this); 3962d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor return; 396320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3964dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 396520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a reference type, see 8.5.3. 396620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isReferenceType()) { 396720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p1: 396820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A variable declared to be a T& or T&&, that is, "reference to type T" 396920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (8.3.2), shall be initialized by an object, or function, of type T or 397020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // by an object that can be converted into a T. 397120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (Therefore, multiple arguments are not permitted.) 397220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (NumArgs != 1) 397312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_TooManyInitsForReference); 397420093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 397512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryReferenceInitialization(S, Entity, Kind, Args[0], *this); 397620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 397720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3978dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 397920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is (), the object is value-initialized. 398099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Value || 398199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct && NumArgs == 0)) { 398212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryValueInitialization(S, Entity, Kind, *this); 398320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 398420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3985dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 398699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Handle default initialization. 39877663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky if (Kind.getKind() == InitializationKind::IK_Default) { 398812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryDefaultInitialization(S, Entity, Kind, *this); 398999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 399099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 399118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 3992ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // - If the destination type is an array of characters, an array of 3993ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // char16_t, an array of char32_t, or an array of wchar_t, and the 3994ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // initializer is a string literal, see 8.5.2. 3995dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the destination type is an array, the program is 399620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // ill-formed. 3997cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const ArrayType *DestAT = Context.getAsArrayType(DestType)) { 3998cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (Initializer && IsStringInit(Initializer, DestAT, Context)) { 399912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this); 4000ce6c9b7da219c8640a0559f75770cfc6622de083John McCall return; 4001ce6c9b7da219c8640a0559f75770cfc6622de083John McCall } 4002ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 4003cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Note: as an GNU C extension, we allow initialization of an 4004cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // array from a compound literal that creates an array of the same 4005cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // type, so long as the initializer has no side effects. 4006cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!S.getLangOptions().CPlusPlus && Initializer && 4007cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) && 4008cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Initializer->getType()->isArrayType()) { 4009cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *SourceAT 4010cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor = Context.getAsArrayType(Initializer->getType()); 4011cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT)) 401212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayTypeMismatch); 4013cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor else if (Initializer->HasSideEffects(S.Context)) 401412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_NonConstantArrayInit); 4015cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor else { 401612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddArrayInitStep(DestType); 4017cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 4018cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } else if (DestAT->getElementType()->isAnyCharacterType()) 401912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayNeedsInitListOrStringLiteral); 402020093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 402112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayNeedsInitList); 4022dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 402320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 402420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4025cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 4026f85e193739c953358c865005855253af4f68a497John McCall // Determine whether we should consider writeback conversions for 4027f85e193739c953358c865005855253af4f68a497John McCall // Objective-C ARC. 4028f85e193739c953358c865005855253af4f68a497John McCall bool allowObjCWritebackConversion = S.getLangOptions().ObjCAutoRefCount && 4029f85e193739c953358c865005855253af4f68a497John McCall Entity.getKind() == InitializedEntity::EK_Parameter; 4030f85e193739c953358c865005855253af4f68a497John McCall 4031f85e193739c953358c865005855253af4f68a497John McCall // We're at the end of the line for C: it's either a write-back conversion 4032f85e193739c953358c865005855253af4f68a497John McCall // or it's a C assignment. There's no need to check anything else. 4033cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman if (!S.getLangOptions().CPlusPlus) { 4034f85e193739c953358c865005855253af4f68a497John McCall // If allowed, check whether this is an Objective-C writeback conversion. 4035f85e193739c953358c865005855253af4f68a497John McCall if (allowObjCWritebackConversion && 403612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola tryObjCWritebackConversion(S, *this, Entity, Initializer)) { 4037f85e193739c953358c865005855253af4f68a497John McCall return; 4038f85e193739c953358c865005855253af4f68a497John McCall } 4039f85e193739c953358c865005855253af4f68a497John McCall 4040f85e193739c953358c865005855253af4f68a497John McCall // Handle initialization in C 404112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddCAssignmentStep(DestType); 404212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 4043cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman return; 4044cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 4045dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4046f85e193739c953358c865005855253af4f68a497John McCall assert(S.getLangOptions().CPlusPlus); 4047f85e193739c953358c865005855253af4f68a497John McCall 404820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a (possibly cv-qualified) class type: 404920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isRecordType()) { 4050dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the initialization is direct-initialization, or if it is 4051dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy-initialization where the cv-unqualified version of the 4052dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // source type is the same class as, or a derived class of, the 405320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // class of the destination, constructors are considered. [...] 405420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Direct || 405520093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Kind.getKind() == InitializationKind::IK_Copy && 405620093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Context.hasSameUnqualifiedType(SourceType, DestType) || 405720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.IsDerivedFrom(SourceType, DestType)))) 4058dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TryConstructorInitialization(S, Entity, Kind, Args, NumArgs, 405912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Entity.getType(), *this); 4060dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise (i.e., for the remaining copy-initialization cases), 406120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // user-defined conversion sequences that can convert from the source 4062dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // type to the destination type or (when a conversion function is 406320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // used) to a derived class thereof are enumerated as described in 406420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 13.3.1.4, and the best one is chosen through overload resolution 406520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (13.3). 406620093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 406712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 406820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 406920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4070dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 407199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs > 1) { 407212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_TooManyInitsForScalar); 407399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 407499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 407599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(NumArgs == 1 && "Zero-argument case handled above"); 4076dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4077dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the source type is a (possibly cv-qualified) class 407820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type, conversion functions are considered. 407999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (!SourceType.isNull() && SourceType->isRecordType()) { 408012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 408112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 408220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 408320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4084dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 408520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the initial value of the object being initialized is the 40864a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // (possibly converted) value of the initializer expression. Standard 408720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversions (Clause 4) will be used, if necessary, to convert the 4088dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // initializer expression to the cv-unqualified version of the 408920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // destination type; no user-defined conversions are considered. 4090f85e193739c953358c865005855253af4f68a497John McCall 4091f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS 4092f85e193739c953358c865005855253af4f68a497John McCall = S.TryImplicitConversion(Initializer, Entity.getType(), 4093f85e193739c953358c865005855253af4f68a497John McCall /*SuppressUserConversions*/true, 4094369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*AllowExplicitConversions*/ false, 409514d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*InOverloadResolution*/ false, 4096f85e193739c953358c865005855253af4f68a497John McCall /*CStyle=*/Kind.isCStyleOrFunctionalCast(), 4097f85e193739c953358c865005855253af4f68a497John McCall allowObjCWritebackConversion); 4098f85e193739c953358c865005855253af4f68a497John McCall 4099f85e193739c953358c865005855253af4f68a497John McCall if (ICS.isStandard() && 4100f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.Second == ICK_Writeback_Conversion) { 4101f85e193739c953358c865005855253af4f68a497John McCall // Objective-C ARC writeback conversion. 4102f85e193739c953358c865005855253af4f68a497John McCall 4103f85e193739c953358c865005855253af4f68a497John McCall // We should copy unless we're passing to an argument explicitly 4104f85e193739c953358c865005855253af4f68a497John McCall // marked 'out'. 4105f85e193739c953358c865005855253af4f68a497John McCall bool ShouldCopy = true; 4106f85e193739c953358c865005855253af4f68a497John McCall if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl())) 4107f85e193739c953358c865005855253af4f68a497John McCall ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out); 4108f85e193739c953358c865005855253af4f68a497John McCall 4109f85e193739c953358c865005855253af4f68a497John McCall // If there was an lvalue adjustment, add it as a separate conversion. 4110f85e193739c953358c865005855253af4f68a497John McCall if (ICS.Standard.First == ICK_Array_To_Pointer || 4111f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First == ICK_Lvalue_To_Rvalue) { 4112f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence LvalueICS; 4113f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.setStandard(); 4114f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.setAsIdentityConversion(); 4115f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0)); 4116f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.First = ICS.Standard.First; 411712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0)); 4118f85e193739c953358c865005855253af4f68a497John McCall } 411912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 412012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy); 4121f85e193739c953358c865005855253af4f68a497John McCall } else if (ICS.isBad()) { 41221be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor DeclAccessPair dap; 41231be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor if (Initializer->getType() == Context.OverloadTy && 41241be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor !S.ResolveAddressOfOverloadedFunction(Initializer 41251be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor , DestType, false, dap)) 412612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 41278e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor else 412812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(InitializationSequence::FK_ConversionFailed); 4129f85e193739c953358c865005855253af4f68a497John McCall } else { 413012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddConversionSequenceStep(ICS, Entity.getType()); 4131856d3798af7c2f7251e4a295f3da7a09ce4c62abJohn McCall 413212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 41338e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor } 413420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 413520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 413620093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::~InitializationSequence() { 41375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner for (SmallVectorImpl<Step>::iterator Step = Steps.begin(), 413820093b4bf698f292c664676987541d5103b65b15Douglas Gregor StepEnd = Steps.end(); 413920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) 414020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Destroy(); 414120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 414220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 414320093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 414420093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Perform initialization 414520093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 4146dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic Sema::AssignmentAction 414718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorgetAssignmentAction(const InitializedEntity &Entity) { 414818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch(Entity.getKind()) { 414918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 415018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 4151a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Exception: 4152a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Base: 4153059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 415418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 415518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 415618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 4157dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (Entity.getDecl() && 4158688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext())) 4159688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor return Sema::AA_Sending; 4160688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor 416118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Passing; 416218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 416318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 416418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Returning; 416518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 416618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 416718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell apart casting vs. converting? 416818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Casting; 4169dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 417018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Member: 4171d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_ArrayElement: 4172d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 41730c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4174310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 417518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 417618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 417718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 417818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Converting; 417918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 418018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 41814154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether we should binding a created object as a temporary when 41824154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// initializing the given entity. 41832f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregorstatic bool shouldBindAsTemporary(const InitializedEntity &Entity) { 418418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 41851b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 41861b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 41872f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor case InitializedEntity::EK_Result: 418818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 418918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 419018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 4191059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 4192d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 41930c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4194a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson case InitializedEntity::EK_Exception: 4195310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 419618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return false; 4197dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 419818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 419918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 420018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return true; 420118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 4202dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 420318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("missed an InitializedEntity kind?"); 420418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 420518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 42064154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether the given entity, when initialized with an object 42074154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// created for that initialization, requires destruction. 42084154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregorstatic bool shouldDestroyTemporary(const InitializedEntity &Entity) { 42094154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor switch (Entity.getKind()) { 42104154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Member: 42114154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Result: 42124154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_New: 42134154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Base: 4214059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 42154154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_VectorElement: 42160c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4217310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 42184154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return false; 4219dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 42204154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Variable: 42214154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Parameter: 42224154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Temporary: 42234154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_ArrayElement: 42244154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Exception: 42254154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return true; 42264154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 4227dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4228dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi llvm_unreachable("missed an InitializedEntity kind?"); 42294154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor} 42304154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 423183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Look for copy and move constructors and constructor templates, for 423283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// copying an object via direct-initialization (per C++11 [dcl.init]p16). 423383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void LookupCopyAndMoveConstructors(Sema &S, 423483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet &CandidateSet, 423583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CXXRecordDecl *Class, 423683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr) { 423783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith DeclContext::lookup_iterator Con, ConEnd; 423883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith for (llvm::tie(Con, ConEnd) = S.LookupConstructors(Class); 423983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Con != ConEnd; ++Con) { 424083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CXXConstructorDecl *Constructor = 0; 424183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 424283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if ((Constructor = dyn_cast<CXXConstructorDecl>(*Con))) { 424383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Handle copy/moveconstructors, only. 424483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Constructor || Constructor->isInvalidDecl() || 424583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith !Constructor->isCopyOrMoveConstructor() || 424683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith !Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 424783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 424883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 424983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith DeclAccessPair FoundDecl 425083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith = DeclAccessPair::make(Constructor, Constructor->getAccess()); 425183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.AddOverloadCandidate(Constructor, FoundDecl, 425283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith &CurInitExpr, 1, CandidateSet); 425383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 425483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 425583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 425683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Handle constructor templates. 425783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith FunctionTemplateDecl *ConstructorTmpl = cast<FunctionTemplateDecl>(*Con); 425883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (ConstructorTmpl->isInvalidDecl()) 425983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 426083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 426183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Constructor = cast<CXXConstructorDecl>( 426283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith ConstructorTmpl->getTemplatedDecl()); 426383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 426483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 426583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 426683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // FIXME: Do we need to limit this to copy-constructor-like 426783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // candidates? 426883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith DeclAccessPair FoundDecl 426983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith = DeclAccessPair::make(ConstructorTmpl, ConstructorTmpl->getAccess()); 427083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 0, 427183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith &CurInitExpr, 1, CandidateSet, true); 427283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 427383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 427483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 427583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Get the location at which initialization diagnostics should appear. 427683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic SourceLocation getInitializationLoc(const InitializedEntity &Entity, 427783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *Initializer) { 427883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith switch (Entity.getKind()) { 427983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Result: 428083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getReturnLoc(); 428183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 428283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Exception: 428383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getThrowLoc(); 428483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 428583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Variable: 428683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getDecl()->getLocation(); 428783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 428883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_ArrayElement: 428983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Member: 429083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Parameter: 429183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Temporary: 429283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_New: 429383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Base: 429483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Delegating: 429583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_VectorElement: 429683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_ComplexElement: 429783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_BlockElement: 429883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Initializer->getLocStart(); 429983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 430083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith llvm_unreachable("missed an InitializedEntity kind?"); 430183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 430283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 4303523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \brief Make a (potentially elidable) temporary copy of the object 4304523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// provided by the given initializer by calling the appropriate copy 4305523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// constructor. 4306523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4307523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param S The Sema object used for type-checking. 4308523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 430963e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// \param T The type of the temporary object, which must either be 4310523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// the type of the initializer expression or a superclass thereof. 4311523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4312523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param Enter The entity being initialized. 4313523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4314523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param CurInit The initializer expression. 4315523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4316523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param IsExtraneousCopy Whether this is an "extraneous" copy that 4317523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// is permitted in C++03 (but not C++0x) when binding a reference to 4318523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// an rvalue. 4319523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4320523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \returns An expression that copies the initializer expression into 4321523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// a temporary object, or an error expression if a copy could not be 4322523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// created. 432360d7b3a319d84d688752be3870615ac0f111fb16John McCallstatic ExprResult CopyObject(Sema &S, 43248fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor QualType T, 43258fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor const InitializedEntity &Entity, 43268fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor ExprResult CurInit, 43278fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor bool IsExtraneousCopy) { 43283fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine which class type we're copying to. 43291b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Expr *CurInitExpr = (Expr *)CurInit.get(); 4330dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXRecordDecl *Class = 0; 4331523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) 43322f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Class = cast<CXXRecordDecl>(Record->getDecl()); 43332f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (!Class) 43342f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor return move(CurInit); 43352f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 4336f5d8f466c3eebaffc51468812bdcbe7f0fe4891aDouglas Gregor // C++0x [class.copy]p32: 43372f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // When certain criteria are met, an implementation is allowed to 43382f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // omit the copy/move construction of a class object, even if the 43392f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // copy/move constructor and/or destructor for the object have 43402f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // side effects. [...] 43412f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // - when a temporary class object that has not been bound to a 43422f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // reference (12.2) would be copied/moved to a class object 43432f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // with the same cv-unqualified type, the copy/move operation 43442f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // can be omitted by constructing the temporary object 43452f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // directly into the target of the omitted copy/move 4346dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // 43472f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // Note that the other three bullets are handled elsewhere. Copy 43483c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // elision for return statements and throw expressions are handled as part 4349dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // of constructor initialization, while copy elision for exception handlers 43503c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // is handled by the run-time. 4351558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall bool Elidable = CurInitExpr->isTemporaryObject(S.Context, Class); 435283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith SourceLocation Loc = getInitializationLoc(Entity, CurInit.get()); 4353f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 4354dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Make sure that the type we are copying is complete. 4355f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor if (S.RequireCompleteType(Loc, T, S.PDiag(diag::err_temp_copy_incomplete))) 4356f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor return move(CurInit); 4357f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 4358cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Perform overload resolution using the class's copy/move constructors. 435983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Only consider constructors and constructor templates. Per 436083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // C++0x [dcl.init]p16, second bullet to class types, this initialization 436183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // is direct-initialization. 43625769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 436383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith LookupCopyAndMoveConstructors(S, CandidateSet, Class, CurInitExpr); 4364dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 43657cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 43667cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 436718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OverloadCandidateSet::iterator Best; 436825ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth switch (CandidateSet.BestViableFunction(S, Loc, Best)) { 436918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Success: 437018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 4371dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 437218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_No_Viable_Function: 437357d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin S.Diag(Loc, IsExtraneousCopy && !S.isSFINAEContext() 437457d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin ? diag::ext_rvalue_to_reference_temp_copy_no_viable 437557d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin : diag::err_temp_copy_no_viable) 43767abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 437718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 4378120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall CandidateSet.NoteCandidates(S, OCD_AllCandidates, &CurInitExpr, 1); 437957d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin if (!IsExtraneousCopy || S.isSFINAEContext()) 4380f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 438157d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin return move(CurInit); 4382dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 438318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Ambiguous: 438418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_ambiguous) 43857abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 438618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 4387120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall CandidateSet.NoteCandidates(S, OCD_ViableCandidates, &CurInitExpr, 1); 4388f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4389dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 439018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Deleted: 439118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_deleted) 43927abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 439318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 439418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 4395f85e193739c953358c865005855253af4f68a497John McCall << 1 << Best->Function->isDeleted(); 4396f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 439718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 439818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 43993fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function); 4400ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 44013fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 4402523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 44039a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 440457d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin Best->FoundDecl.getAccess(), IsExtraneousCopy); 4405523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 4406523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (IsExtraneousCopy) { 4407523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // If this is a totally extraneous copy for C++03 reference 4408523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // binding purposes, just return the original initialization 44092559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // expression. We don't generate an (elided) copy operation here 44102559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // because doing so would require us to pass down a flag to avoid 44112559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // infinite recursion, where each step adds another extraneous, 44122559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // elidable copy. 44132559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 44142559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Instantiate the default arguments of any extra parameters in 44152559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // the selected copy constructor, as if we were going to create a 44162559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // proper call to the copy constructor. 44172559a7045a74679c80376305397a5953d038e1d0Douglas Gregor for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) { 44182559a7045a74679c80376305397a5953d038e1d0Douglas Gregor ParmVarDecl *Parm = Constructor->getParamDecl(I); 44192559a7045a74679c80376305397a5953d038e1d0Douglas Gregor if (S.RequireCompleteType(Loc, Parm->getType(), 44202559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.PDiag(diag::err_call_incomplete_argument))) 44212559a7045a74679c80376305397a5953d038e1d0Douglas Gregor break; 44222559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 44232559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Build the default argument expression; we don't actually care 44242559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if this succeeds or not, because this routine will complain 44252559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if there was a problem. 44262559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm); 44272559a7045a74679c80376305397a5953d038e1d0Douglas Gregor } 4428523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 4429523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor return S.Owned(CurInitExpr); 4430523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor } 4431dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 443225ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth S.MarkDeclarationReferenced(Loc, Constructor); 443325ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth 44343fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine the arguments required to actually perform the 4435523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // constructor call (we might have derived-to-base conversions, or 4436523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // the copy constructor may have default arguments). 4437f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (S.CompleteConstructorCall(Constructor, MultiExprArg(&CurInitExpr, 1), 44383fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Loc, ConstructorArgs)) 4439f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 44403fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 4441b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // Actually perform the constructor call. 4442b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, T, Constructor, Elidable, 44437a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall move_arg(ConstructorArgs), 44447cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 44457a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 4446428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 4447428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 4448dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4449b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // If we're supposed to bind temporaries, do so. 4450b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity)) 4451b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 4452b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor return move(CurInit); 445318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 445420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 445583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Check whether elidable copy construction for binding a reference to 445683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// a temporary would have succeeded if we were building in C++98 mode, for 445783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// -Wc++98-compat. 445883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void CheckCXX98CompatAccessibleCopy(Sema &S, 445983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const InitializedEntity &Entity, 446083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr) { 446183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith assert(S.getLangOptions().CPlusPlus0x); 446283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 446383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const RecordType *Record = CurInitExpr->getType()->getAs<RecordType>(); 446483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Record) 446583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return; 446683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 446783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith SourceLocation Loc = getInitializationLoc(Entity, CurInitExpr); 446883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (S.Diags.getDiagnosticLevel(diag::warn_cxx98_compat_temp_copy, Loc) 446983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith == DiagnosticsEngine::Ignored) 447083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return; 447183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 447283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Find constructors which would have been considered. 447383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet CandidateSet(Loc); 447483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith LookupCopyAndMoveConstructors( 447583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S, CandidateSet, cast<CXXRecordDecl>(Record->getDecl()), CurInitExpr); 447683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 447783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Perform overload resolution. 447883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet::iterator Best; 447983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadingResult OR = CandidateSet.BestViableFunction(S, Loc, Best); 448083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 448183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy) 448283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith << OR << (int)Entity.getKind() << CurInitExpr->getType() 448383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith << CurInitExpr->getSourceRange(); 448483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 448583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith switch (OR) { 448683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Success: 448783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.CheckConstructorAccess(Loc, cast<CXXConstructorDecl>(Best->Function), 448883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Best->FoundDecl.getAccess(), Diag); 448983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // FIXME: Check default arguments as far as that's possible. 449083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 449183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 449283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_No_Viable_Function: 449383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 449483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CandidateSet.NoteCandidates(S, OCD_AllCandidates, &CurInitExpr, 1); 449583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 449683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 449783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Ambiguous: 449883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 449983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CandidateSet.NoteCandidates(S, OCD_ViableCandidates, &CurInitExpr, 1); 450083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 450183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 450283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Deleted: 450383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 450483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 450583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith << 1 << Best->Function->isDeleted(); 450683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 450783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 450883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 450983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 4510a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregorvoid InitializationSequence::PrintInitLocationNote(Sema &S, 4511a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor const InitializedEntity &Entity) { 4512a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Parameter && Entity.getDecl()) { 4513a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getLocation().isInvalid()) 4514a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor return; 4515a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 4516a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getDeclName()) 4517a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here) 4518a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor << Entity.getDecl()->getDeclName(); 4519a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor else 4520a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here); 4521a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } 4522a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor} 4523a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 45243b80232b50c29b245e674f5aa02047b408e41018Sebastian Redlstatic bool isReferenceBinding(const InitializationSequence::Step &s) { 45253b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl return s.Kind == InitializationSequence::SK_BindReference || 45263b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl s.Kind == InitializationSequence::SK_BindReferenceToTemporary; 45273b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl} 45283b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl 4529dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 453020093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::Perform(Sema &S, 453120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 453220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 4533f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiExprArg Args, 4534d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType *ResultType) { 4535d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (Failed()) { 453620093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 453720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Diagnose(S, Entity, Kind, (Expr **)Args.release(), NumArgs); 4538f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 453920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4540dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 45417491c499e826682e128a400038361ebcbde30eecSebastian Redl if (getKind() == DependentSequence) { 4542d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If the declaration is a non-dependent, incomplete array type 4543d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // that has an initializer, then its type will be completed once 4544d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // the initializer is instantiated. 4545d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (ResultType && !Entity.getType()->isDependentType() && 4546d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Args.size() == 1) { 4547d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DeclType = Entity.getType(); 4548d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (const IncompleteArrayType *ArrayT 4549d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getAsIncompleteArrayType(DeclType)) { 4550d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We don't currently have the ability to accurately 4551d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // compute the length of an initializer list without 4552d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // performing full type-checking of the initializer list 4553d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // (since we have to determine where braces are implicitly 4554d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // introduced and such). So, we fall back to making the array 4555d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // type a dependently-sized array type with no specified 4556d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // bound. 4557d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (isa<InitListExpr>((Expr *)Args.get()[0])) { 4558d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor SourceRange Brackets; 4559d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor 4560d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Scavange the location of the brackets from the entity, if we can. 4561d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (DeclaratorDecl *DD = Entity.getDecl()) { 4562d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) { 4563d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor TypeLoc TL = TInfo->getTypeLoc(); 4564d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (IncompleteArrayTypeLoc *ArrayLoc 4565d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor = dyn_cast<IncompleteArrayTypeLoc>(&TL)) 4566d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Brackets = ArrayLoc->getBracketsRange(); 4567d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor } 4568d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4569d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4570d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor *ResultType 4571d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getDependentSizedArrayType(ArrayT->getElementType(), 4572d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor /*NumElts=*/0, 4573d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getSizeModifier(), 4574d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getIndexTypeCVRQualifiers(), 4575d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Brackets); 4576d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4577d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4578d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4579d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 45800d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek assert(Kind.getKind() == InitializationKind::IK_Copy || 45810d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek Kind.isExplicitCast()); 45820d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek return ExprResult(Args.release()[0]); 458320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 458420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 45857491c499e826682e128a400038361ebcbde30eecSebastian Redl // No steps means no initialization. 45867491c499e826682e128a400038361ebcbde30eecSebastian Redl if (Steps.empty()) 458799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return S.Owned((Expr *)0); 4588dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4589d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType().getNonReferenceType(); 4590d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor // FIXME: Ugly hack around the fact that Entity.getType() is not 4591a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // the same as Entity.getDecl()->getType() in cases involving type merging, 4592a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // and we want latter when it makes sense. 4593d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (ResultType) 4594a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() : 4595d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(); 459620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 459760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult CurInit = S.Owned((Expr *)0); 4598dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4599dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // For initialization steps that start with a single initializer, 460099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // grab the only argument out the Args and place it into the "current" 460199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // initializer. 460299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (Steps.front().Kind) { 460318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ResolveAddressOfOverloadedFunction: 460418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseRValue: 4605906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 460618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseLValue: 460718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReference: 460818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReferenceToTemporary: 4609523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 461018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_UserConversion: 461118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionLValue: 4612906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 461318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionRValue: 461418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConversionSequence: 46158713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case SK_ListConstructorCall: 461618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ListInitialization: 461713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 461813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 461918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 4620cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 4621cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ObjCObjectConversion: 4622f85e193739c953358c865005855253af4f68a497John McCall case SK_ArrayInit: 4623f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 4624f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 4625f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: { 462618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(Args.size() == 1); 4627429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = Args.get()[0]; 4628429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (!CurInit.get()) return ExprError(); 462918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 4630f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 4631dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 463218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConstructorInitialization: 463318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ZeroInitialization: 463418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 463520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4636dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4637dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Walk through the computed steps for the initialization sequence, 463820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // performing the specified conversions along the way. 463916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool ConstructorInitRequiresZeroInit = false; 464020093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (step_iterator Step = step_begin(), StepEnd = step_end(); 464120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) { 464220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 4643f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4644dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4645429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType(); 4646dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 464720093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Step->Kind) { 464820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 4649dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Overload resolution determined which function invoke; update the 465020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer to reflect that choice. 4651429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckAddressOfMemberAccess(CurInit.get(), Step->Function.FoundDecl); 4652b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()); 4653b13b737a2450167c82e148590e8019b839ce6b98John McCall CurInit = S.FixOverloadedFunctionReference(move(CurInit), 46546bb8017bb9e828d118e15e59d71c66bba323c364John McCall Step->Function.FoundDecl, 46559aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.Function); 465620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4657dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 465820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 4659906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 466020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: { 466120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a derived-to-base cast that produces either an rvalue or an 466220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue. Perform that cast. 4663dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4664f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 46655cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 466620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Casts to inaccessible base classes are allowed with C-style casts. 466720093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast(); 466820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckDerivedToBaseConversion(SourceType, Step->Type, 4669429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getLocStart(), 4670429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getSourceRange(), 46715cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson &BasePath, IgnoreBaseAccess)) 4672f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4673dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 46746fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (S.BasePathInvolvesVirtualBase(BasePath)) { 46756fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor QualType T = SourceType; 46766fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) 46776fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor T = Pointer->getPointeeType(); 46786fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const RecordType *RecordTy = T->getAs<RecordType>()) 4679429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.MarkVTableUsed(CurInit.get()->getLocStart(), 46806fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor cast<CXXRecordDecl>(RecordTy->getDecl())); 46816fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor } 46826fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 46835baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 4684906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_CastDerivedToBaseLValue ? 46855baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 4686906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_CastDerivedToBaseXValue ? 46875baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 46885baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 4689f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 4690f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Step->Type, 46912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_DerivedToBase, 46925baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall CurInit.get(), 46935baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall &BasePath, VK)); 469420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 469520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4696dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 469720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 4698429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (FieldDecl *BitField = CurInit.get()->getBitField()) { 469920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // References cannot bind to bit fields (C++ [dcl.init.ref]p5). 470020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield) 4701d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor << Entity.getType().isVolatileQualified() 470220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << BitField->getDeclName() 4703429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 470420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(BitField->getLocation(), diag::note_bitfield_decl); 4705f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 470620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4707a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 4708429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInit.get()->refersToVectorElement()) { 470941593e3b7da967b52bc3c7f488b8752dee63f38eJohn McCall // References cannot bind to vector elements. 4710093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element) 4711093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << Entity.getType().isVolatileQualified() 4712429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 4713a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 4714f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4715093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson } 4716dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 471720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Reference binding does not have any corresponding ASTs. 471820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 471920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 4720429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType)) 4721f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 47223aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 472320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 47243aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 472520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 472620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 4727429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType)) 4728f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 472920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 473003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // Materialize the temporary into memory. 4731b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor CurInit = new (S.Context) MaterializeTemporaryExpr( 4732b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor Entity.getType().getNonReferenceType(), 4733b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor CurInit.get(), 473403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor Entity.getType()->isLValueReferenceType()); 4735d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor 4736d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor // If we're binding to an Objective-C object that has lifetime, we 4737d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor // need cleanups. 4738d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor if (S.getLangOptions().ObjCAutoRefCount && 4739d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor CurInit.get()->getType()->isObjCLifetimeType()) 4740d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor S.ExprNeedsCleanups = true; 4741d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor 474220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4743dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4744523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 4745dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInit = CopyObject(S, Step->Type, Entity, move(CurInit), 4746523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor /*IsExtraneousCopy=*/true); 4747523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 4748523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 474920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: { 475020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a user-defined conversion that invokes either a constructor 475120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // or a conversion function. 4752daa8e4e888758d55a7a759dd4a91b83921cef222John McCall CastKind CastKind; 475318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy = false; 47549aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionDecl *Fn = Step->Function.Function; 47559aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundFn = Step->Function.FoundDecl; 47567cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates = Step->Function.HadMultipleCandidates; 47574154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor bool CreatedObject = false; 4758b13b737a2450167c82e148590e8019b839ce6b98John McCall if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) { 475920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the selected constructor. 4760ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 4761429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley SourceLocation Loc = CurInit.get()->getLocStart(); 476220093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 4763b13b737a2450167c82e148590e8019b839ce6b98John McCall 476420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the arguments required to actually perform the constructor 476520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // call. 4766429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley Expr *Arg = CurInit.get(); 476720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CompleteConstructorCall(Constructor, 4768429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley MultiExprArg(&Arg, 1), 476920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Loc, ConstructorArgs)) 4770f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4771dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 477220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the an expression that constructs a temporary. 4773dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInit = S.BuildCXXConstructExpr(Loc, Step->Type, Constructor, 47747a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall move_arg(ConstructorArgs), 47757cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 47767a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 4777428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 4778428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 477920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 4780f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4781b13b737a2450167c82e148590e8019b839ce6b98John McCall 47829a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Kind.getLocation(), Constructor, Entity, 47839aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn.getAccess()); 4784b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 4785dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 47862de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_ConstructorConversion; 478718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType Class = S.Context.getTypeDeclType(Constructor->getParent()); 478818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.Context.hasSameUnqualifiedType(SourceType, Class) || 478918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.IsDerivedFrom(SourceType, Class)) 479018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor IsCopy = true; 4791dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 47924154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = true; 479320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 479420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the conversion function. 4795b13b737a2450167c82e148590e8019b839ce6b98John McCall CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn); 4796429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), 0, 47979aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn); 4798b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 4799dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4800dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Should we move this initialization into a separate 480120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // derived-to-base conversion? I believe the answer is "no", because 480220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // we don't want to turn off access control here for c-style casts. 4803429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = 4804429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.PerformObjectArgumentInitialization(CurInit.take(), /*Qualifier=*/0, 4805429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley FoundFn, Conversion); 4806429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if(CurInitExprRes.isInvalid()) 4807f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4808429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(CurInitExprRes); 4809dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 481020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the actual call to the conversion function. 48117cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion, 48127cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates); 481320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid() || !CurInit.get()) 4814f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4815dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 48162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_UserDefinedConversion; 4817dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 48184154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = Conversion->getResultType()->isRecordType(); 481920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4820dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 48213b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl bool RequiresCopy = !IsCopy && !isReferenceBinding(Steps.back()); 4822960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara bool MaybeBindToTemp = RequiresCopy || shouldBindAsTemporary(Entity); 4823960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara 4824960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara if (!MaybeBindToTemp && CreatedObject && shouldDestroyTemporary(Entity)) { 4825429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType T = CurInit.get()->getType(); 48264154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) { 4827dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXDestructorDecl *Destructor 4828db89f289a22897f1031c92f3e49f7a9ba7bae61eDouglas Gregor = S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl())); 4829429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckDestructorAccess(CurInit.get()->getLocStart(), Destructor, 48304154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor S.PDiag(diag::err_access_dtor_temp) << T); 4831429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.MarkDeclarationReferenced(CurInit.get()->getLocStart(), Destructor); 4832429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getLocStart()); 48334154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 48344154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 4835dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4836f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 4837429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getType(), 4838429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CastKind, CurInit.get(), 0, 4839104be6fc8de206c9b79b241b36ebaf9407b3be08Eli Friedman CurInit.get()->getValueKind())); 4840960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara if (MaybeBindToTemp) 4841960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 48422f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (RequiresCopy) 4843523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor CurInit = CopyObject(S, Entity.getType().getNonReferenceType(), Entity, 4844523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor move(CurInit), /*IsExtraneousCopy=*/false); 484520093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 484620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4847906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 484820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 4849906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 4850906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionRValue: { 485120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform a qualification conversion; these can never go wrong. 48525baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 4853906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_QualificationConversionLValue ? 48545baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 4855906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_QualificationConversionXValue ? 48565baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 48575baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 4858429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = S.ImpCastExprToType(CurInit.take(), Step->Type, CK_NoOp, VK); 485920093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4860906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 4861906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 4862f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor case SK_ConversionSequence: { 4863f85e193739c953358c865005855253af4f68a497John McCall Sema::CheckedConversionKind CCK 4864f85e193739c953358c865005855253af4f68a497John McCall = Kind.isCStyleCast()? Sema::CCK_CStyleCast 4865f85e193739c953358c865005855253af4f68a497John McCall : Kind.isFunctionalCast()? Sema::CCK_FunctionalCast 4866f85e193739c953358c865005855253af4f68a497John McCall : Kind.isExplicitCast()? Sema::CCK_OtherCast 4867f85e193739c953358c865005855253af4f68a497John McCall : Sema::CCK_ImplicitConversion; 4868429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = 4869429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.PerformImplicitConversion(CurInit.get(), Step->Type, *Step->ICS, 4870f85e193739c953358c865005855253af4f68a497John McCall getAssignmentAction(Entity), CCK); 4871429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInitExprRes.isInvalid()) 4872f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4873429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(CurInitExprRes); 487420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4875f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor } 4876dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4877d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: { 4878429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley InitListExpr *InitList = cast<InitListExpr>(CurInit.get()); 487913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Hack: We must pass *ResultType if available in order to set the type 488013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // of arrays, e.g. in 'int ar[] = {1, 2, 3};'. 488113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // But in 'const X &x = {1, 2, 3};' we're supposed to initialize a 488213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // temporary, not a reference, so we should pass Ty. 488313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Worst case: 'const int (&arref)[] = {1, 2, 3};'. 488413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Since this step is never used for a reference directly, we explicitly 488513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // unwrap references here and rewrap them afterwards. 488613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // We also need to create a InitializeTemporary entity for this. 488713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType Ty = ResultType ? ResultType->getNonReferenceType() : Step->Type; 488813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl bool IsTemporary = ResultType && (*ResultType)->isReferenceType(); 488913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(Ty); 489013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListChecker PerformInitList(S, IsTemporary ? TempEntity : Entity, 489113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitList, Ty, /*VerifyOnly=*/false, 4892c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl Kind.getKind() != InitializationKind::IK_Direct || 4893c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl !S.getLangOptions().CPlusPlus0x); 489414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (PerformInitList.HadError()) 4895f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4896d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 489713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResultType) { 489813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if ((*ResultType)->isRValueReferenceType()) 489913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Ty = S.Context.getRValueReferenceType(Ty); 490013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl else if ((*ResultType)->isLValueReferenceType()) 490113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Ty = S.Context.getLValueReferenceType(Ty, 490213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl (*ResultType)->getAs<LValueReferenceType>()->isSpelledAsLValue()); 490313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl *ResultType = Ty; 490413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 490513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 490613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *StructuredInitList = 490713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl PerformInitList.getFullyStructuredList(); 4908d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit.release(); 490913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl CurInit = S.Owned(StructuredInitList); 4910d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 4911d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 491251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 49138713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case SK_ListConstructorCall: 49148713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl assert(false && "List constructor calls not yet supported."); 49158713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 491613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 491713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl CurInit = S.Owned(cast<InitListExpr>(CurInit.take())->getInit(0)); 491813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 491913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 492013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: { 492113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *E = CurInit.take(); 492213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *Syntactic = Step->WrappingSyntacticList; 492313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *ILE = new (S.Context) InitListExpr(S.Context, 492413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Syntactic->getLBraceLoc(), &E, 1, Syntactic->getRBraceLoc()); 492513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setSyntacticForm(Syntactic); 492613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setType(E->getType()); 492713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setValueKind(E->getValueKind()); 492813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl CurInit = S.Owned(ILE); 492913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 493013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 493113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 493251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: { 4933d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor unsigned NumArgs = Args.size(); 493451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor CXXConstructorDecl *Constructor 49359aa472c45d2bd81b7b52c225e8acc560d716db97John McCall = cast<CXXConstructorDecl>(Step->Function.Function); 49367cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates = Step->Function.HadMultipleCandidates; 4937dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 493851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Build a call to the selected constructor. 4939ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 49400a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid()) 49410a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian ? Kind.getEqualLoc() 49420a2eb5685aaef78ce33e84dd8c70ad3ff31b0e11Fariborz Jahanian : Kind.getLocation(); 49434e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth 49444e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth if (Kind.getKind() == InitializationKind::IK_Default) { 49454e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // Force even a trivial, implicit default constructor to be 49464e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // semantically checked. We do this explicitly because we don't build 49474e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // the definition for completely trivial constructors. 49484e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth CXXRecordDecl *ClassDecl = Constructor->getParent(); 49494e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth assert(ClassDecl && "No parent class for constructor."); 49501e23865d0e148a3951a9b418e57b7e0762dc3098Sean Hunt if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() && 4951023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt ClassDecl->hasTrivialDefaultConstructor() && 4952023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt !Constructor->isUsed(false)) 49534e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth S.DefineImplicitDefaultConstructor(Loc, Constructor); 49544e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth } 49554e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth 495651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // Determine the arguments required to actually perform the constructor 495751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // call. 4958dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (S.CompleteConstructorCall(Constructor, move(Args), 495951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Loc, ConstructorArgs)) 4960f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4961dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4962dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 496391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor if (Entity.getKind() == InitializedEntity::EK_Temporary && 4964d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor NumArgs != 1 && // FIXME: Hack to work around cast weirdness 496591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct || 496691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Kind.getKind() == InitializationKind::IK_Value)) { 496791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor // An explicitly-constructed temporary, e.g., X(1, 2). 496891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor unsigned NumExprs = ConstructorArgs.size(); 496991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Expr **Exprs = (Expr **)ConstructorArgs.take(); 497010f8e319569c8b8b4603d8a72ce01a7a01502c85Fariborz Jahanian S.MarkDeclarationReferenced(Loc, Constructor); 49719b623639378d53a675921ddfa7316034d571881eDouglas Gregor S.DiagnoseUseOfDecl(Constructor, Loc); 4972dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4973ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 4974ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!TSInfo) 4975ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc); 4976dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 497791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor CurInit = S.Owned(new (S.Context) CXXTemporaryObjectExpr(S.Context, 497891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor Constructor, 4979ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo, 4980dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Exprs, 498191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor NumExprs, 4982428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth Kind.getParenRange(), 49837cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 49841c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor ConstructorInitRequiresZeroInit)); 498572e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } else { 498672e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::ConstructionKind ConstructKind = 498772e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::CK_Complete; 4988dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 498972e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson if (Entity.getKind() == InitializedEntity::EK_Base) { 499072e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson ConstructKind = Entity.getBaseSpecifier()->isVirtual() ? 4991dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXConstructExpr::CK_VirtualBase : 499272e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CXXConstructExpr::CK_NonVirtualBase; 4993d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt } else if (Entity.getKind() == InitializedEntity::EK_Delegating) { 4994059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt ConstructKind = CXXConstructExpr::CK_Delegating; 4995059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt } 4996dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4997428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth // Only get the parenthesis range if it is a direct construction. 4998428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange parenRange = 4999428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth Kind.getKind() == InitializationKind::IK_Direct ? 5000428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth Kind.getParenRange() : SourceRange(); 5001428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth 50023c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // If the entity allows NRVO, mark the construction as elidable 50033c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // unconditionally. 50043c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor if (Entity.allowsNRVO()) 50053c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 50063c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor Constructor, /*Elidable=*/true, 50073c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor move_arg(ConstructorArgs), 50087cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 50093c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor ConstructorInitRequiresZeroInit, 5010428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth ConstructKind, 5011428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth parenRange); 50123c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor else 50133c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 5014dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Constructor, 50153c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor move_arg(ConstructorArgs), 50167cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 50173c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor ConstructorInitRequiresZeroInit, 5018428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth ConstructKind, 5019428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth parenRange); 502072e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } 502151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (CurInit.isInvalid()) 5022f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5023b13b737a2450167c82e148590e8019b839ce6b98John McCall 5024b13b737a2450167c82e148590e8019b839ce6b98John McCall // Only check access if all of that succeeded. 50259a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 50269aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.FoundDecl.getAccess()); 5027b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Loc); 5028dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 50292f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (shouldBindAsTemporary(Entity)) 503018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 5031dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 503251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 503351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 5034dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 503571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: { 503616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor step_iterator NextStep = Step; 503716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ++NextStep; 5038dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (NextStep != StepEnd && 503916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor NextStep->Kind == SK_ConstructorInitialization) { 504016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // The need for zero-initialization is recorded directly into 504116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // the call to the object's constructor within the next step. 504216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ConstructorInitRequiresZeroInit = true; 504316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else if (Kind.getKind() == InitializationKind::IK_Value && 504416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor S.getLangOptions().CPlusPlus && 504516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !Kind.isImplicitValueInit()) { 5046ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 5047ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!TSInfo) 5048dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TSInfo = S.Context.getTrivialTypeSourceInfo(Step->Type, 5049ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Kind.getRange().getBegin()); 5050ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 5051ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CurInit = S.Owned(new (S.Context) CXXScalarValueInitExpr( 5052ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo->getType().getNonLValueExprType(S.Context), 5053ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo, 505471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getEnd())); 505516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else { 505671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitValueInitExpr(Step->Type)); 505716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 505871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor break; 505971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 506018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 506118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: { 5062429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType SourceType = CurInit.get()->getType(); 5063429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult Result = move(CurInit); 506418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::AssignConvertType ConvTy = 5065429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckSingleAssignmentConstraints(Step->Type, Result); 5066429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Result.isInvalid()) 5067429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 5068429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(Result); 5069aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 5070aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor // If this is a call, allow conversion to a transparent union. 5071429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = move(CurInit); 5072aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor if (ConvTy != Sema::Compatible && 5073aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor Entity.getKind() == InitializedEntity::EK_Parameter && 5074429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExprRes) 5075aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor == Sema::Compatible) 5076aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor ConvTy = Sema::Compatible; 5077429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInitExprRes.isInvalid()) 5078429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 5079429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(CurInitExprRes); 5080aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 5081a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor bool Complained; 508218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(), 508318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step->Type, SourceType, 5084429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get(), 5085a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor getAssignmentAction(Entity), 5086a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor &Complained)) { 5087a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 5088f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5089a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } else if (Complained) 5090a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 509118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 509218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 5093cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 5094cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: { 5095cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman QualType Ty = Step->Type; 5096429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CheckStringInit(CurInit.get(), ResultType ? *ResultType : Ty, 5097fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall S.Context.getAsArrayType(Ty), S); 5098cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman break; 5099cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 5100569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 5101569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 5102429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = S.ImpCastExprToType(CurInit.take(), Step->Type, 51032de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_ObjCObjectLValueCast, 5104c1c0dfb376b829b94d4c61e9f358ce23e6aa3169Eli Friedman CurInit.get()->getValueKind()); 5105569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 5106cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5107cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 5108cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Okay: we checked everything before creating this step. Note that 5109cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // this is a GNU extension. 5110cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Diag(Kind.getLocation(), diag::ext_array_init_copy) 5111429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << Step->Type << CurInit.get()->getType() 5112429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 5113cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5114cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // If the destination type is an incomplete array type, update the 5115cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // type accordingly. 5116cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (ResultType) { 5117cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const IncompleteArrayType *IncompleteDest 5118cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor = S.Context.getAsIncompleteArrayType(Step->Type)) { 5119cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const ConstantArrayType *ConstantSource 5120429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley = S.Context.getAsConstantArrayType(CurInit.get()->getType())) { 5121cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor *ResultType = S.Context.getConstantArrayType( 5122cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor IncompleteDest->getElementType(), 5123cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ConstantSource->getSize(), 5124cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ArrayType::Normal, 0); 5125cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 5126cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 5127cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 5128f85e193739c953358c865005855253af4f68a497John McCall break; 5129cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5130f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 5131f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 5132f85e193739c953358c865005855253af4f68a497John McCall checkIndirectCopyRestoreSource(S, CurInit.get()); 5133f85e193739c953358c865005855253af4f68a497John McCall CurInit = S.Owned(new (S.Context) 5134f85e193739c953358c865005855253af4f68a497John McCall ObjCIndirectCopyRestoreExpr(CurInit.take(), Step->Type, 5135f85e193739c953358c865005855253af4f68a497John McCall Step->Kind == SK_PassByIndirectCopyRestore)); 5136f85e193739c953358c865005855253af4f68a497John McCall break; 5137f85e193739c953358c865005855253af4f68a497John McCall 5138f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 5139f85e193739c953358c865005855253af4f68a497John McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, Step->Type, 514033e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall CK_ARCProduceObject, 5141f85e193739c953358c865005855253af4f68a497John McCall CurInit.take(), 0, VK_RValue)); 5142cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 514320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 514420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 514515d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall 514615d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall // Diagnose non-fatal problems with the completed initialization. 514715d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall if (Entity.getKind() == InitializedEntity::EK_Member && 514815d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl())->isBitField()) 514915d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall S.CheckBitFieldInitialization(Kind.getLocation(), 515015d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl()), 515115d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall CurInit.get()); 5152dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 515320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return move(CurInit); 515420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 515520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 515620093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 515720093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Diagnose initialization failures 515820093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 5159dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumibool InitializationSequence::Diagnose(Sema &S, 516020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 516120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 516220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs) { 5163d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (!Failed()) 516420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return false; 5165dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5166d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 516720093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Failure) { 516820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_TooManyInitsForReference: 51699db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // FIXME: Customize for the initialized entity? 51709db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (NumArgs == 0) 51719db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_without_init) 51729db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType.getNonReferenceType(); 51739db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor else // FIXME: diagnostic below could be better! 51749db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits) 51759db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 517620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5177dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 517820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitList: 517920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 518020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) 518120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Failure == FK_ArrayNeedsInitListOrStringLiteral); 518220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5183dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5184cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 5185cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 5186cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Diag(Kind.getLocation(), 5187cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor (Failure == FK_ArrayTypeMismatch 5188cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ? diag::err_array_init_different_type 5189cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor : diag::err_array_init_non_constant_array)) 5190cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << DestType.getNonReferenceType() 5191cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << Args[0]->getType() 5192cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << Args[0]->getSourceRange(); 5193cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 5194cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 51956bb8017bb9e828d118e15e59d71c66bba323c364John McCall case FK_AddressOfOverloadFailed: { 51966bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found; 5197dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.ResolveAddressOfOverloadedFunction(Args[0], 519820093b4bf698f292c664676987541d5103b65b15Douglas Gregor DestType.getNonReferenceType(), 51996bb8017bb9e828d118e15e59d71c66bba323c364John McCall true, 52006bb8017bb9e828d118e15e59d71c66bba323c364John McCall Found); 520120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 52026bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 5203dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 520420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitOverloadFailed: 52054a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor case FK_UserConversionOverloadFailed: 520620093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (FailedOverloadResult) { 520720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Ambiguous: 520818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Failure == FK_UserConversionOverloadFailed) 520918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_ambiguous_condition) 521018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getType() << DestType 521118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 521218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 521318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_ref_init_ambiguous) 521418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << DestType << Args[0]->getType() 521518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 521618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 5217120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, Args, NumArgs); 521820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5219dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 522020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_No_Viable_Function: 522120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition) 522220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 522320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 5224120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args, NumArgs); 522520093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5226dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 522720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Deleted: { 522820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function) 522920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 523020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 523120093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 5232120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 52338fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best, 52348fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor true); 523520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Ovl == OR_Deleted) { 523620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 5237f85e193739c953358c865005855253af4f68a497John McCall << 1 << Best->Function->isDeleted(); 523820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 52399f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Inconsistent overload resolution?"); 524020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 524120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 524220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5243dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 524420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Success: 52459f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Conversion did not fail!"); 524620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 524720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 524820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5249dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 525020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 525113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (isa<InitListExpr>(Args[0])) { 525213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Diag(Kind.getLocation(), 525313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl diag::err_lvalue_reference_bind_to_initlist) 525413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << DestType.getNonReferenceType().isVolatileQualified() 525513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << DestType.getNonReferenceType() 525613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << Args[0]->getSourceRange(); 525713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 525813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 525913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Intentional fallthrough 526013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 526120093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 5262dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Kind.getLocation(), 526320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Failure == FK_NonConstLValueReferenceBindingToTemporary 526420093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? diag::err_lvalue_reference_bind_to_temporary 526520093b4bf698f292c664676987541d5103b65b15Douglas Gregor : diag::err_lvalue_reference_bind_to_unrelated) 5266ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor << DestType.getNonReferenceType().isVolatileQualified() 526720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 526820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 526920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 527020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5271dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 527220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_RValueReferenceBindingToLValue: 527320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref) 5274fb5d7efc279335bde2cdc0a73da525d6b28201e9Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getType() 527520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 527620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5277dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 527820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitDropsQualifiers: 527920093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) 528020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 528120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 528220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 528320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5284dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 528520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitFailed: 528620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_failed) 528720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 52887eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 528920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 529020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 5291926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor if (DestType.getNonReferenceType()->isObjCObjectPointerType() && 5292926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor Args[0]->getType()->isObjCObjectPointerType()) 5293926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor S.EmitRelatedResultTypeNote(Args[0]); 529420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5295dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 52961be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor case FK_ConversionFailed: { 52971be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor QualType FromType = Args[0]->getType(); 52986efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed) 529918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << (int)Entity.getKind() 530020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType 53017eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 53021be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor << FromType 530320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 53046efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu S.HandleFunctionTypeMismatch(PDiag, FromType, DestType); 53056efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu S.Diag(Kind.getLocation(), PDiag); 5306926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor if (DestType.getNonReferenceType()->isObjCObjectPointerType() && 5307926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor Args[0]->getType()->isObjCObjectPointerType()) 5308926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor S.EmitRelatedResultTypeNote(Args[0]); 5309d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 53101be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor } 5311429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 5312429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 5313429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley // No-op. This error has already been reported. 5314429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley break; 5315429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 5316d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_TooManyInitsForScalar: { 531799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceRange R; 531899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 531999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (InitListExpr *InitList = dyn_cast<InitListExpr>(Args[0])) 532019311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R = SourceRange(InitList->getInit(0)->getLocEnd(), 532199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitList->getLocEnd()); 5322dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi else 532319311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R = SourceRange(Args[0]->getLocEnd(), Args[NumArgs - 1]->getLocEnd()); 5324d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 532519311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R.setBegin(S.PP.getLocForEndOfToken(R.getBegin())); 532619311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor if (Kind.isCStyleOrFunctionalCast()) 532719311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg) 532819311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << R; 532919311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor else 533019311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_excess_initializers) 533119311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << /*scalar=*/2 << R; 5332d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5333d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 5334d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 5335d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_ReferenceBindingToInitList: 5336d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list) 5337d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getSourceRange(); 5338d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5339d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 5340d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_InitListBadDestinationType: 5341d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type) 5342d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange(); 5343d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5344dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 534551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case FK_ConstructorOverloadFailed: { 534651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceRange ArgsRange; 534751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (NumArgs) 5348dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ArgsRange = SourceRange(Args[0]->getLocStart(), 534951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Args[NumArgs - 1]->getLocEnd()); 5350dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 535151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // FIXME: Using "DestType" for the entity we're printing is probably 535251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // bad. 535351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor switch (FailedOverloadResult) { 535451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Ambiguous: 535551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_ambiguous_init) 535651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 5357120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, 5358120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall Args, NumArgs); 535951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 5360dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 536151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_No_Viable_Function: 53629db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 53639db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor (Entity.getKind() == InitializedEntity::EK_Base || 53649db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Member) && 53659db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 53669db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default initialization of a member or 53679db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // base within a constructor. If no viable function was 53689db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // found, notify the user that she needs to explicitly 53699db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialize this base/member. 53709db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor 53719db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = cast<CXXConstructorDecl>(S.CurContext); 53729db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Base) { 53739db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 53749db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 53759db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 53769db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*base=*/0 53779db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getType(); 53789db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 53799db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor RecordDecl *BaseDecl 53809db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getBaseSpecifier()->getType()->getAs<RecordType>() 53819db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ->getDecl(); 53829db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(BaseDecl->getLocation(), diag::note_previous_decl) 53839db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(BaseDecl); 53849db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 53859db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 53869db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 53879db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 53889db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*member=*/1 53899db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 53909db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_field_decl); 53919db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 53929db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (const RecordType *Record 53939db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getType()->getAs<RecordType>()) 5394dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Record->getDecl()->getLocation(), 53959db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor diag::note_previous_decl) 53969db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(Record->getDecl()); 53979db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 53989db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor break; 53999db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 54009db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 540151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init) 540251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 5403120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args, NumArgs); 540451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 5405dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 540651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Deleted: { 540751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 540851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << true << DestType << ArgsRange; 540951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 5410120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 5411120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best); 541251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (Ovl == OR_Deleted) { 541351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 5414f85e193739c953358c865005855253af4f68a497John McCall << 1 << Best->Function->isDeleted(); 541551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } else { 541651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Inconsistent overload resolution?"); 541751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 541851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 541951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 5420dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 542151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Success: 542251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Conversion did not fail!"); 542351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 542451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 542551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 542651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 5427dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 542899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case FK_DefaultInitOfConst: 54299db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Member && 54309db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 54319db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default-initialization of a const member in 54329db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // a constructor. Complain that it needs to be explicitly 54339db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialized. 54349db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext); 54359db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor) 54369db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 54379db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 54389db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*const=*/1 54399db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 54409db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl) 54419db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 54429db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 54439db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_default_init_const) 54449db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType << (bool)DestType->getAs<RecordType>(); 54459db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 544699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor break; 5447dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 54488713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_Incomplete: 54498713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl S.RequireCompleteType(Kind.getLocation(), DestType, 54508713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl diag::err_init_incomplete_type); 54518713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl break; 54528713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 545314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl case FK_ListInitializationFailed: { 545414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Run the init list checker again to emit diagnostics. 545514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr* InitList = cast<InitListExpr>(Args[0]); 545614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl QualType DestType = Entity.getType(); 545714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListChecker DiagnoseInitList(S, Entity, InitList, 5458c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl DestType, /*VerifyOnly=*/false, 5459c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl Kind.getKind() != InitializationKind::IK_Direct || 5460c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl !S.getLangOptions().CPlusPlus0x); 546114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert(DiagnoseInitList.HadError() && 546214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl "Inconsistent init list check result."); 546314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl break; 546414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 54655acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 54665acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: { 54675acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall // FIXME: Already diagnosed! 54685acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 54695acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall } 547020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5471dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5472a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 547320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return true; 547420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 547518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 54765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid InitializationSequence::dump(raw_ostream &OS) const { 5477de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (SequenceKind) { 5478de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FailedSequence: { 5479de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Failed sequence: "; 5480de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (Failure) { 5481de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForReference: 5482de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for reference"; 5483de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5484dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5485de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitList: 5486de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list"; 5487de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5488dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5489de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 5490de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list or string literal"; 5491de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5492dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5493cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 5494cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "array type mismatch"; 5495cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 5496cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5497cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 5498cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "non-constant array initializer"; 5499cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 5500cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5501de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_AddressOfOverloadFailed: 5502de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "address of overloaded function failed"; 5503de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5504dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5505de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitOverloadFailed: 5506de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overload resolution for reference initialization failed"; 5507de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5508dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5509de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 5510de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to temporary"; 5511de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5512dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5513de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 5514de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to unrelated type"; 5515de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5516dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5517de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_RValueReferenceBindingToLValue: 5518de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "rvalue reference bound to an lvalue"; 5519de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5520dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5521de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitDropsQualifiers: 5522de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization drops qualifiers"; 5523de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5524dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5525de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitFailed: 5526de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization failed"; 5527de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5528dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5529de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConversionFailed: 5530de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "conversion failed"; 5531de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5532dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5533429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 5534429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley OS << "conversion from property failed"; 5535429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley break; 5536429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 5537de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForScalar: 5538de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for scalar"; 5539de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5540dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5541de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceBindingToInitList: 5542de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "referencing binding to initializer list"; 5543de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5544dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5545de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_InitListBadDestinationType: 5546de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "initializer list for non-aggregate, non-scalar type"; 5547de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5548dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5549de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_UserConversionOverloadFailed: 5550de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overloading failed for user-defined conversion"; 5551de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5552dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5553de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConstructorOverloadFailed: 5554de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor overloading failed"; 5555de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5556dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5557de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_DefaultInitOfConst: 5558de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "default initialization of a const variable"; 5559de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5560dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 556172a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 556272a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor OS << "initialization of incomplete type"; 556372a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor break; 55648713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 55658713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_ListInitializationFailed: 556614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl OS << "list initialization checker failure"; 55675acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 55685acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 55695acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: 55705acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall OS << "initializer expression isn't contextually valid"; 55715acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 5572dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 5573de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << '\n'; 5574de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 5575de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 5576dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5577de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case DependentSequence: 55787491c499e826682e128a400038361ebcbde30eecSebastian Redl OS << "Dependent sequence\n"; 5579de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 5580dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 55817491c499e826682e128a400038361ebcbde30eecSebastian Redl case NormalSequence: 55827491c499e826682e128a400038361ebcbde30eecSebastian Redl OS << "Normal sequence: "; 5583de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5584de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 5585dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5586de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) { 5587de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor if (S != step_begin()) { 5588de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << " -> "; 5589de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 5590dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5591de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (S->Kind) { 5592de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 5593de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "resolve address of overloaded function"; 5594de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5595dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5596de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseRValue: 5597de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (rvalue" << S->Type.getAsString() << ")"; 5598de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5599dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5600906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 5601906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "derived-to-base case (xvalue" << S->Type.getAsString() << ")"; 5602906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 5603dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5604de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseLValue: 5605de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (lvalue" << S->Type.getAsString() << ")"; 5606de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5607dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5608de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReference: 5609de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to lvalue"; 5610de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5611dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5612de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReferenceToTemporary: 5613de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to a temporary"; 5614de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5615dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5616523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 5617523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor OS << "extraneous C++03 copy to temporary"; 5618523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 5619523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 5620de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_UserConversion: 5621b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << "user-defined conversion via " << *S->Function.Function; 5622de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5623906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 5624de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionRValue: 5625de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (rvalue)"; 562613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 5627de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 5628906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 5629906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "qualification conversion (xvalue)"; 563013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 5631906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 5632de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionLValue: 5633de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (lvalue)"; 5634de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5635dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5636de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConversionSequence: 5637de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "implicit conversion sequence ("; 5638de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor S->ICS->DebugPrint(); // FIXME: use OS 5639de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << ")"; 5640de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5641dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5642de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ListInitialization: 56438713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl OS << "list aggregate initialization"; 56448713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl break; 56458713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 56468713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case SK_ListConstructorCall: 56478713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl OS << "list initialization via constructor"; 5648de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5649dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 565013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 565113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl OS << "unwrap reference initializer list"; 565213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 565313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 565413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 565513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl OS << "rewrap reference initializer list"; 565613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 565713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 5658de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConstructorInitialization: 5659de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor initialization"; 5660de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5661dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5662de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ZeroInitialization: 5663de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "zero initialization"; 5664de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5665dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5666de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CAssignment: 5667de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment"; 5668de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5669dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5670de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_StringInit: 5671de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "string initialization"; 5672de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5673569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 5674569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 5675569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor OS << "Objective-C object conversion"; 5676569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 5677cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5678cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 5679cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "array initialization"; 5680cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 5681f85e193739c953358c865005855253af4f68a497John McCall 5682f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 5683f85e193739c953358c865005855253af4f68a497John McCall OS << "pass by indirect copy and restore"; 5684f85e193739c953358c865005855253af4f68a497John McCall break; 5685f85e193739c953358c865005855253af4f68a497John McCall 5686f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 5687f85e193739c953358c865005855253af4f68a497John McCall OS << "pass by indirect restore"; 5688f85e193739c953358c865005855253af4f68a497John McCall break; 5689f85e193739c953358c865005855253af4f68a497John McCall 5690f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 5691f85e193739c953358c865005855253af4f68a497John McCall OS << "Objective-C object retension"; 5692f85e193739c953358c865005855253af4f68a497John McCall break; 5693de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 5694de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 5695de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 5696de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 5697de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump() const { 5698de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor dump(llvm::errs()); 5699de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 5700de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 5701191591336f639dad1504e863733fb831645c1644Jeffrey Yasskinstatic void DiagnoseNarrowingInInitList( 5702191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin Sema& S, QualType EntityType, const Expr *InitE, 5703191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin bool Constant, const APValue &ConstantValue) { 5704191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (Constant) { 5705191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin S.Diag(InitE->getLocStart(), 570662ec1f2fd7368542bb926c04797fb07023547694Francois Pichet S.getLangOptions().CPlusPlus0x && !S.getLangOptions().MicrosoftExt 5707191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ? diag::err_init_list_constant_narrowing 5708191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin : diag::warn_init_list_constant_narrowing) 5709191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin << InitE->getSourceRange() 5710191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin << ConstantValue 57119906149972906e340f512a60f72a8676748f24d8Jeffrey Yasskin << EntityType.getLocalUnqualifiedType(); 5712191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } else 5713191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin S.Diag(InitE->getLocStart(), 571462ec1f2fd7368542bb926c04797fb07023547694Francois Pichet S.getLangOptions().CPlusPlus0x && !S.getLangOptions().MicrosoftExt 5715191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ? diag::err_init_list_variable_narrowing 5716191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin : diag::warn_init_list_variable_narrowing) 5717191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin << InitE->getSourceRange() 57189906149972906e340f512a60f72a8676748f24d8Jeffrey Yasskin << InitE->getType().getLocalUnqualifiedType() 57199906149972906e340f512a60f72a8676748f24d8Jeffrey Yasskin << EntityType.getLocalUnqualifiedType(); 5720191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 5721191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::SmallString<128> StaticCast; 5722191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::raw_svector_ostream OS(StaticCast); 5723191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin OS << "static_cast<"; 5724191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (const TypedefType *TT = EntityType->getAs<TypedefType>()) { 5725191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // It's important to use the typedef's name if there is one so that the 5726191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // fixit doesn't break code using types like int64_t. 5727191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // 5728191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // FIXME: This will break if the typedef requires qualification. But 5729191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // getQualifiedNameAsString() includes non-machine-parsable components. 5730b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << *TT->getDecl(); 5731191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } else if (const BuiltinType *BT = EntityType->getAs<BuiltinType>()) 5732191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin OS << BT->getName(S.getLangOptions()); 5733191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin else { 5734191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Oops, we didn't find the actual type of the variable. Don't emit a fixit 5735191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // with a broken cast. 5736191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return; 5737191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 5738191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin OS << ">("; 5739191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin S.Diag(InitE->getLocStart(), diag::note_init_list_narrowing_override) 5740191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin << InitE->getSourceRange() 5741191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin << FixItHint::CreateInsertion(InitE->getLocStart(), OS.str()) 5742191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin << FixItHint::CreateInsertion( 5743191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin S.getPreprocessor().getLocForEndOfToken(InitE->getLocEnd()), ")"); 5744191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin} 5745191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 574618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 574718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// Initialization helper functions 574818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 57492be7e90b81509204b99b7bbf9753ad17b894a12aSean Huntbool 57502be7e90b81509204b99b7bbf9753ad17b894a12aSean HuntSema::CanPerformCopyInitialization(const InitializedEntity &Entity, 57512be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt ExprResult Init) { 57522be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt if (Init.isInvalid()) 57532be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt return false; 57542be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 57552be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt Expr *InitE = Init.get(); 57562be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt assert(InitE && "No initialization expression"); 57572be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 57582be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt InitializationKind Kind = InitializationKind::CreateCopy(SourceLocation(), 57592be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt SourceLocation()); 57602be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 5761383616cd2e61131a534afd9364ef53f643e1f834Sebastian Redl return !Seq.Failed(); 57622be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt} 57632be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 5764dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 576518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::PerformCopyInitialization(const InitializedEntity &Entity, 576618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation EqualLoc, 5767191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ExprResult Init, 5768191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin bool TopLevelOfInitList) { 576918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Init.isInvalid()) 577018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return ExprError(); 577118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 577215d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall Expr *InitE = Init.get(); 577318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(InitE && "No initialization expression?"); 577418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 577518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (EqualLoc.isInvalid()) 577618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc = InitE->getLocStart(); 577718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 577818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationKind Kind = InitializationKind::CreateCopy(InitE->getLocStart(), 577918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc); 578018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 578118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Init.release(); 5782191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 5783191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin bool Constant = false; 5784191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin APValue Result; 5785191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (TopLevelOfInitList && 5786191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin Seq.endsWithNarrowing(Context, InitE, &Constant, &Result)) { 5787191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin DiagnoseNarrowingInInitList(*this, Entity.getType(), InitE, 5788191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin Constant, Result); 5789191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 5790f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return Seq.Perform(*this, Entity, Kind, MultiExprArg(&InitE, 1)); 579118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 5792