SemaInit.cpp revision 4773654f2700d6fbb20612fbb6763b35860fa74d
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" 242b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl#include "llvm/ADT/APInt.h" 258fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h" 2620093b4bf698f292c664676987541d5103b65b15Douglas Gregor#include "llvm/Support/ErrorHandling.h" 27191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin#include "llvm/Support/raw_ostream.h" 28c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor#include <map> 2905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorusing namespace clang; 300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 31dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 32dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Sema Initialization Checking 33dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 34dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 35ce6c9b7da219c8640a0559f75770cfc6622de083John McCallstatic Expr *IsStringInit(Expr *Init, const ArrayType *AT, 36ce6c9b7da219c8640a0559f75770cfc6622de083John McCall ASTContext &Context) { 378718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT)) 388718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman return 0; 398718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman 408879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // See if this is a string literal or @encode. 418879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner Init = Init->IgnoreParens(); 421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 438879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Handle @encode, which is a narrow string. 448879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType()) 458879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner return Init; 468879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 478879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner // Otherwise we can only handle string literals. 488879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner StringLiteral *SL = dyn_cast<StringLiteral>(Init); 49220b6369d7717bfe6894b46cef055d3e763827f2Chris Lattner if (SL == 0) return 0; 50bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman 51bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman QualType ElemTy = Context.getCanonicalType(AT->getElementType()); 525cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor 535cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor switch (SL->getKind()) { 545cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::Ascii: 555cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF8: 565cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // char array can be initialized with a narrow string. 575cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // Only allow char x[] = "foo"; not char x[] = L"foo"; 58bb6415c69fc6440c337970e39749d4d482d9de42Eli Friedman return ElemTy->isCharType() ? Init : 0; 595cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF16: 605cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return ElemTy->isChar16Type() ? Init : 0; 615cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF32: 625cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return ElemTy->isChar32Type() ? Init : 0; 635cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::Wide: 645cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // wchar_t array can be initialized with a wide string: C99 6.7.8p15 (with 655cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // correction from DR343): "An array with element type compatible with a 665cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // qualified or unqualified version of wchar_t may be initialized by a wide 675cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor // string literal, optionally enclosed in braces." 685cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor if (Context.typesAreCompatible(Context.getWCharType(), 695cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor ElemTy.getUnqualifiedType())) 705cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return Init; 718879e3b29d2527260c401bce0ed0e401901ef601Chris Lattner 725cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor return 0; 735cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor } 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 755cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor llvm_unreachable("missed a StringLiteral kind?"); 76dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 77dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 78ce6c9b7da219c8640a0559f75770cfc6622de083John McCallstatic Expr *IsStringInit(Expr *init, QualType declType, ASTContext &Context) { 79ce6c9b7da219c8640a0559f75770cfc6622de083John McCall const ArrayType *arrayType = Context.getAsArrayType(declType); 80ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (!arrayType) return 0; 81ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 82ce6c9b7da219c8640a0559f75770cfc6622de083John McCall return IsStringInit(init, arrayType, Context); 83ce6c9b7da219c8640a0559f75770cfc6622de083John McCall} 84ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 85fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCallstatic void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT, 86fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall Sema &S) { 8779e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner // Get the length of the string as parsed. 8879e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner uint64_t StrLength = 8979e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner cast<ConstantArrayType>(Str->getType())->getSize().getZExtValue(); 9079e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 92dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C99 6.7.8p14. We have an array of character type with unknown size 94dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // being initialized to a string literal. 95dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner llvm::APSInt ConstVal(32); 9619da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner ConstVal = StrLength; 97dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner // Return a new array type (C99 6.7.8p22). 9846a617a792bfab0d9b1e057371ea3b9540802226John McCall DeclT = S.Context.getConstantArrayType(IAT->getElementType(), 9946a617a792bfab0d9b1e057371ea3b9540802226John McCall ConstVal, 10046a617a792bfab0d9b1e057371ea3b9540802226John McCall ArrayType::Normal, 0); 10119da8cdfb3d5cd31e06d02c7bab1eb1bd41a7949Chris Lattner return; 102dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner } 1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1048718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman const ConstantArrayType *CAT = cast<ConstantArrayType>(AT); 1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 106bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // We have an array of character type with known size. However, 1078718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // the size may be smaller or larger than the string we are initializing. 1088718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // FIXME: Avoid truncation for 64-bit length strings. 109bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (S.getLangOptions().CPlusPlus) { 110b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson if (StringLiteral *SL = dyn_cast<StringLiteral>(Str)) { 111b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // For Pascal strings it's OK to strip off the terminating null character, 112b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // so the example below is valid: 113b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // 114b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson // unsigned char a[2] = "\pa"; 115b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson if (SL->isPascal()) 116b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson StrLength--; 117b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson } 118b8fc45f8d0fdcc7908590115942d425bf4a924f1Anders Carlsson 119bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // [dcl.init.string]p2 120bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (StrLength > CAT->getSize().getZExtValue()) 121bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman S.Diag(Str->getSourceRange().getBegin(), 122bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman diag::err_initializer_string_for_char_array_too_long) 123bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman << Str->getSourceRange(); 124bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman } else { 125bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman // C99 6.7.8p14. 126bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman if (StrLength-1 > CAT->getSize().getZExtValue()) 127bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman S.Diag(Str->getSourceRange().getBegin(), 128bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman diag::warn_initializer_string_for_char_array_too_long) 129bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman << Str->getSourceRange(); 130bc34b1d7f4f371bfdebf68d66086f54586d68abeEli Friedman } 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1328718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // Set the type to the actual size that we are initializing. If we have 1338718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // something like: 1348718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // char x[1] = "foo"; 1358718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman // then this will set the string literal's type to char[1]. 1368718a6a02ccc53fea758677781a8df3a8b0c41c9Eli Friedman Str->setType(DeclT); 137dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner} 138dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 139dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 140dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner// Semantic checking for initializer lists. 141dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner//===----------------------------------------------------------------------===// 142dd8e0065207e953bb28b95ad9cb6b2c13f56b3b8Chris Lattner 1439e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// @brief Semantic checking for initializer lists. 1449e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1459e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// The InitListChecker class contains a set of routines that each 1469e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// handle the initialization of a certain kind of entity, e.g., 1479e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// arrays, vectors, struct/union types, scalars, etc. The 1489e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// InitListChecker itself performs a recursive walk of the subobject 1499e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure of the type to be initialized, while stepping through 1509e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// the initializer list one element at a time. The IList and Index 1519e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// parameters to each of the Check* routines contain the active 1529e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// (syntactic) initializer list and the index into that initializer 1539e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list that represents the current initializer. Each routine is 1549e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// responsible for moving that Index forward as it consumes elements. 1559e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1569e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// Each Check* routine also has a StructuredList/StructuredIndex 15763e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// arguments, which contains the current "structured" (semantic) 1589e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initializer list and the index into that initializer list where we 1599e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// are copying initializers as we map them over to the semantic 1609e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. Once we have completed our recursive walk of the subobject 1619e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// structure, we will have constructed a full semantic initializer 1629e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// list. 1639e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// 1649e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// C99 designators cause changes in the initializer list traversal, 1659e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// because they make the initialization "jump" into a specific 1669e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// subobject and then continue the initialization from that 1679e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// point. CheckDesignatedInitializer() recursively steps into the 1689e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// designated subobject and manages backing out the recursion to 1699e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor/// initialize the subobjects after the one designated. 1708b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattnernamespace { 171c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorclass InitListChecker { 1720820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner Sema &SemaRef; 173c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool hadError; 17414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool VerifyOnly; // no diagnostics, no structure building 175c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl bool AllowBraceElision; 176c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor std::map<InitListExpr *, InitListExpr *> SyntacticToSemantic; 177c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *FullyStructuredList; 1781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1798ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckImplicitInitList(const InitializedEntity &Entity, 180987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, QualType T, 1819e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 182629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman unsigned &StructuredIndex); 1838ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckExplicitInitList(const InitializedEntity &Entity, 18446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 1859e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &Index, InitListExpr *StructuredList, 186eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 187eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1888ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckListElementTypes(const InitializedEntity &Entity, 18946f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &DeclType, 1901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 191c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1929e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 193eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 194eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 1958ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckSubElementType(const InitializedEntity &Entity, 19646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType ElemType, 197c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 1989e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 1999e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2000c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman void CheckComplexType(const InitializedEntity &Entity, 2010c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *IList, QualType DeclType, 2020c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &Index, 2030c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *StructuredList, 2040c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &StructuredIndex); 2058ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckScalarType(const InitializedEntity &Entity, 20646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 207c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 2089e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2099e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2108ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckReferenceType(const InitializedEntity &Entity, 2118ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 212930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 213930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 214930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex); 2158ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckVectorType(const InitializedEntity &Entity, 21646f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, unsigned &Index, 2179e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2189e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2198ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckStructUnionTypes(const InitializedEntity &Entity, 2202bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, QualType DeclType, 2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator Field, 222c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 2239e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 224eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 225eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject = false); 2268ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson void CheckArrayType(const InitializedEntity &Entity, 227784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::APSInt elementIndex, 229c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool SubobjectIsDesignatorContext, unsigned &Index, 2309e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor InitListExpr *StructuredList, 2319e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex); 2328ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson bool CheckDesignatedInitializer(const InitializedEntity &Entity, 2339a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, DesignatedInitExpr *DIE, 234711997184366d584c9c437102cae1e9d9927b986Douglas Gregor unsigned DesigIdx, 2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &CurrentObjectType, 236c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor RecordDecl::field_iterator *NextField, 237c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor llvm::APSInt *NextElementIndex, 238c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &Index, 239c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 240c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned &StructuredIndex, 241eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 242eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject); 243c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 244c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor QualType CurrentObjectType, 245c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *StructuredList, 246c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor unsigned StructuredIndex, 247c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor SourceRange InitRange); 2489e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor void UpdateStructuredListElement(InitListExpr *StructuredList, 2499e80f7252ec1b91142e41790e4491c61e14b9472Douglas Gregor unsigned &StructuredIndex, 250c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor Expr *expr); 251c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numArrayElements(QualType DeclType); 252c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor int numStructUnionElements(QualType DeclType); 253930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 254d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor void FillInValueInitForField(unsigned Init, FieldDecl *Field, 255d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 256d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 257cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor void FillInValueInitializations(const InitializedEntity &Entity, 258cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, bool &RequiresSecondPass); 259f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool CheckFlexibleArrayInit(const InitializedEntity &Entity, 260f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman Expr *InitExpr, FieldDecl *Field, 261f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool TopLevelObject); 2623ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl void CheckValueInitializable(const InitializedEntity &Entity); 2633ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 264c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregorpublic: 265cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListChecker(Sema &S, const InitializedEntity &Entity, 266c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl InitListExpr *IL, QualType &T, bool VerifyOnly, 267c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl bool AllowBraceElision); 268c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor bool HadError() { return hadError; } 269c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 270c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // @brief Retrieves the fully-structured initializer list used for 271c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor // semantic analysis and code generation. 272c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } 273c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor}; 2748b419b9b5f21cf948cf6fe788f67bf1efd97524cChris Lattner} // end anonymous namespace 27568355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 2763ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redlvoid InitListChecker::CheckValueInitializable(const InitializedEntity &Entity) { 2773ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl assert(VerifyOnly && 2783ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl "CheckValueInitializable is only inteded for verification mode."); 2793ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 2803ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl SourceLocation Loc; 2813ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 2823ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl true); 2833ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializationSequence InitSeq(SemaRef, Entity, Kind, 0, 0); 2843ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (InitSeq.Failed()) 2853ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl hadError = true; 2863ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl} 2873ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 288d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregorvoid InitListChecker::FillInValueInitForField(unsigned Init, FieldDecl *Field, 289d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor const InitializedEntity &ParentEntity, 290dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitListExpr *ILE, 291d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor bool &RequiresSecondPass) { 292d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 293d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned NumInits = ILE->getNumInits(); 294dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity MemberEntity 295d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = InitializedEntity::InitializeMember(Field, &ParentEntity); 296d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Init >= NumInits || !ILE->getInit(Init)) { 297d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // FIXME: We probably don't need to handle references 298d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // specially here, since value-initialization of references is 299d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // handled in InitializationSequence. 300d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->getType()->isReferenceType()) { 301d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // C++ [dcl.init.aggr]p9: 302d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // If an incomplete or empty initializer-list leaves a 303d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // member of reference type uninitialized, the program is 304d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // ill-formed. 305d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized) 306d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << Field->getType() 307d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor << ILE->getSyntacticForm()->getSourceRange(); 308d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor SemaRef.Diag(Field->getLocation(), 309d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor diag::note_uninit_reference_member); 310d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 311d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 312d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 313dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 314d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 315d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor true); 316d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitializationSequence InitSeq(SemaRef, MemberEntity, Kind, 0, 0); 317d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (!InitSeq) { 318d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor InitSeq.Diagnose(SemaRef, MemberEntity, Kind, 0, 0); 319d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 320d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 321d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 322dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 32360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult MemberInit 324f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall = InitSeq.Perform(SemaRef, MemberEntity, Kind, MultiExprArg()); 325d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (MemberInit.isInvalid()) { 326d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor hadError = true; 327d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor return; 328d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 329dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 330d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) { 331d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Do nothing 332d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (Init < NumInits) { 333d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->setInit(Init, MemberInit.takeAs<Expr>()); 3347491c499e826682e128a400038361ebcbde30eecSebastian Redl } else if (InitSeq.isConstructorInitialization()) { 335d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Value-initialization requires a constructor call, so 336d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // extend the initializer list to include the constructor 337d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // call and make a note that we'll need to take another pass 338d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // through the initializer list. 339709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek ILE->updateInit(SemaRef.Context, Init, MemberInit.takeAs<Expr>()); 340d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor RequiresSecondPass = true; 341d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 342d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } else if (InitListExpr *InnerILE 343d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor = dyn_cast<InitListExpr>(ILE->getInit(Init))) 344dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FillInValueInitializations(MemberEntity, InnerILE, 345dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi RequiresSecondPass); 346d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor} 347d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 3484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Recursively replaces NULL values within the given initializer list 3494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// with expressions that perform value-initialization of the 3504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// appropriate type. 351dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 352cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::FillInValueInitializations(const InitializedEntity &Entity, 353cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitListExpr *ILE, 354cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool &RequiresSecondPass) { 3551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((ILE->getType() != SemaRef.Context.VoidTy) && 356930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor "Should not have void type"); 35787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor SourceLocation Loc = ILE->getSourceRange().getBegin(); 35887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (ILE->getSyntacticForm()) 35987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor Loc = ILE->getSyntacticForm()->getSourceRange().getBegin(); 3601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3616217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) { 362d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion() && 363d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ILE->getInitializedFieldInUnion()) 364d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(0, ILE->getInitializedFieldInUnion(), 365d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Entity, ILE, RequiresSecondPass); 366d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor else { 367d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor unsigned Init = 0; 368d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor for (RecordDecl::field_iterator 369d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field = RType->getDecl()->field_begin(), 370d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FieldEnd = RType->getDecl()->field_end(); 371d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor Field != FieldEnd; ++Field) { 372d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (Field->isUnnamedBitfield()) 373d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor continue; 374d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 375d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 37687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 37787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 378d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor FillInValueInitForField(Init, *Field, Entity, ILE, RequiresSecondPass); 379d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (hadError) 380cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 381cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 382d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor ++Init; 383d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor 384d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor // Only look at the first initialization of a union. 385d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor if (RType->getDecl()->isUnion()) 386d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor break; 387d6d37dee48cfc5bbcc998bd9d151e4fb3a9437e8Douglas Gregor } 3884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 3894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType ElementType; 3941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 395cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializedEntity ElementEntity = Entity; 39687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumInits = ILE->getNumInits(); 39787fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned NumElements = NumInits; 3980820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) { 3994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = AType->getElementType(); 40087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) 40187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = CAType->getSize().getZExtValue(); 402dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 403cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 404183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) { 4054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = VType->getElementType(); 40687fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor NumElements = VType->getNumElements(); 407dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context, 408cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 0, Entity); 4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else 4104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ElementType = ILE->getType(); 4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 412dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 41387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor for (unsigned Init = 0; Init != NumElements; ++Init) { 41416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (hadError) 41516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor return; 41616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor 417d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement || 418d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson ElementEntity.getKind() == InitializedEntity::EK_VectorElement) 419cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor ElementEntity.setElementIndex(Init); 420cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 42121f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis Expr *InitExpr = (Init < NumInits ? ILE->getInit(Init) : 0); 42221f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis if (!InitExpr && !ILE->hasArrayFiller()) { 423cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc, 424cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor true); 425cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitializationSequence InitSeq(SemaRef, ElementEntity, Kind, 0, 0); 426cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (!InitSeq) { 427cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor InitSeq.Diagnose(SemaRef, ElementEntity, Kind, 0, 0); 42887fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor hadError = true; 42987fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor return; 43087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor } 43187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 43260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult ElementInit 433f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall = InitSeq.Perform(SemaRef, ElementEntity, Kind, MultiExprArg()); 434cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (ElementInit.isInvalid()) { 43516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor hadError = true; 436cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor return; 437cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 438cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor 439cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor if (hadError) { 440cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor // Do nothing 441cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } else if (Init < NumInits) { 4423e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis // For arrays, just set the expression used for value-initialization 4433e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis // of the "holes" in the array. 4443e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) 4453e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis ILE->setArrayFiller(ElementInit.takeAs<Expr>()); 4463e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis else 4473e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis ILE->setInit(Init, ElementInit.takeAs<Expr>()); 4484423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } else { 4494423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // For arrays, just set the expression used for value-initialization 4504423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // of the rest of elements and exit. 4514423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) { 4524423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis ILE->setArrayFiller(ElementInit.takeAs<Expr>()); 4534423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis return; 4544423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 4554423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis 4567491c499e826682e128a400038361ebcbde30eecSebastian Redl if (InitSeq.isConstructorInitialization()) { 4574423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // Value-initialization requires a constructor call, so 4584423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // extend the initializer list to include the constructor 4594423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // call and make a note that we'll need to take another pass 4604423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis // through the initializer list. 4614423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis ILE->updateInit(SemaRef.Context, Init, ElementInit.takeAs<Expr>()); 4624423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis RequiresSecondPass = true; 4634423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 464cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 465ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else if (InitListExpr *InnerILE 46621f77cd0c3da8a1dbaf6245cae43baf4c0b80ea4Argyrios Kyrtzidis = dyn_cast_or_null<InitListExpr>(InitExpr)) 467cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(ElementEntity, InnerILE, RequiresSecondPass); 4684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 4694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 4704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 47168355a57bb9d5daccd3fc73e92370ba2b1a6eafbChris Lattner 472cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas GregorInitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity, 47314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr *IL, QualType &T, 474c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl bool VerifyOnly, bool AllowBraceElision) 475b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith : SemaRef(S), VerifyOnly(VerifyOnly), AllowBraceElision(AllowBraceElision) { 4760cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff hadError = false; 477c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 478b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman unsigned newIndex = 0; 4794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 4801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FullyStructuredList 481ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor = getStructuredSubobjectInit(IL, newIndex, T, 0, 0, IL->getSourceRange()); 482dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckExplicitInitList(Entity, IL, T, newIndex, 48346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson FullyStructuredList, newStructuredIndex, 484eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor /*TopLevelObject=*/true); 485c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 48614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!hadError && !VerifyOnly) { 487cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor bool RequiresSecondPass = false; 488cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor FillInValueInitializations(Entity, FullyStructuredList, RequiresSecondPass); 48916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor if (RequiresSecondPass && !hadError) 490dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FillInValueInitializations(Entity, FullyStructuredList, 491cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor RequiresSecondPass); 492cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor } 4930cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 4940cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 4950cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numArrayElements(QualType DeclType) { 496638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // FIXME: use a proper constant 497638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman int maxElements = 0x7FFFFFFF; 498c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = 4990820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getAsConstantArrayType(DeclType)) { 5000cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = static_cast<int>(CAT->getSize().getZExtValue()); 5010cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 5020cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return maxElements; 5030cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5040cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5050cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroffint InitListChecker::numStructUnionElements(QualType DeclType) { 5066217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl(); 5074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor int InitializableMembers = 0; 5081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (RecordDecl::field_iterator 50917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = structDecl->field_begin(), 51017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = structDecl->field_end(); 5114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Field != FieldEnd; ++Field) { 512d61db33331c264d6361283602b248a7423040597Douglas Gregor if (!Field->isUnnamedBitfield()) 5134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++InitializableMembers; 5144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 51539ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (structDecl->isUnion()) 516f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return std::min(InitializableMembers, 1); 517f84eda37251c679e2f20343c47a4a3586d9a8e21Eli Friedman return InitializableMembers - structDecl->hasFlexibleArrayMember(); 5180cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5190cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5208ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity, 521987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson InitListExpr *ParentIList, 5224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType T, unsigned &Index, 5234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 524629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman unsigned &StructuredIndex) { 5250cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff int maxElements = 0; 5261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5270cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (T->isArrayType()) 5280cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numArrayElements(T); 529fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor else if (T->isRecordType()) 5300cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff maxElements = numStructUnionElements(T); 531b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman else if (T->isVectorType()) 532183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall maxElements = T->getAs<VectorType>()->getNumElements(); 5330cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff else 534b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("CheckImplicitInitList(): Illegal type"); 535b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 536402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman if (maxElements == 0) { 53714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 53814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(ParentIList->getInit(Index)->getLocStart(), 53914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_implicit_empty_initializer); 5404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 541402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman hadError = true; 542402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman return; 543402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman } 544402256fc665ba179873ffcb4d630e28cbea42f27Eli Friedman 5454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Build a structured initializer list corresponding to this subobject. 5464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredSubobjectInitList 5471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList, 5481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredIndex, 549ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor SourceRange(ParentIList->getInit(Index)->getSourceRange().getBegin(), 550ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor ParentIList->getSourceRange().getEnd())); 5514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredSubobjectInitIndex = 0; 5524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 5534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Check the element types and build the structural subobject. 55487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor unsigned StartIndex = Index; 555dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, ParentIList, T, 556987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 5571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredSubobjectInitList, 558629f118e6928f69178fab8fad6ff755b33a69f42Eli Friedman StructuredSubobjectInitIndex); 559c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl 560c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl if (VerifyOnly) { 561c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl if (!AllowBraceElision && (T->isArrayType() || T->isRecordType())) 562c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl hadError = true; 563c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl } else { 56414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->setType(T); 56514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 566c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1); 56714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Update the structured sub-object initializer so that it's ending 56814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // range corresponds with the end of the last initializer it used. 56914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (EndIndex < ParentIList->getNumInits()) { 57014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SourceLocation EndLoc 57114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl = ParentIList->getInit(EndIndex)->getSourceRange().getEnd(); 57214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->setRBraceLoc(EndLoc); 57314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 57414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 575c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl // Complain about missing braces. 57614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (T->isArrayType() || T->isRecordType()) { 57714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), 578c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl AllowBraceElision ? diag::warn_missing_braces : 579c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl diag::err_missing_braces) 58014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << StructuredSubobjectInitList->getSourceRange() 58114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << FixItHint::CreateInsertion( 58214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredSubobjectInitList->getLocStart(), "{") 58314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << FixItHint::CreateInsertion( 58414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.PP.getLocForEndOfToken( 585dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi StructuredSubobjectInitList->getLocEnd()), 58614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl "}"); 587c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl if (!AllowBraceElision) 588c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl hadError = true; 58914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 5901e1d396dc55002a2a6355048db542a38b5137002Tanya Lattner } 5910cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 5920cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 5938ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, 59446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType &T, 5954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 5964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 597eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 598eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 599c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman assert(IList->isExplicit() && "Illegal Implicit InitListExpr"); 60014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 60114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SyntacticToSemantic[IList] = StructuredList; 60214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setSyntacticForm(IList); 60314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 604dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true, 60546f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson Index, StructuredList, StructuredIndex, TopLevelObject); 60614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 60714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl QualType ExprTy = T.getNonLValueExprType(SemaRef.Context); 60814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->setType(ExprTy); 60914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setType(ExprTy); 61014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 611638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (hadError) 612638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 613c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman 614638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman if (Index < IList->getNumInits()) { 615c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman // We have leftover initializers 61614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 61714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (SemaRef.getLangOptions().CPlusPlus || 61814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl (SemaRef.getLangOptions().OpenCL && 61914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->getType()->isVectorType())) { 62014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 62114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 62214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 62314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 62414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 625e540858b289b23653bcb23646f135729203635cbEli Friedman if (StructuredIndex == 1 && 626e540858b289b23653bcb23646f135729203635cbEli Friedman IsStringInit(StructuredList->getInit(0), T, SemaRef.Context)) { 6277c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers_in_char_array_initializer; 628e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 6297c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor DK = diag::err_excess_initializers_in_char_array_initializer; 630e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 631e540858b289b23653bcb23646f135729203635cbEli Friedman } 632bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman // Special-case 6330820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 634dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << IList->getInit(Index)->getSourceRange(); 635d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman } else if (!T->isIncompleteType()) { 636b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // Don't complain for incomplete types, since we'll get an error 637b574e5630d66629ccc8f2432e60b59ae42f1f363Douglas Gregor // elsewhere 638eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType CurrentObjectType = StructuredList->getType(); 6391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int initKind = 640eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isArrayType()? 0 : 641eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isVectorType()? 1 : 642eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isScalarType()? 2 : 643eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor CurrentObjectType->isUnionType()? 3 : 644eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 4; 6457c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 6467c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor unsigned DK = diag::warn_excess_initializers; 647e540858b289b23653bcb23646f135729203635cbEli Friedman if (SemaRef.getLangOptions().CPlusPlus) { 648e540858b289b23653bcb23646f135729203635cbEli Friedman DK = diag::err_excess_initializers; 6490863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman hadError = true; 6500863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman } 6510863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman if (SemaRef.getLangOptions().OpenCL && initKind == 1) { 6520863452c21e3e6da5b2613fd455495486c1ad5dfNate Begeman DK = diag::err_excess_initializers; 653e540858b289b23653bcb23646f135729203635cbEli Friedman hadError = true; 654e540858b289b23653bcb23646f135729203635cbEli Friedman } 6557c53ca6e03833adab4465462b7d5c888741b715dDouglas Gregor 6560820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK) 657eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor << initKind << IList->getInit(Index)->getSourceRange(); 658c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 659c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } 660cda25a977e4b7fe4e080b87586410eaeab7b62f6Eli Friedman 66114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && T->isScalarType() && IList->getNumInits() == 1 && 66214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !TopLevelObject) 6630820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), diag::warn_braces_around_scalar_init) 664a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor << IList->getSourceRange() 665849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocStart()) 666849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(IList->getLocEnd()); 6670cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 6680cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 6698ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckListElementTypes(const InitializedEntity &Entity, 67046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 6711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &DeclType, 67287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool SubobjectIsDesignatorContext, 6734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 6744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 675eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 676eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 6770c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman if (DeclType->isAnyComplexType() && SubobjectIsDesignatorContext) { 6780c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // Explicitly braced initializer for complex type can be real+imaginary 6790c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // parts. 6800c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman CheckComplexType(Entity, IList, DeclType, Index, 6810c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredList, StructuredIndex); 6820c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else if (DeclType->isScalarType()) { 68346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckScalarType(Entity, IList, DeclType, Index, 68446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 685c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (DeclType->isVectorType()) { 686dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckVectorType(Entity, IList, DeclType, Index, 68746f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson StructuredList, StructuredIndex); 688d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor } else if (DeclType->isAggregateType()) { 689d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor if (DeclType->isRecordType()) { 6906217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 6912bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson CheckStructUnionTypes(Entity, IList, DeclType, RD->field_begin(), 6924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubobjectIsDesignatorContext, Index, 693eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 694eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor TopLevelObject); 69587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } else if (DeclType->isArrayType()) { 696f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor llvm::APSInt Zero( 6970820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()), 698f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor false); 699dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckArrayType(Entity, IList, DeclType, Zero, 700784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson SubobjectIsDesignatorContext, Index, 7014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 702ac5fc7c6bcb494b60fee7ce615ac931c5db6135eMike Stump } else 703b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Aggregate that isn't a structure or array?!"); 704613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff } else if (DeclType->isVoidType() || DeclType->isFunctionType()) { 705613535273b90dc5cbd0f9fa056dedc93801ea35aSteve Naroff // This type is invalid, issue a diagnostic. 7064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 70714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 70814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 70914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 710d8dc2100487640d8f5ce53201fdcfac7b5ca32b2Eli Friedman hadError = true; 711930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isRecordType()) { 712930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init]p14: 713930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // [...] If the class is an aggregate (8.5.1), and the initializer 714930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // is a brace-enclosed list, see 8.5.1. 715930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // 716930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // Note: 8.5.1 is handled below; here, we diagnose the case where 717930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // we have an initializer list and a destination type that is not 718930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // an aggregate. 719930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // FIXME: In C++0x, this is yet another form of initialization. 72014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 72114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 72214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType << IList->getSourceRange(); 723930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 724930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (DeclType->isReferenceType()) { 7258ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckReferenceType(Entity, IList, DeclType, Index, 7268ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 727c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall } else if (DeclType->isObjCObjectType()) { 72814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 72914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_init_objc_class) 73014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 7314d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 7320cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } else { 73314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 73414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type) 73514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType; 7364d9e7388ccdfdab97f92caac5db9b87a530742f4Douglas Gregor hadError = true; 7370cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 7380cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 7390cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 7408ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckSubElementType(const InitializedEntity &Entity, 74146f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, 7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType ElemType, 7434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 7444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 7454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 7466fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor Expr *expr = IList->getInit(Index); 747c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) { 748c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman unsigned newIndex = 0; 7494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned newStructuredIndex = 0; 7501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *newStructuredList 7514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor = getStructuredSubobjectInit(IList, Index, ElemType, 7524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex, 7534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SubInitList->getSourceRange()); 75446f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson CheckExplicitInitList(Entity, SubInitList, ElemType, newIndex, 7554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor newStructuredList, newStructuredIndex); 7564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 7574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 758fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 759c9c0ea6576666eb7e96508f6b8ce2b4d33af3f02Eli Friedman } else if (ElemType->isScalarType()) { 760fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return CheckScalarType(Entity, IList, ElemType, Index, 761fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredList, StructuredIndex); 762930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } else if (ElemType->isReferenceType()) { 763fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return CheckReferenceType(Entity, IList, ElemType, Index, 764fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredList, StructuredIndex); 765fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 766930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 767fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (const ArrayType *arrayType = SemaRef.Context.getAsArrayType(ElemType)) { 768fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // arrayType can be incomplete if we're initializing a flexible 769fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // array member. There's nothing we can do with the completed 770fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // type here, though. 771930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 772fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (Expr *Str = IsStringInit(expr, arrayType, SemaRef.Context)) { 7738a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman if (!VerifyOnly) { 7748a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman CheckStringInit(Str, ElemType, arrayType, SemaRef); 7758a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 7768a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman } 777fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 778fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 779930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 780930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 781fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization. 782fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 783fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else if (SemaRef.getLangOptions().CPlusPlus) { 784930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor // C++ [dcl.init.aggr]p12: 785fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // All implicit type conversions (clause 4) are considered when 7865d3d41d0873d51b405972baf38e1f3a7ef5b49e0Sebastian Redl // initializing the aggregate member with an initializer from 787fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // an initializer-list. If the initializer can initialize a 788fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // member, the member is initialized. [...] 789fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 790fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // FIXME: Better EqualLoc? 791fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationKind Kind = 792fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationKind::CreateCopy(expr->getLocStart(), SourceLocation()); 793fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall InitializationSequence Seq(SemaRef, Entity, Kind, &expr, 1); 794fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 795fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if (Seq) { 79614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 797b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith ExprResult Result = 798b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith Seq.Perform(SemaRef, Entity, Kind, MultiExprArg(&expr, 1)); 799b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith if (Result.isInvalid()) 800b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith hadError = true; 80114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 80214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, 803b6f8d28411955bc5349217a657ad5f274f72293aRichard Smith Result.takeAs<Expr>()); 80414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 805fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 806fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 807fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 808fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 809fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization 810fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else { 811fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // C99 6.7.8p13: 8121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 813fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // The initializer for a structure or union object that has 814fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // automatic storage duration shall be either an initializer 815fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // list as described below, or a single expression that has 816fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // compatible structure or union type. In the latter case, the 817fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // initial value of the object, including unnamed members, is 818fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // that of the expression. 819429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult ExprRes = SemaRef.Owned(expr); 820fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall if ((ElemType->isRecordType() || ElemType->isVectorType()) && 82114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.CheckSingleAssignmentConstraints(ElemType, ExprRes, 82214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !VerifyOnly) 823fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall == Sema::Compatible) { 824429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (ExprRes.isInvalid()) 825429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley hadError = true; 826429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley else { 827429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes = SemaRef.DefaultFunctionArrayLvalueConversion(ExprRes.take()); 828429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (ExprRes.isInvalid()) 829429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley hadError = true; 830429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 831429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley UpdateStructuredListElement(StructuredList, StructuredIndex, 832429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes.takeAs<Expr>()); 833930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 834fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall return; 835930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 836429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprRes.release(); 837fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // Fall through for subaggregate initialization 838fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } 839fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall 840fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // C++ [dcl.init.aggr]p12: 841fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // 842fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // [...] Otherwise, if the member is itself a non-empty 843fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // subaggregate, brace elision is assumed and the initializer is 844fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // considered for the initialization of the first member of 845fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall // the subaggregate. 84661b4bc80e943578ae855810918a1dc9697dbd15bTanya Lattner if (!SemaRef.getLangOptions().OpenCL && 84761b4bc80e943578ae855810918a1dc9697dbd15bTanya Lattner (ElemType->isAggregateType() || ElemType->isVectorType())) { 848fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList, 849fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall StructuredIndex); 850fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++StructuredIndex; 851fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall } else { 85214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 85314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // We cannot initialize this element, so let 85414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // PerformCopyInitialization produce the appropriate diagnostic. 85514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.PerformCopyInitialization(Entity, SourceLocation(), 85614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Owned(expr), 85714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl /*TopLevelOfInitList=*/true); 85814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 859fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall hadError = true; 860fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++Index; 861fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall ++StructuredIndex; 862930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 863b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman} 864b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman 8650c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedmanvoid InitListChecker::CheckComplexType(const InitializedEntity &Entity, 8660c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *IList, QualType DeclType, 8670c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &Index, 8680c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitListExpr *StructuredList, 8690c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman unsigned &StructuredIndex) { 8700c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman assert(Index == 0 && "Index in explicit init list must be zero"); 8710c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8720c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // As an extension, clang supports complex initializers, which initialize 8730c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // a complex number component-wise. When an explicit initializer list for 8740c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // a complex number contains two two initializers, this extension kicks in: 8750c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // it exepcts the initializer list to contain two elements convertible to 8760c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // the element type of the complex type. The first element initializes 8770c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // the real part, and the second element intitializes the imaginary part. 8780c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8790c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman if (IList->getNumInits() != 2) 8800c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman return CheckScalarType(Entity, IList, DeclType, Index, StructuredList, 8810c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredIndex); 8820c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8830c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // This is an extension in C. (The builtin _Complex type does not exist 8840c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // in the C++ standard.) 88514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.getLangOptions().CPlusPlus && !VerifyOnly) 8860c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman SemaRef.Diag(IList->getLocStart(), diag::ext_complex_component_init) 8870c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman << IList->getSourceRange(); 8880c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8890c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman // Initialize the complex number. 8900c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman QualType elementType = DeclType->getAs<ComplexType>()->getElementType(); 8910c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitializedEntity ElementEntity = 8920c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 8930c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 8940c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman for (unsigned i = 0; i < 2; ++i) { 8950c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman ElementEntity.setElementIndex(Index); 8960c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman CheckSubElementType(ElementEntity, IList, elementType, Index, 8970c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman StructuredList, StructuredIndex); 8980c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } 8990c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman} 9000c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 9010c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman 9028ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckScalarType(const InitializedEntity &Entity, 90346f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 9046fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned &Index, 9054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 9064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 907b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Index >= IList->getNumInits()) { 9086b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith if (!VerifyOnly) 9096b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith SemaRef.Diag(IList->getLocStart(), 9106b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith SemaRef.getLangOptions().CPlusPlus0x ? 9116b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith diag::warn_cxx98_compat_empty_scalar_initializer : 9126b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith diag::err_empty_scalar_initializer) 9136b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith << IList->getSourceRange(); 9146b13022faef260c8f49d04310f4a2c0a57f9103bRichard Smith hadError = !SemaRef.getLangOptions().CPlusPlus0x; 9154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 9164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 917bb504d3a63e0e4b2439900ba6d77b620fb6de857Eli Friedman return; 9180cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 919b934c2d77144471f35c5ebae9e925b056dac8112John McCall 920b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *expr = IList->getInit(Index); 921b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) { 92214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 92314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(SubIList->getLocStart(), 92414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::warn_many_braces_around_scalar_init) 92514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << SubIList->getSourceRange(); 926b934c2d77144471f35c5ebae9e925b056dac8112John McCall 927b934c2d77144471f35c5ebae9e925b056dac8112John McCall CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList, 928b934c2d77144471f35c5ebae9e925b056dac8112John McCall StructuredIndex); 929b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 930b934c2d77144471f35c5ebae9e925b056dac8112John McCall } else if (isa<DesignatedInitExpr>(expr)) { 93114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 93214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(expr->getSourceRange().getBegin(), 93314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_designator_for_scalar_init) 93414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType << expr->getSourceRange(); 935b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; 936b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 937b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 938b934c2d77144471f35c5ebae9e925b056dac8112John McCall return; 939b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 940b934c2d77144471f35c5ebae9e925b056dac8112John McCall 94114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 94214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.CanPerformCopyInitialization(Entity, SemaRef.Owned(expr))) 94314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 94414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 94514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 94614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 94714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 948b934c2d77144471f35c5ebae9e925b056dac8112John McCall ExprResult Result = 949b934c2d77144471f35c5ebae9e925b056dac8112John McCall SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 950191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin SemaRef.Owned(expr), 951191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin /*TopLevelOfInitList=*/true); 952b934c2d77144471f35c5ebae9e925b056dac8112John McCall 953b934c2d77144471f35c5ebae9e925b056dac8112John McCall Expr *ResultExpr = 0; 954b934c2d77144471f35c5ebae9e925b056dac8112John McCall 955b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (Result.isInvalid()) 956b934c2d77144471f35c5ebae9e925b056dac8112John McCall hadError = true; // types weren't compatible. 957b934c2d77144471f35c5ebae9e925b056dac8112John McCall else { 958b934c2d77144471f35c5ebae9e925b056dac8112John McCall ResultExpr = Result.takeAs<Expr>(); 959dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 960b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (ResultExpr != expr) { 961b934c2d77144471f35c5ebae9e925b056dac8112John McCall // The type was promoted, update initializer list. 962b934c2d77144471f35c5ebae9e925b056dac8112John McCall IList->setInit(Index, ResultExpr); 963b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 964b934c2d77144471f35c5ebae9e925b056dac8112John McCall } 965b934c2d77144471f35c5ebae9e925b056dac8112John McCall if (hadError) 966b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++StructuredIndex; 967b934c2d77144471f35c5ebae9e925b056dac8112John McCall else 968b934c2d77144471f35c5ebae9e925b056dac8112John McCall UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); 969b934c2d77144471f35c5ebae9e925b056dac8112John McCall ++Index; 9700cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 9710cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 9728ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckReferenceType(const InitializedEntity &Entity, 9738ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitListExpr *IList, QualType DeclType, 974930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &Index, 975930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor InitListExpr *StructuredList, 976930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor unsigned &StructuredIndex) { 97714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (Index >= IList->getNumInits()) { 978390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: It would be wonderful if we could point at the actual member. In 979390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // general, it would be useful to pass location information down the stack, 980390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // so that we know the location (or decl) of the "current object" being 981390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // initialized. 98214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 98314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), 98414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_init_reference_member_uninitialized) 98514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType 98614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << IList->getSourceRange(); 987930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor hadError = true; 988930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++Index; 989930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor ++StructuredIndex; 990930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor return; 991930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor } 99214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 99314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Expr *expr = IList->getInit(Index); 99413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (isa<InitListExpr>(expr) && !SemaRef.getLangOptions().CPlusPlus0x) { 99514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 99614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list) 99714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DeclType << IList->getSourceRange(); 99814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 99914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 100014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++StructuredIndex; 100114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 100214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 100314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 100414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 100514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.CanPerformCopyInitialization(Entity, SemaRef.Owned(expr))) 100614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 100714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 100814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 100914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 101014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 101114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ExprResult Result = 101214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), 101314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Owned(expr), 101414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl /*TopLevelOfInitList=*/true); 101514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 101614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (Result.isInvalid()) 101714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 101814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 101914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl expr = Result.takeAs<Expr>(); 102014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->setInit(Index, expr); 102114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 102214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (hadError) 102314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++StructuredIndex; 102414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 102514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, expr); 102614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 1027930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor} 1028930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor 10298ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckVectorType(const InitializedEntity &Entity, 103046f4659f9d012ca2e2050c1fc39a59666114b3f9Anders Carlsson InitListExpr *IList, QualType DeclType, 10314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 10324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 10334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 103420e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *VT = DeclType->getAs<VectorType>(); 103520e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned maxElements = VT->getNumElements(); 103620e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numEltsInit = 0; 103720e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType elementType = VT->getElementType(); 103820e047abc5f19dc948436c0fb891450d9cd40667John McCall 10393ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Index >= IList->getNumInits()) { 10403ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Make sure the element type can be value-initialized. 10413ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 10423ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable( 10433ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity)); 10443ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl return; 10453ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 10463ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 104720e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!SemaRef.getLangOptions().OpenCL) { 104820e047abc5f19dc948436c0fb891450d9cd40667John McCall // If the initializing element is a vector, try to copy-initialize 104920e047abc5f19dc948436c0fb891450d9cd40667John McCall // instead of breaking it apart (which is doomed to failure anyway). 105020e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *Init = IList->getInit(Index); 105120e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) { 105214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) { 105314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!SemaRef.CanPerformCopyInitialization(Entity, SemaRef.Owned(Init))) 105414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl hadError = true; 105514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ++Index; 105614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 105714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 105814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 105920e047abc5f19dc948436c0fb891450d9cd40667John McCall ExprResult Result = 106020e047abc5f19dc948436c0fb891450d9cd40667John McCall SemaRef.PerformCopyInitialization(Entity, Init->getLocStart(), 1061191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin SemaRef.Owned(Init), 1062191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin /*TopLevelOfInitList=*/true); 106320e047abc5f19dc948436c0fb891450d9cd40667John McCall 106420e047abc5f19dc948436c0fb891450d9cd40667John McCall Expr *ResultExpr = 0; 106520e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Result.isInvalid()) 106620e047abc5f19dc948436c0fb891450d9cd40667John McCall hadError = true; // types weren't compatible. 106720e047abc5f19dc948436c0fb891450d9cd40667John McCall else { 106820e047abc5f19dc948436c0fb891450d9cd40667John McCall ResultExpr = Result.takeAs<Expr>(); 1069dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 107020e047abc5f19dc948436c0fb891450d9cd40667John McCall if (ResultExpr != Init) { 107120e047abc5f19dc948436c0fb891450d9cd40667John McCall // The type was promoted, update initializer list. 107220e047abc5f19dc948436c0fb891450d9cd40667John McCall IList->setInit(Index, ResultExpr); 10732ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 10742ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 107520e047abc5f19dc948436c0fb891450d9cd40667John McCall if (hadError) 107620e047abc5f19dc948436c0fb891450d9cd40667John McCall ++StructuredIndex; 107720e047abc5f19dc948436c0fb891450d9cd40667John McCall else 107814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, 107914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl ResultExpr); 108020e047abc5f19dc948436c0fb891450d9cd40667John McCall ++Index; 108120e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 10820cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 10831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 108420e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 108520e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 1086dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 108720e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) { 108820e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 10893ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Index >= IList->getNumInits()) { 10903ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 10913ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable(ElementEntity); 109220e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 10933ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 1094dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 109520e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 109620e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 109720e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 109820e047abc5f19dc948436c0fb891450d9cd40667John McCall } 109920e047abc5f19dc948436c0fb891450d9cd40667John McCall return; 110020e047abc5f19dc948436c0fb891450d9cd40667John McCall } 110120e047abc5f19dc948436c0fb891450d9cd40667John McCall 110220e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity ElementEntity = 110320e047abc5f19dc948436c0fb891450d9cd40667John McCall InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 1104dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 110520e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL initializers allows vectors to be constructed from vectors. 110620e047abc5f19dc948436c0fb891450d9cd40667John McCall for (unsigned i = 0; i < maxElements; ++i) { 110720e047abc5f19dc948436c0fb891450d9cd40667John McCall // Don't attempt to go past the end of the init list 110820e047abc5f19dc948436c0fb891450d9cd40667John McCall if (Index >= IList->getNumInits()) 110920e047abc5f19dc948436c0fb891450d9cd40667John McCall break; 1110dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 111120e047abc5f19dc948436c0fb891450d9cd40667John McCall ElementEntity.setElementIndex(Index); 111220e047abc5f19dc948436c0fb891450d9cd40667John McCall 111320e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType IType = IList->getInit(Index)->getType(); 111420e047abc5f19dc948436c0fb891450d9cd40667John McCall if (!IType->isVectorType()) { 111520e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, elementType, Index, 111620e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 111720e047abc5f19dc948436c0fb891450d9cd40667John McCall ++numEltsInit; 111820e047abc5f19dc948436c0fb891450d9cd40667John McCall } else { 111920e047abc5f19dc948436c0fb891450d9cd40667John McCall QualType VecType; 112020e047abc5f19dc948436c0fb891450d9cd40667John McCall const VectorType *IVT = IType->getAs<VectorType>(); 112120e047abc5f19dc948436c0fb891450d9cd40667John McCall unsigned numIElts = IVT->getNumElements(); 1122dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 112320e047abc5f19dc948436c0fb891450d9cd40667John McCall if (IType->isExtVectorType()) 112420e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getExtVectorType(elementType, numIElts); 112520e047abc5f19dc948436c0fb891450d9cd40667John McCall else 112620e047abc5f19dc948436c0fb891450d9cd40667John McCall VecType = SemaRef.Context.getVectorType(elementType, numIElts, 1127e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson IVT->getVectorKind()); 112820e047abc5f19dc948436c0fb891450d9cd40667John McCall CheckSubElementType(ElementEntity, IList, VecType, Index, 112920e047abc5f19dc948436c0fb891450d9cd40667John McCall StructuredList, StructuredIndex); 113020e047abc5f19dc948436c0fb891450d9cd40667John McCall numEltsInit += numIElts; 113120e047abc5f19dc948436c0fb891450d9cd40667John McCall } 11320cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 113320e047abc5f19dc948436c0fb891450d9cd40667John McCall 113420e047abc5f19dc948436c0fb891450d9cd40667John McCall // OpenCL requires all elements to be initialized. 11353ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (numEltsInit != maxElements) { 11363ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!VerifyOnly) 11373ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl SemaRef.Diag(IList->getSourceRange().getBegin(), 11383ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl diag::err_vector_incorrect_num_initializers) 11393ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl << (numEltsInit < maxElements) << maxElements << numEltsInit; 11403ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl hadError = true; 11413ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 11420cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 11430cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 11448ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckArrayType(const InitializedEntity &Entity, 1145784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson InitListExpr *IList, QualType &DeclType, 114687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt elementIndex, 11471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 11484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 11494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 11504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex) { 1151ce6c9b7da219c8640a0559f75770cfc6622de083John McCall const ArrayType *arrayType = SemaRef.Context.getAsArrayType(DeclType); 1152ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 11530cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // Check for the special-case of initializing an array with a string. 11540cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff if (Index < IList->getNumInits()) { 1155ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (Expr *Str = IsStringInit(IList->getInit(Index), arrayType, 115679e079d3caecc0ddd7128dc038d3f8960bbab62eChris Lattner SemaRef.Context)) { 11574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We place the string literal directly into the resulting 11584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initializer list. This is the only place where the structure 11594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // of the structured initializer list doesn't match exactly, 11604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // because doing so would involve allocating one character 11614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // constant for each string. 116214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 11638a5d929268beeb69b654120fb0b4f8893ad230ebEli Friedman CheckStringInit(Str, DeclType, arrayType, SemaRef); 116414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl UpdateStructuredListElement(StructuredList, StructuredIndex, Str); 116514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->resizeInits(SemaRef.Context, StructuredIndex); 116614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 11670cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff ++Index; 11680cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff return; 11690cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 11700cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1171ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) { 1172638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // Check for VLAs; in standard C it would be possible to check this 1173638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // earlier, but I don't know where clang accepts VLAs (gcc accepts 1174638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman // them in all sorts of strange places). 117514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 117614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(VAT->getSizeExpr()->getLocStart(), 117714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_variable_object_no_init) 117814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << VAT->getSizeExpr()->getSourceRange(); 1179638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman hadError = true; 11804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++Index; 11814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 1182638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman return; 1183638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman } 1184638e14413a4557c399fa2b7da2be5e4e9c1330a2Eli Friedman 118505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We might know the maximum number of elements in advance. 11864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor llvm::APSInt maxElements(elementIndex.getBitWidth(), 11874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor elementIndex.isUnsigned()); 118805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool maxElementsKnown = false; 1189ce6c9b7da219c8640a0559f75770cfc6622de083John McCall if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(arrayType)) { 119005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = CAT->getSize(); 11919f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth()); 1192e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 119305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElementsKnown = true; 119405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 119505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1196ce6c9b7da219c8640a0559f75770cfc6622de083John McCall QualType elementType = arrayType->getElementType(); 119705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 119805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 119905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 120087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 120187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 120287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 120387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 120487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 120587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 120687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. elementIndex will be 120787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // updated to be the next array element we'll initialize. 12089a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 12094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, 0, &elementIndex, Index, 1210eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, true, 1211eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) { 121205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 121387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor continue; 121487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 121587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 1216f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor if (elementIndex.getBitWidth() > maxElements.getBitWidth()) 12179f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad maxElements = maxElements.extend(elementIndex.getBitWidth()); 1218f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor else if (elementIndex.getBitWidth() < maxElements.getBitWidth()) 12199f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad elementIndex = elementIndex.extend(maxElements.getBitWidth()); 1220e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor elementIndex.setIsUnsigned(maxElements.isUnsigned()); 1221f6c717c3dca839dcd189b4a6fa46c8fe7a8bec1dDouglas Gregor 122287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If the array is of incomplete type, keep track of the number of 122387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // elements in the initializer. 122487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 122587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor maxElements = elementIndex; 122605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 122705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 122805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 122905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 123005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we know the maximum number of elements, and we've already 123105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // hit it, stop consuming elements in the initializer list. 123205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElementsKnown && elementIndex == maxElements) 12330cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff break; 123405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 12358ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity ElementEntity = 1236dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex, 12378ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson Entity); 12388ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson // Check this element. 12398ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(ElementEntity, IList, elementType, Index, 12408ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 124105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++elementIndex; 124205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 124305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If the array is of incomplete type, keep track of the number of 124405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // elements in the initializer. 124505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (!maxElementsKnown && elementIndex > maxElements) 124605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor maxElements = elementIndex; 12470cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 124814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!hadError && DeclType->isIncompleteArrayType() && !VerifyOnly) { 12490cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff // If this is an incomplete array type, the actual type needs to 1250396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // be calculated here. 1251e3fa2de90ea1666bf4504b8fd557b09a57aac222Douglas Gregor llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned()); 125205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (maxElements == Zero) { 1253396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // Sizing an array implicitly to zero is not allowed by ISO C, 1254396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar // but is supported by GNU. 12550820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(IList->getLocStart(), 1256396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar diag::ext_typecheck_zero_array_size); 12570cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 1258396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar 12591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements, 1260396f0bfd4b2189452914893ce69f5fb068d0ec22Daniel Dunbar ArrayType::Normal, 0); 12610cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 12623ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!hadError && VerifyOnly) { 12633ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Check if there are any members of the array that get value-initialized. 12643ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // If so, check if doing that is possible. 12653ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // FIXME: This needs to detect holes left by designated initializers too. 12663ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (maxElementsKnown && elementIndex < maxElements) 12673ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable(InitializedEntity::InitializeElement( 12683ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl SemaRef.Context, 0, Entity)); 12693ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 12700cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 12710cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1272f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedmanbool InitListChecker::CheckFlexibleArrayInit(const InitializedEntity &Entity, 1273f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman Expr *InitExpr, 1274f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FieldDecl *Field, 1275f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman bool TopLevelObject) { 1276f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Handle GNU flexible array initializers. 1277f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman unsigned FlexArrayDiag; 1278f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman if (isa<InitListExpr>(InitExpr) && 1279f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman cast<InitListExpr>(InitExpr)->getNumInits() == 0) { 1280f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Empty flexible array init always allowed as an extension 1281f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::ext_flexible_array_init; 1282f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (SemaRef.getLangOptions().CPlusPlus) { 1283f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init in C++; it is not required for gcc 1284f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // compatibility, and it needs work to IRGen correctly in general. 1285f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1286f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (!TopLevelObject) { 1287f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on non-top-level object 1288f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1289f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (Entity.getKind() != InitializedEntity::EK_Variable) { 1290f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on anything which is not a variable. 1291f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1292f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else if (cast<VarDecl>(Entity.getDecl())->hasLocalStorage()) { 1293f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Disallow flexible array init on local variables. 1294f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::err_flexible_array_init; 1295f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } else { 1296f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Allow other cases. 1297f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman FlexArrayDiag = diag::ext_flexible_array_init; 1298f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman } 129914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 130014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 130114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(InitExpr->getSourceRange().getBegin(), 130214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl FlexArrayDiag) 130314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << InitExpr->getSourceRange().getBegin(); 130414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 130514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << Field; 130614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1307f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman 1308f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman return FlexArrayDiag != diag::ext_flexible_array_init; 1309f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman} 1310f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman 13118ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlssonvoid InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, 13122bbae5de98f486d03e10c039668182075b5569ddAnders Carlsson InitListExpr *IList, 13131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType DeclType, 131487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor RecordDecl::field_iterator Field, 13151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool SubobjectIsDesignatorContext, 13164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &Index, 13174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 1318eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned &StructuredIndex, 1319eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 13206217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl* structDecl = DeclType->getAs<RecordType>()->getDecl(); 13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1322b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // If the record is invalid, some of it's members are invalid. To avoid 1323b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman // confusion, we forgo checking the intializer for the entire record. 1324b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman if (structDecl->isInvalidDecl()) { 1325b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman hadError = true; 1326b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman return; 13271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 13283498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 13293498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor if (DeclType->isUnionType() && IList->getNumInits() == 0) { 13303ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Value-initialize the first named member of the union. 13313ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 13323ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl for (RecordDecl::field_iterator FieldEnd = RD->field_end(); 13333ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl Field != FieldEnd; ++Field) { 13343ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (Field->getDeclName()) { 13353ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly) 13363ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable( 13373ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializedEntity::InitializeMember(*Field, &Entity)); 13383ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl else 133914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setInitializedFieldInUnion(*Field); 13403ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl break; 13413498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 13423498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 13433498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return; 13443498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 13453498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 134605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If structDecl is a forward declaration, this loop won't do 134705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // anything except look at designated initializers; That's okay, 134805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // because an error should get printed out elsewhere. It might be 134905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // worthwhile to skip over the rest of the initializer, though. 13506217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); 135117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RecordDecl::field_iterator FieldEnd = RD->field_end(); 1352dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor bool InitializedSomething = false; 135380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall bool CheckForMissingFields = true; 135405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor while (Index < IList->getNumInits()) { 135505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Init = IList->getInit(Index); 135605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 135705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) { 135887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If we're not the subobject that matches up with the '{' for 135987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the designator, we shouldn't be handling the 136087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designator. Return immediately. 136187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!SubobjectIsDesignatorContext) 136287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return; 136387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 136487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Handle this designated initializer. Field will be updated to 136587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the next field that we'll be initializing. 13669a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson if (CheckDesignatedInitializer(Entity, IList, DIE, 0, 13674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DeclType, &Field, 0, Index, 1368eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, StructuredIndex, 1369eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, TopLevelObject)) 137005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor hadError = true; 137105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1372dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 137380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 137480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Disable check for missing fields when designators are used. 137580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // This matches gcc behaviour. 137680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall CheckForMissingFields = false; 137705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor continue; 137805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 137905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 138005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field == FieldEnd) { 138105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // We've run out of fields. We're done. 138244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor break; 138305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 138444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1385dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor // We've already initialized a member of a union. We're done. 1386dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor if (InitializedSomething && DeclType->isUnionType()) 1387dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor break; 1388dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor 138905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // If we've hit the flexible array member at the end, we're done. 139005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field->getType()->isIncompleteArrayType()) 1391b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman break; 139244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 13930bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (Field->isUnnamedBitfield()) { 13944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Don't initialize unnamed bitfields, e.g. "int : 20;" 139505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 1396b85f70719da9ce5a3ca9c801ee0748732e2660eeEli Friedman continue; 13970cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 139844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 139954001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor // Make sure we can use this declaration. 140014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool InvalidUse; 140114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 140214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InvalidUse = !SemaRef.CanUseDecl(*Field); 140314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 140414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, 140514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IList->getInit(Index)->getLocStart()); 140614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (InvalidUse) { 140754001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Index; 140854001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Field; 140954001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor hadError = true; 141054001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor continue; 141114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 141254001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor 14138ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 14148ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 14158ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 14168ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 1417dfb5e597e033c8fa09c0e178bd93cfcdf060862eDouglas Gregor InitializedSomething = true; 14180bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 141914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (DeclType->isUnionType() && !VerifyOnly) { 14200bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor // Initialize the first field within the union. 14210bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor StructuredList->setInitializedFieldInUnion(*Field); 14220bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 142305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 142405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ++Field; 14250cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff } 142644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 142780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Emit warnings for missing struct field initializers. 142814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && InitializedSomething && CheckForMissingFields && 142914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Field != FieldEnd && !Field->getType()->isIncompleteArrayType() && 143014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !DeclType->isUnionType()) { 143180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // It is possible we have one or more unnamed bitfields remaining. 143280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall // Find first (if any) named field and emit warning. 143380639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall for (RecordDecl::field_iterator it = Field, end = RD->field_end(); 143480639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall it != end; ++it) { 143580639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall if (!it->isUnnamedBitfield()) { 143680639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall SemaRef.Diag(IList->getSourceRange().getEnd(), 143780639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall diag::warn_missing_field_initializers) << it->getName(); 143880639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall break; 143980639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 144080639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 144180639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall } 144280639debfb2d90b2f1ffdbcd9a391f744cb0a393John McCall 14433ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // Check that any remaining fields can be value-initialized. 14443ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (VerifyOnly && Field != FieldEnd && !DeclType->isUnionType() && 14453ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl !Field->getType()->isIncompleteArrayType()) { 14463ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl // FIXME: Should check for holes left by designated initializers too. 14473ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl for (; Field != FieldEnd && !hadError; ++Field) { 14483ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl if (!Field->isUnnamedBitfield()) 14493ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl CheckValueInitializable( 14503ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl InitializedEntity::InitializeMember(*Field, &Entity)); 14513ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 14523ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl } 14533ff5c86d409a55d0e64a28c07197ee3e791166c2Sebastian Redl 14541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() || 1455a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor Index >= IList->getNumInits()) 1456eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return; 1457eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1458f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman if (CheckFlexibleArrayInit(Entity, IList->getInit(Index), *Field, 1459f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman TopLevelObject)) { 1460eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor hadError = true; 1461a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor ++Index; 1462a6457963cf7ffe71498c408dd590d9d1acb9513cDouglas Gregor return; 1463eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1464eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 14658ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 14668ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1467dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 14688ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson if (isa<InitListExpr>(IList->getInit(Index))) 1469dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 14708ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson StructuredList, StructuredIndex); 14718ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson else 1472dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index, 1473987dc6a3fa0917de269c9d60b7d4f21c68b8b09fAnders Carlsson StructuredList, StructuredIndex); 14740cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff} 14750cca749f64ff54476df3a4fc084821b8a8d712d5Steve Naroff 1476ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Expand a field designator that refers to a member of an 1477ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// anonymous struct or union into a series of field designators that 1478ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// refers to the field within the appropriate subobject. 1479ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// 1480ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorstatic void ExpandAnonymousFieldDesignator(Sema &SemaRef, 14811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedInitExpr *DIE, 14821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned DesigIdx, 1483a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IndirectFieldDecl *IndirectField) { 1484ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor typedef DesignatedInitExpr::Designator Designator; 1485ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1486ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Build the replacement designators. 14875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Designator, 4> Replacements; 1488a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(), 1489a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet PE = IndirectField->chain_end(); PI != PE; ++PI) { 1490a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (PI + 1 == PE) 14911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Replacements.push_back(Designator((IdentifierInfo *)0, 1492ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getDotLoc(), 1493ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor DIE->getDesignator(DesigIdx)->getFieldLoc())); 1494ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor else 1495ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Replacements.push_back(Designator((IdentifierInfo *)0, SourceLocation(), 1496ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor SourceLocation())); 1497a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(isa<FieldDecl>(*PI)); 1498a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Replacements.back().setField(cast<FieldDecl>(*PI)); 1499ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1500ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 1501ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // Expand the current designator into the set of replacement 1502ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // designators, so we have a full subobject path down to where the 1503ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // member of the anonymous struct/union is actually stored. 1504319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0], 1505ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor &Replacements[0] + Replacements.size()); 1506a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet} 15071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1508dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Given an implicit anonymous field, search the IndirectField that 1509a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet/// corresponds to FieldName. 1510a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichetstatic IndirectFieldDecl *FindIndirectFieldDesignator(FieldDecl *AnonField, 1511a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet IdentifierInfo *FieldName) { 1512a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet assert(AnonField->isAnonymousStructOrUnion()); 1513a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet Decl *NextDecl = AnonField->getNextDeclInContext(); 15143e78b19e51034dd27c6e0d811522148345e299e4Aaron Ballman while (IndirectFieldDecl *IF = 15153e78b19e51034dd27c6e0d811522148345e299e4Aaron Ballman dyn_cast_or_null<IndirectFieldDecl>(NextDecl)) { 1516a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (FieldName && FieldName == IF->getAnonField()->getIdentifier()) 1517a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet return IF; 1518a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet NextDecl = NextDecl->getNextDeclInContext(); 1519ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1520a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet return 0; 1521ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 1522ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 152314b0c194b356a1204d081765b3e6699687bed97cSebastian Redlstatic DesignatedInitExpr *CloneDesignatedInitExpr(Sema &SemaRef, 152414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr *DIE) { 152514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned NumIndexExprs = DIE->getNumSubExprs() - 1; 152614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SmallVector<Expr*, 4> IndexExprs(NumIndexExprs); 152714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl for (unsigned I = 0; I < NumIndexExprs; ++I) 152814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl IndexExprs[I] = DIE->getSubExpr(I + 1); 152914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return DesignatedInitExpr::Create(SemaRef.Context, DIE->designators_begin(), 153014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->size(), IndexExprs.data(), 153114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl NumIndexExprs, DIE->getEqualOrColonLoc(), 153214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->usesGNUSyntax(), DIE->getInit()); 153314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl} 153414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 1535425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrainnamespace { 1536425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1537425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain// Callback to only accept typo corrections that are for field members of 1538425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain// the given struct or union. 1539425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrainclass FieldInitializerValidatorCCC : public CorrectionCandidateCallback { 1540425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain public: 1541425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain explicit FieldInitializerValidatorCCC(RecordDecl *RD) 1542425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain : Record(RD) {} 1543425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1544425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain virtual bool ValidateCandidate(const TypoCorrection &candidate) { 1545425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>(); 1546425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain return FD && FD->getDeclContext()->getRedeclContext()->Equals(Record); 1547425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain } 1548425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1549425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain private: 1550425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain RecordDecl *Record; 1551425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain}; 1552425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 1553425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain} 1554425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain 155505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Check the well-formedness of a C99 designated initializer. 155605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 155705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Determines whether the designated initializer @p DIE, which 155805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// resides at the given @p Index within the initializer list @p 155905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// IList, is well-formed for a current object of type @p DeclType 156005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// (C99 6.7.8). The actual subobject that this designator refers to 15611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// within the current subobject is returned in either 15624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @p NextField or @p NextElementIndex (whichever is appropriate). 156305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 156405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param IList The initializer list in which this designated 156505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// initializer occurs. 156605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 1567711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DIE The designated initializer expression. 1568711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// 1569711997184366d584c9c437102cae1e9d9927b986Douglas Gregor/// @param DesigIdx The index of the current designator. 157005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 157105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param DeclType The type of the "current object" (C99 6.7.8p17), 157205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// into which the designation in @p DIE should refer. 157305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 157487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextField If non-NULL and the first designator in @p DIE is 157587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// a field, this will be set to the field declaration corresponding 157687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// to the field named by the designator. 157705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 157887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// @param NextElementIndex If non-NULL and the first designator in @p 157987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// DIE is an array designator or GNU array-range designator, this 158087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor/// will be set to the last index initialized by this designator. 158105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 158205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @param Index Index into @p IList where the designated initializer 158305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @p DIE occurs. 158405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 15854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @param StructuredList The initializer list expression that 15864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// describes all of the subobject initializers in the order they'll 15874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// actually be initialized. 15884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 158905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @returns true if there was an error, false otherwise. 15901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 15918ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders CarlssonInitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, 15929a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitListExpr *IList, 159314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr *DIE, 159414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned DesigIdx, 159514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl QualType &CurrentObjectType, 159614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl RecordDecl::field_iterator *NextField, 159714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl llvm::APSInt *NextElementIndex, 159814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned &Index, 159914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr *StructuredList, 160014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl unsigned &StructuredIndex, 1601eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool FinishSubobjectInit, 1602eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool TopLevelObject) { 1603711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if (DesigIdx == DIE->size()) { 160487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the actual initialization for the designated object type. 160587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 16066fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 16076fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Temporarily remove the designator expression from the 16086fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // initializer list that the child calls see, so that we don't try 16096fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // to re-process the designator. 16106fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor unsigned OldIndex = Index; 16116fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE->getInit()); 16126fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 16139a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson CheckSubElementType(Entity, IList, CurrentObjectType, Index, 16144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, StructuredIndex); 16156fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 16166fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // Restore the designated initializer expression in the syntactic 16176fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor // form of the initializer list. 16186fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor if (IList->getInit(OldIndex) != DIE->getInit()) 16196fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor DIE->setInit(IList->getInit(OldIndex)); 16206fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor IList->setInit(OldIndex, DIE); 16216fbdc6bd38cc51232223ae3539c32f23c45ea852Douglas Gregor 162287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 162387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 162405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 1625711997184366d584c9c437102cae1e9d9927b986Douglas Gregor DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx); 162614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool IsFirstDesignator = (DesigIdx == 0); 162714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 162814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert((IsFirstDesignator || StructuredList) && 162914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl "Need a non-designated initializer list to start from"); 163014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 163114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Determine the structural initializer list that corresponds to the 163214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // current subobject. 163314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList = IsFirstDesignator? SyntacticToSemantic[IList] 163414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl : getStructuredSubobjectInit(IList, Index, CurrentObjectType, 163514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList, StructuredIndex, 163614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SourceRange(D->getStartLocation(), 163714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->getSourceRange().getEnd())); 163814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert(StructuredList && "Expected a structured initializer list"); 163914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 16404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 164187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (D->isFieldDesignator()) { 164287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p7: 164387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 164487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 164587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 164687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // . identifier 164787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 164887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have 164987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // structure or union type and the identifier shall be the 16501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // name of a member of that type. 16516217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = CurrentObjectType->getAs<RecordType>(); 165287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!RT) { 165387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation Loc = D->getDotLoc(); 165487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (Loc.isInvalid()) 165587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Loc = D->getFieldLoc(); 165614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 165714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Loc, diag::err_field_designator_non_aggr) 165814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << SemaRef.getLangOptions().CPlusPlus << CurrentObjectType; 165987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 166087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 166187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 166287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 16634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Note: we perform a linear search of the fields here, despite 16644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the fact that we have a faster lookup method, because we always 16654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // need to compute the field's index. 1666ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor FieldDecl *KnownField = D->getField(); 166787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IdentifierInfo *FieldName = D->getFieldName(); 16684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned FieldIndex = 0; 16691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RecordDecl::field_iterator 167017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Field = RT->getDecl()->field_begin(), 167117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RT->getDecl()->field_end(); 16724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (; Field != FieldEnd; ++Field) { 16734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field->isUnnamedBitfield()) 16744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor continue; 1675dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1676a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet // If we find a field representing an anonymous field, look in the 1677a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet // IndirectFieldDecl that follow for the designated initializer. 1678a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (!KnownField && Field->isAnonymousStructOrUnion()) { 1679a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (IndirectFieldDecl *IF = 1680a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet FindIndirectFieldDesignator(*Field, FieldName)) { 168114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // In verify mode, don't modify the original. 168214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 168314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE = CloneDesignatedInitExpr(SemaRef, DIE); 1684a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IF); 1685a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet D = DIE->getDesignator(DesigIdx); 1686a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet break; 1687a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1688a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet } 1689022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor if (KnownField && KnownField == *Field) 1690022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor break; 1691022d13de47a5f02d1e4089fa3360fae8bcb17666Douglas Gregor if (FieldName && FieldName == Field->getIdentifier()) 16924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor break; 16934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 16944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 169587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 169687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 16974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Field == FieldEnd) { 1698a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer if (VerifyOnly) { 1699a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer ++Index; 170014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return true; // No typo correction when just trying this out. 1701a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer } 170214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 1703ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // There was no normal field in the struct with the designated 1704ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // name. Perform another lookup for this name, which may find 1705ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // something that we can't designate (e.g., a member function), 1706ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // may find nothing, or may find a member of an anonymous 17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // struct/union. 170817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName); 1709c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldDecl *ReplacementField = 0; 17104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Lookup.first == Lookup.second) { 1711c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // Name lookup didn't find anything. Determine whether this 1712c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // was a typo for another field name. 1713425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain FieldInitializerValidatorCCC Validator(RT->getDecl()); 1714d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor TypoCorrection Corrected = SemaRef.CorrectTypo( 1715d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor DeclarationNameInfo(FieldName, D->getFieldLoc()), 171616e46dd0c284296cea819dfbf67942ecef02894dKaelyn Uhrain Sema::LookupMemberName, /*Scope=*/0, /*SS=*/0, Validator, 1717425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain RT->getDecl()); 1718425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain if (Corrected) { 1719d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor std::string CorrectedStr( 1720d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Corrected.getAsString(SemaRef.getLangOptions())); 1721d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor std::string CorrectedQuotedStr( 1722d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor Corrected.getQuoted(SemaRef.getLangOptions())); 1723425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain ReplacementField = Corrected.getCorrectionDeclAs<FieldDecl>(); 1724dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.Diag(D->getFieldLoc(), 1725c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor diag::err_field_designator_unknown_suggest) 1726d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << FieldName << CurrentObjectType << CorrectedQuotedStr 1727d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor << FixItHint::CreateReplacement(D->getFieldLoc(), CorrectedStr); 1728dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi SemaRef.Diag(ReplacementField->getLocation(), 1729d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor diag::note_previous_decl) << CorrectedQuotedStr; 1730a41ee4921f0b42861cbb795752919ee3eddaf143Benjamin Kramer hadError = true; 1731c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } else { 1732c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown) 1733c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor << FieldName << CurrentObjectType; 1734c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++Index; 1735c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor return true; 1736c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1737c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1738dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 1739c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (!ReplacementField) { 17404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Name lookup found something, but it wasn't a field. 17410820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield) 17424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << FieldName; 17431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag((*Lookup.first)->getLocation(), 17444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_field_designator_found); 1745ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman ++Index; 1746ba79fc2d1b742e34df104aadb2780725c2a882fcEli Friedman return true; 1747ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 1748c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1749a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet if (!KnownField) { 1750c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // The replacement field comes from typo correction; find it 1751c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor // in the list of fields. 1752c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor FieldIndex = 0; 1753c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field = RT->getDecl()->field_begin(); 1754c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor for (; Field != FieldEnd; ++Field) { 1755c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor if (Field->isUnnamedBitfield()) 1756c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor continue; 1757c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1758dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (ReplacementField == *Field || 1759c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor Field->getIdentifier() == ReplacementField->getIdentifier()) 1760c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor break; 1761c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor 1762c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor ++FieldIndex; 1763c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 1764c171e3b192a372669cf622ff0b6a847f8e5b4220Douglas Gregor } 176587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 17664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 17674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // All of the fields of a union are located at the same place in 17684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // the initializer list. 17690bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor if (RT->getDecl()->isUnion()) { 17704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor FieldIndex = 0; 177114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 177214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->setInitializedFieldInUnion(*Field); 17730bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor } 17744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 177554001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor // Make sure we can use this declaration. 177614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl bool InvalidUse; 177714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 177814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InvalidUse = !SemaRef.CanUseDecl(*Field); 177914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl else 178014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc()); 178114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (InvalidUse) { 178254001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor ++Index; 178354001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor return true; 178414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 178554001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor 178614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 178714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Update the designator with the field declaration. 178814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl D->setField(*Field); 17891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 179014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Make sure that our non-designated initializer list has space 179114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // for a subobject corresponding to this field. 179214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (FieldIndex >= StructuredList->getNumInits()) 179314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1); 179414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 17954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1796eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // This designator names a flexible array member. 1797eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Field->getType()->isIncompleteArrayType()) { 1798eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool Invalid = false; 1799711997184366d584c9c437102cae1e9d9927b986Douglas Gregor if ((DesigIdx + 1) != DIE->size()) { 1800eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // We can't designate an object within the flexible array 1801eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // member (because GCC doesn't allow it). 180214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 180314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedInitExpr::Designator *NextD 180414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl = DIE->getDesignator(DesigIdx + 1); 180514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(NextD->getStartLocation(), 180614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_designator_into_flexible_array_member) 180714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << SourceRange(NextD->getStartLocation(), 180814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->getSourceRange().getEnd()); 180914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 181014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << *Field; 181114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1812eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1813eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1814eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 18159046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner if (!hadError && !isa<InitListExpr>(DIE->getInit()) && 18169046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner !isa<StringLiteral>(DIE->getInit())) { 1817eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // The initializer is not an initializer list. 181814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) { 181914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(DIE->getInit()->getSourceRange().getBegin(), 182014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_flexible_array_init_needs_braces) 182114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DIE->getInit()->getSourceRange(); 182214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member) 182314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << *Field; 182414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 1825eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1826eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1827eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1828f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman // Check GNU flexible array initializer. 1829f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman if (!Invalid && CheckFlexibleArrayInit(Entity, DIE->getInit(), *Field, 1830f40fd6bbb2684db5efb18627ea355613c235d23fEli Friedman TopLevelObject)) 1831eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor Invalid = true; 1832eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1833eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (Invalid) { 1834eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Index; 1835eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1836eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1837eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor 1838eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Initialize the array. 1839eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor bool prevHadError = hadError; 1840eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1841eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned OldIndex = Index; 1842eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(Index, DIE->getInit()); 18438ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 18448ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity MemberEntity = 18458ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 18468ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckSubElementType(MemberEntity, IList, Field->getType(), Index, 1847eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredList, newStructuredIndex); 18488ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson 1849eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor IList->setInit(OldIndex, DIE); 1850eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (hadError && !prevHadError) { 1851eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++Field; 1852eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor ++FieldIndex; 1853eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor if (NextField) 1854eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor *NextField = Field; 1855eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor StructuredIndex = FieldIndex; 1856eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1857eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 1858eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } else { 1859eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor // Recurse to check later designated subobjects. 1860eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor QualType FieldType = (*Field)->getType(); 1861eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor unsigned newStructuredIndex = FieldIndex; 1862dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 18639a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity MemberEntity = 18648ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeMember(*Field, &Entity); 1865dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1, 1866dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi FieldType, 0, 0, Index, 18679a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, newStructuredIndex, 1868eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor true, false)) 1869eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor return true; 1870eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor } 187187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 187287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Find the position of the next field to be initialized in this 187387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // subobject. 187487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Field; 18754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++FieldIndex; 187605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 187787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 187887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this struct/class/union subobject. 187987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 188087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextField) 188187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor *NextField = Field; 18824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = FieldIndex; 188387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 188487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 188505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 188634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 188734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 188834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1889ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor // We've already initialized something in the union; we're done. 1890ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (RT->getDecl()->isUnion()) 1891ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return hadError; 1892ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 189387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining fields within this class/struct/union subobject. 189487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor bool prevHadError = hadError; 1895dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 18968ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson CheckStructUnionTypes(Entity, IList, CurrentObjectType, Field, false, Index, 18974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, FieldIndex); 189887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return hadError && !prevHadError; 189987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 190005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 190187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // C99 6.7.8p6: 190287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 190387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If a designator has the form 190487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 190587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ] 190687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 190787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // then the current object (defined below) shall have array 190887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // type and the expression shall be an integer constant 190987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // expression. If the array is of unknown size, any 191087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // nonnegative value is valid. 191187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 191287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Additionally, cope with the GNU extension that permits 191387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // designators of the form 191487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // 191587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // [ constant-expression ... constant-expression ] 19160820254f97bb8925d933a3664ea1c6fca3997b97Chris Lattner const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType); 191787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (!AT) { 191814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly) 191914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array) 192014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << CurrentObjectType; 192187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 192287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 192387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 192405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 192587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor Expr *IndexExpr = 0; 192634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor llvm::APSInt DesignatedStartIndex, DesignatedEndIndex; 192734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (D->isArrayDesignator()) { 192887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayIndex(*D); 1929a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DesignatedStartIndex = IndexExpr->EvaluateKnownConstInt(SemaRef.Context); 193034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex = DesignatedStartIndex; 193134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 193287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(D->isArrayRangeDesignator() && "Need array-range designator"); 19333bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 19341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedStartIndex = 1935a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DIE->getArrayRangeStart(*D)->EvaluateKnownConstInt(SemaRef.Context); 19361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DesignatedEndIndex = 1937a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith DIE->getArrayRangeEnd(*D)->EvaluateKnownConstInt(SemaRef.Context); 193887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor IndexExpr = DIE->getArrayRangeEnd(*D); 193934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 1940e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // Codegen can't handle evaluating array range designators that have side 1941e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // effects, because we replicate the AST value for each initialized element. 1942e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // As such, set the sawArrayRangeDesignator() bit if we initialize multiple 1943e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // elements with something that has a side effect, so codegen can emit an 1944e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner // "error unsupported" error instead of miscompiling the app. 1945e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&& 194614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DIE->getInit()->HasSideEffects(SemaRef.Context) && !VerifyOnly) 1947a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor FullyStructuredList->sawArrayRangeDesignator(); 194887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 194905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 195087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (isa<ConstantArrayType>(AT)) { 195187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false); 19529f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 19539f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth()); 195434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned()); 19559f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 19569f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth()); 195734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned()); 195834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedEndIndex >= MaxElements) { 1959a4e20e1e43df39e39328035c84c46fdcbbf3a01eEli Friedman if (!VerifyOnly) 196014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl SemaRef.Diag(IndexExpr->getSourceRange().getBegin(), 196114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl diag::err_array_designator_too_large) 196214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << DesignatedEndIndex.toString(10) << MaxElements.toString(10) 196314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl << IndexExpr->getSourceRange(); 196487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor ++Index; 196587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return true; 196605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 196734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } else { 196834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Make sure the bit-widths and signedness match. 196934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (DesignatedStartIndex.getBitWidth() > DesignatedEndIndex.getBitWidth()) 19709f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedEndIndex 19719f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedEndIndex.extend(DesignatedStartIndex.getBitWidth()); 19723bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner else if (DesignatedStartIndex.getBitWidth() < 19733bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner DesignatedEndIndex.getBitWidth()) 19749f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad DesignatedStartIndex 19759f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad = DesignatedStartIndex.extend(DesignatedEndIndex.getBitWidth()); 197634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedStartIndex.setIsUnsigned(true); 197734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.setIsUnsigned(true); 197805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 19791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Make sure that our non-designated initializer list has space 19814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // for a subobject corresponding to this array element. 198214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (!VerifyOnly && 198314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits()) 19841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredList->resizeInits(SemaRef.Context, 198534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor DesignatedEndIndex.getZExtValue() + 1); 198634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 198734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Repeatedly perform subobject initializations in the range 198834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // [DesignatedStartIndex, DesignatedEndIndex]. 198934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 199034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next designator 199134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned ElementIndex = DesignatedStartIndex.getZExtValue(); 199234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor unsigned OldIndex = Index; 1993dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 19949a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson InitializedEntity ElementEntity = 19958ff9e86c492c784b3ce2abe5b5d870cd6db365a8Anders Carlsson InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity); 19969a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson 199734e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor while (DesignatedStartIndex <= DesignatedEndIndex) { 199834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Recurse to check later designated subobjects. 199934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor QualType ElementType = AT->getElementType(); 200034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor Index = OldIndex; 2001dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 20029a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson ElementEntity.setElementIndex(ElementIndex); 2003dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (CheckDesignatedInitializer(ElementEntity, IList, DIE, DesigIdx + 1, 2004dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ElementType, 0, 0, Index, 20059a8a70ef79f68db5b17d505eb9681bf161384fe8Anders Carlsson StructuredList, ElementIndex, 2006eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor (DesignatedStartIndex == DesignatedEndIndex), 2007eeb15d499f032bb89773ddaca2d17475122a37bbDouglas Gregor false)) 200834e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return true; 200987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 201034e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor // Move to the next index in the array that we'll be initializing. 201134e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ++DesignatedStartIndex; 201234e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor ElementIndex = DesignatedStartIndex.getZExtValue(); 201334e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor } 201487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 201587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // If this the first designator, our caller will continue checking 201687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // the rest of this array subobject. 201787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (IsFirstDesignator) { 201887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor if (NextElementIndex) 201934e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor *NextElementIndex = DesignatedStartIndex; 20204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredIndex = ElementIndex; 202187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return false; 202287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 20231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 202434e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor if (!FinishSubobjectInit) 202534e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor return false; 202634e7946831a63f96d3ba3478c74ca8e25ee52d7eDouglas Gregor 202787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor // Check the remaining elements within this array subobject. 202805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool prevHadError = hadError; 2029dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex, 2030784f69940755dd66cf244dd84f57a57d358e5c43Anders Carlsson /*SubobjectIsDesignatorContext=*/false, Index, 20314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor StructuredList, ElementIndex); 20321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return hadError && !prevHadError; 203305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 203405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 20354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// Get the structured initializer list for a subobject of type 20364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor// @p CurrentObjectType. 20374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListExpr * 20384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorInitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, 20394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor QualType CurrentObjectType, 20404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *StructuredList, 20414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned StructuredIndex, 20424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceRange InitRange) { 204314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (VerifyOnly) 204414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return 0; // No structured list in verification-only mode. 20454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *ExistingInit = 0; 20464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 20474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = SyntacticToSemantic[IList]; 20484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else if (StructuredIndex < StructuredList->getNumInits()) 20494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ExistingInit = StructuredList->getInit(StructuredIndex); 20501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit)) 20524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 20534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 20544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (ExistingInit) { 20554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // We are creating an initializer list that initializes the 20564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobjects of the current object, but there was already an 20574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // initialization that completely initialized the current 20584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject, e.g., by a compound literal: 20591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 20604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X { int a, b; }; 20614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 }; 20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 20634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Here, xs[0].a == 0 and xs[0].b == 3, since the second, 20644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // designated initializer re-initializes the whole 20654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // subobject [0], overwriting previous initializers. 20661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(InitRange.getBegin(), 2067ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor diag::warn_subobject_initializer_overrides) 20684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << InitRange; 20691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(ExistingInit->getSourceRange().getBegin(), 20704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 207154f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 20724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << ExistingInit->getSourceRange(); 20734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 20744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 20751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump InitListExpr *Result 2076709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek = new (SemaRef.Context) InitListExpr(SemaRef.Context, 2077709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitRange.getBegin(), 0, 0, 2078ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek InitRange.getEnd()); 2079ed8a93d17b8936dc7978cdc37f3f00fc49d24f71Douglas Gregor 20806398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor Result->setType(CurrentObjectType.getNonLValueExprType(SemaRef.Context)); 20814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 2082fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Pre-allocate storage for the structured initializer list. 2083fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor unsigned NumElements = 0; 208408457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor unsigned NumInits = 0; 2085f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis bool GotNumInits = false; 2086f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (!StructuredList) { 208708457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = IList->getNumInits(); 2088f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis GotNumInits = true; 2089f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis } else if (Index < IList->getNumInits()) { 2090f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) { 209108457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor NumInits = SubList->getNumInits(); 2092f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis GotNumInits = true; 2093f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis } 209408457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor } 209508457737b60ba2e7f58ecf3062010843268fc6eaDouglas Gregor 20961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ArrayType *AType 2097fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor = SemaRef.Context.getAsArrayType(CurrentObjectType)) { 2098fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) { 2099fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = CAType->getSize().getZExtValue(); 2100fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // Simple heuristic so that we don't allocate a very large 2101fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor // initializer with many empty entries at the end. 2102f8b1771677743d24c7391305cad8853c513ec0f8Argyrios Kyrtzidis if (GotNumInits && NumElements > NumInits) 2103fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 0; 2104fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 2105183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) 2106fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = VType->getNumElements(); 21076217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const RecordType *RType = CurrentObjectType->getAs<RecordType>()) { 2108fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor RecordDecl *RDecl = RType->getDecl(); 2109fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (RDecl->isUnion()) 2110fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor NumElements = 1; 2111fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor else 21121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumElements = std::distance(RDecl->field_begin(), 211317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis RDecl->field_end()); 2114fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor } 2115fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 2116709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Result->reserveInits(SemaRef.Context, NumElements); 2117fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 21184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // Link this new initializer list into the structured initializer 21194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // lists. 21204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (StructuredList) 2121709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result); 21224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else { 21234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Result->setSyntacticForm(IList); 21244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SyntacticToSemantic[IList] = Result; 21254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 21264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 21274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 21284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 21294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 21304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Update the initializer at index @p StructuredIndex within the 21314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// structured initializer list to the value @p expr. 21324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregorvoid InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, 21334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor unsigned &StructuredIndex, 21344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *expr) { 21354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // No structured initializer list to update 21364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (!StructuredList) 21374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return; 21384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 2139709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, 2140709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek StructuredIndex, expr)) { 21414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor // This initializer overwrites a previous initializer. Warn. 21421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(expr->getSourceRange().getBegin(), 21434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::warn_initializer_overrides) 21444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << expr->getSourceRange(); 21451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Diag(PrevInit->getSourceRange().getBegin(), 21464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor diag::note_previous_initializer) 214754f0728c2ab0f967e976300478b2f5cdfed78415Douglas Gregor << /*FIXME:has side effects=*/0 21484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor << PrevInit->getSourceRange(); 21494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 21501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor ++StructuredIndex; 21524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 21534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 215405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// Check that the given Index expression is a valid array designator 2155282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// value. This is essentially just a wrapper around 21563bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner/// VerifyIntegerConstantExpression that also checks for negative values 215705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// and produces a reasonable diagnostic if there is a 2158282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// failure. Returns the index expression, possibly with an implicit cast 2159282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// added, on success. If everything went okay, Value will receive the 2160282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith/// value of the constant expression. 2161282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smithstatic ExprResult 21623bf6893b77c30cb774100e0fa7ae029331675ec1Chris LattnerCheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) { 216305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation Loc = Index->getSourceRange().getBegin(); 216405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 216505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Make sure this is an integer constant expression. 2166282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith ExprResult Result = S.VerifyIntegerConstantExpression(Index, &Value); 2167282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (Result.isInvalid()) 2168282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith return Result; 21693bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner 21703bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner if (Value.isSigned() && Value.isNegative()) 21713bf6893b77c30cb774100e0fa7ae029331675ec1Chris Lattner return S.Diag(Loc, diag::err_array_designator_negative) 217205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor << Value.toString(10) << Index->getSourceRange(); 217305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 217453d3d8e0662197f7245d8f5ff697a72a2b4b3f54Douglas Gregor Value.setIsUnsigned(true); 2175282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith return Result; 217605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 217705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 217860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, 21797663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky SourceLocation Loc, 21807663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky bool GNUSyntax, 21817663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky ExprResult Init) { 218205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef DesignatedInitExpr::Designator ASTDesignator; 218305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 218405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool Invalid = false; 21855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ASTDesignator, 32> Designators; 21865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Expr *, 32> InitExpressions; 218705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 218805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Build designators and check array designator expressions. 218905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) { 219005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor const Designator &D = Desig.getDesignator(Idx); 219105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor switch (D.getKind()) { 219205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::FieldDesignator: 21931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(), 219405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getFieldLoc())); 219505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 219605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 219705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayDesignator: { 219805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *Index = static_cast<Expr *>(D.getArrayIndex()); 219905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt IndexValue; 2200282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!Index->isTypeDependent() && !Index->isValueDependent()) 2201282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith Index = CheckArrayDesignatorExpr(*this, Index, IndexValue).take(); 2202282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!Index) 220305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 220405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else { 220505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 22061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 220705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor D.getRBracketLoc())); 220805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor InitExpressions.push_back(Index); 220905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 221005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 221105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 221205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 221305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor case Designator::ArrayRangeDesignator: { 221405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart()); 221505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd()); 221605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt StartValue; 221705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor llvm::APSInt EndValue; 22189ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool StartDependent = StartIndex->isTypeDependent() || 22199ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor StartIndex->isValueDependent(); 22209ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor bool EndDependent = EndIndex->isTypeDependent() || 22219ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor EndIndex->isValueDependent(); 2222282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!StartDependent) 2223282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith StartIndex = 2224282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith CheckArrayDesignatorExpr(*this, StartIndex, StartValue).take(); 2225282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!EndDependent) 2226282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith EndIndex = CheckArrayDesignatorExpr(*this, EndIndex, EndValue).take(); 2227282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith 2228282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith if (!StartIndex || !EndIndex) 222905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Invalid = true; 2230d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else { 2231d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor // Make sure we're comparing values with the same bit width. 22329ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (StartDependent || EndDependent) { 22339ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Nothing to compute. 22349ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (StartValue.getBitWidth() > EndValue.getBitWidth()) 22359f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad EndValue = EndValue.extend(StartValue.getBitWidth()); 2236d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor else if (StartValue.getBitWidth() < EndValue.getBitWidth()) 22379f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad StartValue = StartValue.extend(EndValue.getBitWidth()); 2238d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor 2239c4bb7bfe8328f79004517dd268f6146c8066c205Douglas Gregor if (!StartDependent && !EndDependent && EndValue < StartValue) { 2240d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range) 22411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << StartValue.toString(10) << EndValue.toString(10) 2242d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor << StartIndex->getSourceRange() << EndIndex->getSourceRange(); 2243d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Invalid = true; 2244d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } else { 2245d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor Designators.push_back(ASTDesignator(InitExpressions.size(), 22461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D.getLBracketLoc(), 2247d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getEllipsisLoc(), 2248d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor D.getRBracketLoc())); 2249d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(StartIndex); 2250d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor InitExpressions.push_back(EndIndex); 2251d6f584ff262f51b40f4c9e317b13f1f21db29755Douglas Gregor } 225205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 225305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor break; 225405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 225505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 225605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 225705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 225805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Invalid || Init.isInvalid()) 225905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return ExprError(); 226005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 226105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Clear out the expressions within the designation. 226205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Desig.ClearExprs(*this); 226305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 226405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor DesignatedInitExpr *DIE 2265beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad = DesignatedInitExpr::Create(Context, 2266beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Designators.data(), Designators.size(), 2267beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad InitExpressions.data(), InitExpressions.size(), 2268e9146f2e9f1c4e281544e8c080934c72d41012caAnders Carlsson Loc, GNUSyntax, Init.takeAs<Expr>()); 2269dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2270d7c56e1114bfe7d461786903bb720d2c6efc05a1Richard Smith if (!getLangOptions().C99) 22712d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor Diag(DIE->getLocStart(), diag::ext_designated_init) 22722d75bbd36e273f7b958aefc766424220ad158bd9Douglas Gregor << DIE->getSourceRange(); 2273dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 227405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return Owned(DIE); 227505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 2276c34ee5ef2b267a683c432ba0c342f7c3a14889d6Douglas Gregor 2277cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 2278cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor// Initialization entity 2279cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor//===----------------------------------------------------------------------===// 228039da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor 2281dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index, 2282cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor const InitializedEntity &Parent) 2283dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi : Parent(&Parent), Index(Index) 2284cb57fb9f91e0976f4a3382b89a2734ffa50eb6fbDouglas Gregor{ 2285d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) { 2286d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_ArrayElement; 2287d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Type = AT->getElementType(); 22880c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else if (const VectorType *VT = Parent.getType()->getAs<VectorType>()) { 2289d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson Kind = EK_VectorElement; 22900c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Type = VT->getElementType(); 22910c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman } else { 22920c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman const ComplexType *CT = Parent.getType()->getAs<ComplexType>(); 22930c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman assert(CT && "Unexpected type"); 22940c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Kind = EK_ComplexElement; 22950c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman Type = CT->getElementType(); 2296d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson } 229720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 229820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2299dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiInitializedEntity InitializedEntity::InitializeBase(ASTContext &Context, 2300711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson CXXBaseSpecifier *Base, 2301711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson bool IsInheritedVirtualBase) 230220093b4bf698f292c664676987541d5103b65b15Douglas Gregor{ 230320093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializedEntity Result; 230420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Result.Kind = EK_Base; 2305711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base = reinterpret_cast<uintptr_t>(Base); 2306711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson if (IsInheritedVirtualBase) 2307711f34adb886cce8ba86c7b1b6513a1eaaf63bb5Anders Carlsson Result.Base |= 0x01; 2308dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2309d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Result.Type = Base->getType(); 231020093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 231120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 231220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 231399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas GregorDeclarationName InitializedEntity::getName() const { 231499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (getKind()) { 2315f85e193739c953358c865005855253af4f68a497John McCall case EK_Parameter: { 2316f85e193739c953358c865005855253af4f68a497John McCall ParmVarDecl *D = reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1); 2317f85e193739c953358c865005855253af4f68a497John McCall return (D ? D->getDeclName() : DeclarationName()); 2318f85e193739c953358c865005855253af4f68a497John McCall } 2319a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor 2320a188ff2d8a18140541fcd5884deda4552dac71a7Douglas Gregor case EK_Variable: 232199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Member: 232299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return VariableOrMember->getDeclName(); 232399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 23244773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case EK_LambdaCapture: 23254773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor return Capture.Var->getDeclName(); 23264773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor 232799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Result: 232899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Exception: 232918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case EK_New: 233099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Temporary: 233199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case EK_Base: 2332059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 2333d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2334d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 23350c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2336310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 233799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return DeclarationName(); 233899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 2339dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23407530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 234199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 234299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 23437abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas GregorDeclaratorDecl *InitializedEntity::getDecl() const { 23447abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor switch (getKind()) { 23457abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Variable: 23467abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Member: 23477abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return VariableOrMember; 23487abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 2349f85e193739c953358c865005855253af4f68a497John McCall case EK_Parameter: 2350f85e193739c953358c865005855253af4f68a497John McCall return reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1); 2351f85e193739c953358c865005855253af4f68a497John McCall 23527abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Result: 23537abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Exception: 23547abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_New: 23557abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Temporary: 23567abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor case EK_Base: 2357059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 2358d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_ArrayElement: 2359d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case EK_VectorElement: 23600c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2361310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 23624773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case EK_LambdaCapture: 23637abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor return 0; 23647abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor } 2365dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23667530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 23677abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor} 23687abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor 23693c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregorbool InitializedEntity::allowsNRVO() const { 23703c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor switch (getKind()) { 23713c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Result: 23723c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Exception: 23733c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return LocAndNRVO.NRVO; 2374dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 23753c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Variable: 23763c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Parameter: 23773c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Member: 23783c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_New: 23793c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Temporary: 23803c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_Base: 2381059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case EK_Delegating: 23823c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_ArrayElement: 23833c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor case EK_VectorElement: 23840c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case EK_ComplexElement: 2385310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case EK_BlockElement: 23864773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case EK_LambdaCapture: 23873c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor break; 23883c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor } 23893c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 23903c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor return false; 23913c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor} 23923c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor 239320093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 239420093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Initialization sequence 239520093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 239620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 239720093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::Step::Destroy() { 239820093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Kind) { 239920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 240020093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 2401906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 240220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: 240320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 240420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 2405523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 240620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: 240720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionRValue: 2408906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 240920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 2410d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: 24118713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case SK_ListConstructorCall: 241213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 241313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 241451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case SK_ConstructorInitialization: 241571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: 241618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 2417cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 2418569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 2419cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 2420f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 2421f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 2422f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 24232b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_StdInitializerList: 242420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 2425dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 242620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ConversionSequence: 242720093b4bf698f292c664676987541d5103b65b15Douglas Gregor delete ICS; 242820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 242920093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 243020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2431b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isDirectReferenceBinding() const { 24323b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl return !Steps.empty() && Steps.back().Kind == SK_BindReference; 2433b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2434b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2435b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregorbool InitializationSequence::isAmbiguous() const { 2436d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (!Failed()) 2437b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2438dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2439b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor switch (getFailureKind()) { 2440b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForReference: 2441b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitList: 2442b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 2443b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_AddressOfOverloadFailed: // FIXME: Could do better 2444b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 2445b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 2446b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_RValueReferenceBindingToLValue: 2447b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitDropsQualifiers: 2448b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitFailed: 2449b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConversionFailed: 2450429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 2451b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_TooManyInitsForScalar: 2452b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceBindingToInitList: 2453b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_InitListBadDestinationType: 2454b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_DefaultInitOfConst: 245572a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 2456cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 2457cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 24588713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_ListInitializationFailed: 245973076431605556fdbf28d287d084a73a24a8b8d4John McCall case FK_VariableLengthArrayHasInitializer: 24605acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: 24612b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case FK_InitListElementCopyFailure: 2462b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return false; 2463dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 2464b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ReferenceInitOverloadFailed: 2465b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_UserConversionOverloadFailed: 2466b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor case FK_ConstructorOverloadFailed: 2467cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl case FK_ListConstructorOverloadFailed: 2468b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor return FailedOverloadResult == OR_Ambiguous; 2469b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor } 2470dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 24717530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 2472b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor} 2473b70cf44bf1b1956e0c6b98373c4f69b23afa0052Douglas Gregor 2474d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregorbool InitializationSequence::isConstructorInitialization() const { 2475d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization; 2476d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor} 2477d6e44a3c4193bd422bfa78c8086fb16bb2168e34Douglas Gregor 247822c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnaravoid 247922c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence 248022c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara::AddAddressOverloadResolutionStep(FunctionDecl *Function, 248122c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara DeclAccessPair Found, 248222c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates) { 248320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 248420093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ResolveAddressOfOverloadedFunction; 248520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Function->getType(); 248622c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 24879aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 24886bb8017bb9e828d118e15e59d71c66bba323c364John McCall S.Function.FoundDecl = Found; 248920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 249020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 249120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2492dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType, 24935baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 249420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 24955baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 24965baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: S.Kind = SK_CastDerivedToBaseRValue; break; 24975baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break; 24985baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break; 2499906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 250020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = BaseType; 250120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 250220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 250320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2504dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::AddReferenceBindingStep(QualType T, 250520093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool BindingTemporary) { 250620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 250720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference; 250820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 250920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 251020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 251120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2512523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregorvoid InitializationSequence::AddExtraneousCopyToTemporary(QualType T) { 2513523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Step S; 2514523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Kind = SK_ExtraneousCopyToTemporary; 2515523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor S.Type = T; 2516523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Steps.push_back(S); 2517523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor} 2518523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 251922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnaravoid 252022c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence::AddUserConversionStep(FunctionDecl *Function, 252122c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara DeclAccessPair FoundDecl, 252222c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara QualType T, 252322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates) { 252420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 252520093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_UserConversion; 252603981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman S.Type = T; 252722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 25289aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Function; 25299aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = FoundDecl; 253020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 253120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 253220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 253320093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddQualificationConversionStep(QualType Ty, 25345baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 253520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 253638a4ffe5244e6be46f1b1f8394342a77836be776John McCall S.Kind = SK_QualificationConversionRValue; // work around a gcc warning 25375baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall switch (VK) { 25385baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_RValue: 2539906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionRValue; 2540906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 25415baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_XValue: 2542906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionXValue; 2543906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 25445baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall case VK_LValue: 2545906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl S.Kind = SK_QualificationConversionLValue; 2546906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 2547906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 254820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = Ty; 254920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 255020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 255120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 255220093b4bf698f292c664676987541d5103b65b15Douglas Gregorvoid InitializationSequence::AddConversionSequenceStep( 255320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const ImplicitConversionSequence &ICS, 255420093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T) { 255520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step S; 255620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Kind = SK_ConversionSequence; 255720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Type = T; 255820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.ICS = new ImplicitConversionSequence(ICS); 255920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Steps.push_back(S); 256020093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 256120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2562d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregorvoid InitializationSequence::AddListInitializationStep(QualType T) { 2563d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Step S; 2564d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Kind = SK_ListInitialization; 2565d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Type = T; 2566d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Steps.push_back(S); 2567d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor} 2568d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 2569dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid 257022c107b2b99887b5aec6d1fd38210031e944e31fAbramo BagnaraInitializationSequence 257122c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara::AddConstructorInitializationStep(CXXConstructorDecl *Constructor, 257222c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara AccessSpecifier Access, 257322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara QualType T, 257410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl bool HadMultipleCandidates, 25756cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl bool FromInitList, bool AsInitList) { 257651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Step S; 25776cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl S.Kind = FromInitList && !AsInitList ? SK_ListConstructorCall 25786cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl : SK_ConstructorInitialization; 257951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Type = T; 258022c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara S.Function.HadMultipleCandidates = HadMultipleCandidates; 25819aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.Function = Constructor; 25829aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.Function.FoundDecl = DeclAccessPair::make(Constructor, Access); 258351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Steps.push_back(S); 258451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor} 258551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 258671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregorvoid InitializationSequence::AddZeroInitializationStep(QualType T) { 258771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Step S; 258871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Kind = SK_ZeroInitialization; 258971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor S.Type = T; 259071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Steps.push_back(S); 259171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 259271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 259318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorvoid InitializationSequence::AddCAssignmentStep(QualType T) { 259418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step S; 259518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Kind = SK_CAssignment; 259618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Type = T; 259718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Steps.push_back(S); 259818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 259918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 2600cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedmanvoid InitializationSequence::AddStringInitStep(QualType T) { 2601cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Step S; 2602cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Kind = SK_StringInit; 2603cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman S.Type = T; 2604cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman Steps.push_back(S); 2605cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman} 2606cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 2607569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorvoid InitializationSequence::AddObjCObjectConversionStep(QualType T) { 2608569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Step S; 2609569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Kind = SK_ObjCObjectConversion; 2610569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Type = T; 2611569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Steps.push_back(S); 2612569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 2613569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 2614cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregorvoid InitializationSequence::AddArrayInitStep(QualType T) { 2615cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Step S; 2616cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Kind = SK_ArrayInit; 2617cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Type = T; 2618cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Steps.push_back(S); 2619cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor} 2620cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 2621f85e193739c953358c865005855253af4f68a497John McCallvoid InitializationSequence::AddPassByIndirectCopyRestoreStep(QualType type, 2622f85e193739c953358c865005855253af4f68a497John McCall bool shouldCopy) { 2623f85e193739c953358c865005855253af4f68a497John McCall Step s; 2624f85e193739c953358c865005855253af4f68a497John McCall s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore 2625f85e193739c953358c865005855253af4f68a497John McCall : SK_PassByIndirectRestore); 2626f85e193739c953358c865005855253af4f68a497John McCall s.Type = type; 2627f85e193739c953358c865005855253af4f68a497John McCall Steps.push_back(s); 2628f85e193739c953358c865005855253af4f68a497John McCall} 2629f85e193739c953358c865005855253af4f68a497John McCall 2630f85e193739c953358c865005855253af4f68a497John McCallvoid InitializationSequence::AddProduceObjCObjectStep(QualType T) { 2631f85e193739c953358c865005855253af4f68a497John McCall Step S; 2632f85e193739c953358c865005855253af4f68a497John McCall S.Kind = SK_ProduceObjCObject; 2633f85e193739c953358c865005855253af4f68a497John McCall S.Type = T; 2634f85e193739c953358c865005855253af4f68a497John McCall Steps.push_back(S); 2635f85e193739c953358c865005855253af4f68a497John McCall} 2636f85e193739c953358c865005855253af4f68a497John McCall 26372b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redlvoid InitializationSequence::AddStdInitializerListConstructionStep(QualType T) { 26382b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Step S; 26392b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Kind = SK_StdInitializerList; 26402b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Type = T; 26412b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Steps.push_back(S); 26422b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl} 26432b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 264413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlvoid InitializationSequence::RewrapReferenceInitList(QualType T, 264513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *Syntactic) { 264613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl assert(Syntactic->getNumInits() == 1 && 264713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl "Can only rewrap trivial init lists."); 264813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Step S; 264913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Kind = SK_UnwrapInitList; 265013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Type = Syntactic->getInit(0)->getType(); 265113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Steps.insert(Steps.begin(), S); 265213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 265313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Kind = SK_RewrapInitList; 265413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Type = T; 265513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.WrappingSyntacticList = Syntactic; 265613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Steps.push_back(S); 265713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 265813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 2659dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumivoid InitializationSequence::SetOverloadFailure(FailureKind Failure, 266020093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult Result) { 26617491c499e826682e128a400038361ebcbde30eecSebastian Redl setSequenceKind(FailedSequence); 266220093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->Failure = Failure; 266320093b4bf698f292c664676987541d5103b65b15Douglas Gregor this->FailedOverloadResult = Result; 266420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 266520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 266620093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 266720093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Attempt initialization 266820093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 266920093b4bf698f292c664676987541d5103b65b15Douglas Gregor 2670f85e193739c953358c865005855253af4f68a497John McCallstatic void MaybeProduceObjCObject(Sema &S, 2671f85e193739c953358c865005855253af4f68a497John McCall InitializationSequence &Sequence, 2672f85e193739c953358c865005855253af4f68a497John McCall const InitializedEntity &Entity) { 2673f85e193739c953358c865005855253af4f68a497John McCall if (!S.getLangOptions().ObjCAutoRefCount) return; 2674f85e193739c953358c865005855253af4f68a497John McCall 2675f85e193739c953358c865005855253af4f68a497John McCall /// When initializing a parameter, produce the value if it's marked 2676f85e193739c953358c865005855253af4f68a497John McCall /// __attribute__((ns_consumed)). 2677f85e193739c953358c865005855253af4f68a497John McCall if (Entity.getKind() == InitializedEntity::EK_Parameter) { 2678f85e193739c953358c865005855253af4f68a497John McCall if (!Entity.isParameterConsumed()) 2679f85e193739c953358c865005855253af4f68a497John McCall return; 2680f85e193739c953358c865005855253af4f68a497John McCall 2681f85e193739c953358c865005855253af4f68a497John McCall assert(Entity.getType()->isObjCRetainableType() && 2682f85e193739c953358c865005855253af4f68a497John McCall "consuming an object of unretainable type?"); 2683f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddProduceObjCObjectStep(Entity.getType()); 2684f85e193739c953358c865005855253af4f68a497John McCall 2685f85e193739c953358c865005855253af4f68a497John McCall /// When initializing a return value, if the return type is a 2686f85e193739c953358c865005855253af4f68a497John McCall /// retainable type, then returns need to immediately retain the 2687f85e193739c953358c865005855253af4f68a497John McCall /// object. If an autorelease is required, it will be done at the 2688f85e193739c953358c865005855253af4f68a497John McCall /// last instant. 2689f85e193739c953358c865005855253af4f68a497John McCall } else if (Entity.getKind() == InitializedEntity::EK_Result) { 2690f85e193739c953358c865005855253af4f68a497John McCall if (!Entity.getType()->isObjCRetainableType()) 2691f85e193739c953358c865005855253af4f68a497John McCall return; 2692f85e193739c953358c865005855253af4f68a497John McCall 2693f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddProduceObjCObjectStep(Entity.getType()); 2694f85e193739c953358c865005855253af4f68a497John McCall } 2695f85e193739c953358c865005855253af4f68a497John McCall} 2696f85e193739c953358c865005855253af4f68a497John McCall 269710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// \brief When initializing from init list via constructor, deal with the 269810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// empty init list and std::initializer_list special cases. 269910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// 270010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// \return True if this was a special case, false otherwise. 270110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlstatic bool TryListConstructionSpecialCases(Sema &S, 270208ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl InitListExpr *List, 270310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXRecordDecl *DestRecordDecl, 270410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl QualType DestType, 270510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl InitializationSequence &Sequence) { 27062b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // C++11 [dcl.init.list]p3: 27071d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // List-initialization of an object or reference of type T is defined as 27081d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // follows: 27091d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // - If T is an aggregate, aggregate initialization is performed. 27101d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith if (DestType->isAggregateType()) 27111d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith return false; 27121d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith 27131d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // - Otherwise, if the initializer list has no elements and T is a class 27141d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // type with a default constructor, the object is value-initialized. 271508ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl if (List->getNumInits() == 0) { 271610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (CXXConstructorDecl *DefaultConstructor = 271710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.LookupDefaultConstructor(DestRecordDecl)) { 271810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (DefaultConstructor->isDeleted() || 271910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.isFunctionConsideredUnavailable(DefaultConstructor)) { 272010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Fake an overload resolution failure. 272110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 272210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl DeclAccessPair FoundDecl = DeclAccessPair::make(DefaultConstructor, 272310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl DefaultConstructor->getAccess()); 272410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (FunctionTemplateDecl *ConstructorTmpl = 272510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl dyn_cast<FunctionTemplateDecl>(DefaultConstructor)) 272610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 272710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl /*ExplicitArgs*/ 0, 272808ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl 0, 0, CandidateSet, 272910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl /*SuppressUserConversions*/ false); 273010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl else 273110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.AddOverloadCandidate(DefaultConstructor, FoundDecl, 273208ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl 0, 0, CandidateSet, 273310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl /*SuppressUserConversions*/ false); 273410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Sequence.SetOverloadFailure( 2735cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl InitializationSequence::FK_ListConstructorOverloadFailed, 2736cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl OR_Deleted); 273710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } else 273810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Sequence.AddConstructorInitializationStep(DefaultConstructor, 273910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl DefaultConstructor->getAccess(), 274010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl DestType, 274110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl /*MultipleCandidates=*/false, 27426cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl /*FromInitList=*/true, 27436cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl /*AsInitList=*/false); 274410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return true; 274510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 274610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 274710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 274810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // - Otherwise, if T is a specialization of std::initializer_list, [...] 27492b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl QualType E; 27502b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl if (S.isStdInitializerList(DestType, &E)) { 27512b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // Check that each individual element can be copy-constructed. But since we 27522b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // have no place to store further information, we'll recalculate everything 27532b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // later. 27542b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializedEntity HiddenArray = InitializedEntity::InitializeTemporary( 27552b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Context.getConstantArrayType(E, 275608ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()), 275708ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl List->getNumInits()), 27582b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ArrayType::Normal, 0)); 27592b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializedEntity Element = InitializedEntity::InitializeElement(S.Context, 27602b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 0, HiddenArray); 276108ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl for (unsigned i = 0, n = List->getNumInits(); i < n; ++i) { 27622b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Element.setElementIndex(i); 276308ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl if (!S.CanPerformCopyInitialization(Element, List->getInit(i))) { 27642b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Sequence.SetFailed( 27652b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializationSequence::FK_InitListElementCopyFailure); 27662b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl return true; 27672b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 27682b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 27692b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Sequence.AddStdInitializerListConstructionStep(DestType); 27702b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl return true; 27712b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 277210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 277310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Not a special case. 277410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return false; 277510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl} 277610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 277796715b288060c8e168cbca62f366c12e88c5483dSebastian Redlstatic OverloadingResult 277896715b288060c8e168cbca62f366c12e88c5483dSebastian RedlResolveConstructorOverload(Sema &S, SourceLocation DeclLoc, 277996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl Expr **Args, unsigned NumArgs, 278096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl OverloadCandidateSet &CandidateSet, 278196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl DeclContext::lookup_iterator Con, 278296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl DeclContext::lookup_iterator ConEnd, 278396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl OverloadCandidateSet::iterator &Best, 278496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl bool CopyInitializing, bool AllowExplicit, 278596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl bool OnlyListConstructors) { 278696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl CandidateSet.clear(); 278796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 278896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl for (; Con != ConEnd; ++Con) { 278996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl NamedDecl *D = *Con; 279096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 279196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl bool SuppressUserConversions = false; 279296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 279396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Find the constructor (which may be a template). 279496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl CXXConstructorDecl *Constructor = 0; 279596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 279696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl if (ConstructorTmpl) 279796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl Constructor = cast<CXXConstructorDecl>( 279896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl ConstructorTmpl->getTemplatedDecl()); 279996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl else { 280096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl Constructor = cast<CXXConstructorDecl>(D); 280196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 280296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // If we're performing copy initialization using a copy constructor, we 280396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // suppress user-defined conversions on the arguments. 280496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // FIXME: Move constructors? 280596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl if (CopyInitializing && Constructor->isCopyConstructor()) 280696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl SuppressUserConversions = true; 280796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl } 280896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 280996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl if (!Constructor->isInvalidDecl() && 281096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl (AllowExplicit || !Constructor->isExplicit()) && 28116cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl (!OnlyListConstructors || S.isInitListConstructor(Constructor))) { 281296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl if (ConstructorTmpl) 281396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 281496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl /*ExplicitArgs*/ 0, 281596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl Args, NumArgs, CandidateSet, 281696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl SuppressUserConversions); 281796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl else 281896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl S.AddOverloadCandidate(Constructor, FoundDecl, 281996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl Args, NumArgs, CandidateSet, 282096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl SuppressUserConversions); 282196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl } 282296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl } 282396715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 282496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Perform overload resolution and return the result. 282596715b288060c8e168cbca62f366c12e88c5483dSebastian Redl return CandidateSet.BestViableFunction(S, DeclLoc, Best); 282696715b288060c8e168cbca62f366c12e88c5483dSebastian Redl} 282796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 282810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// \brief Attempt initialization by constructor (C++ [dcl.init]), which 282910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// enumerates the constructors of the initialized entity and performs overload 283010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// resolution to select the best. 283108ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl/// If InitListSyntax is true, this is list-initialization of a non-aggregate 283210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl/// class type. 283310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlstatic void TryConstructorInitialization(Sema &S, 283410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializedEntity &Entity, 283510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializationKind &Kind, 283610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Expr **Args, unsigned NumArgs, 283710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl QualType DestType, 283810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl InitializationSequence &Sequence, 283908ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl bool InitListSyntax = false) { 284008ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl assert((!InitListSyntax || (NumArgs == 1 && isa<InitListExpr>(Args[0]))) && 284108ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl "InitListSyntax must come with a single initializer list argument."); 284208ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl 284310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Check constructor arguments for self reference. 284410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (DeclaratorDecl *DD = Entity.getDecl()) 284510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Parameters arguments are occassionially constructed with itself, 284610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // for instance, in recursive functions. Skip them. 284710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (!isa<ParmVarDecl>(DD)) 284810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl for (unsigned i = 0; i < NumArgs; ++i) 284910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.CheckSelfReference(DD, Args[i]); 285010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 285110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // The type we're constructing needs to be complete. 285210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 285310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Sequence.SetFailed(InitializationSequence::FK_Incomplete); 285496715b288060c8e168cbca62f366c12e88c5483dSebastian Redl return; 285510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 285610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 285710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const RecordType *DestRecordType = DestType->getAs<RecordType>(); 285810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl assert(DestRecordType && "Constructor initialization requires record type"); 285910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXRecordDecl *DestRecordDecl 286010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl = cast<CXXRecordDecl>(DestRecordType->getDecl()); 286110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 286208ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl if (InitListSyntax && 286308ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl TryListConstructionSpecialCases(S, cast<InitListExpr>(Args[0]), 286408ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl DestRecordDecl, DestType, Sequence)) 286510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return; 286610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 286796715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Build the candidate set directly in the initialization sequence 286896715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // structure, so that it will persist if we fail. 286996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 287096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl 287196715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // Determine whether we are allowed to call explicit constructors or 287296715b288060c8e168cbca62f366c12e88c5483dSebastian Redl // explicit conversion operators. 2873168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool AllowExplicit = Kind.AllowExplicit(); 28746cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl bool CopyInitialization = Kind.getKind() == InitializationKind::IK_Copy; 287508ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl 287610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // - Otherwise, if T is a class type, constructors are considered. The 287710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // applicable constructors are enumerated, and the best one is chosen 287810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // through overload resolution. 287996715b288060c8e168cbca62f366c12e88c5483dSebastian Redl DeclContext::lookup_iterator ConStart, ConEnd; 288096715b288060c8e168cbca62f366c12e88c5483dSebastian Redl llvm::tie(ConStart, ConEnd) = S.LookupConstructors(DestRecordDecl); 288110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 28826cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl OverloadingResult Result = OR_No_Viable_Function; 288310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl OverloadCandidateSet::iterator Best; 28846cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl bool AsInitializerList = false; 28856cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl 28866cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // C++11 [over.match.list]p1: 28876cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // When objects of non-aggregate type T are list-initialized, overload 28886cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // resolution selects the constructor in two phases: 28896cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // - Initially, the candidate functions are the initializer-list 28906cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // constructors of the class T and the argument list consists of the 28916cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // initializer list as a single argument. 28926cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl if (InitListSyntax) { 28936cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl AsInitializerList = true; 28946cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl Result = ResolveConstructorOverload(S, Kind.getLocation(), Args, NumArgs, 28956cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl CandidateSet, ConStart, ConEnd, Best, 28966cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl CopyInitialization, AllowExplicit, 28976cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl /*OnlyListConstructor=*/true); 28986cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl 28996cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // Time to unwrap the init list. 29006cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl InitListExpr *ILE = cast<InitListExpr>(Args[0]); 29016cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl Args = ILE->getInits(); 29026cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl NumArgs = ILE->getNumInits(); 29036cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl } 29046cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl 29056cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // C++11 [over.match.list]p1: 29066cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // - If no viable initializer-list constructor is found, overload resolution 29076cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // is performed again, where the candidate functions are all the 29086cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // constructors of the class T nad the argument list consists of the 29096cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl // elements of the initializer list. 29106cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl if (Result == OR_No_Viable_Function) { 29116cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl AsInitializerList = false; 29126cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl Result = ResolveConstructorOverload(S, Kind.getLocation(), Args, NumArgs, 29136cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl CandidateSet, ConStart, ConEnd, Best, 29146cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl CopyInitialization, AllowExplicit, 29156cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl /*OnlyListConstructors=*/false); 29166cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl } 29176cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl if (Result) { 291808ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl Sequence.SetOverloadFailure(InitListSyntax ? 2919cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl InitializationSequence::FK_ListConstructorOverloadFailed : 2920cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl InitializationSequence::FK_ConstructorOverloadFailed, 292110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Result); 292210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return; 292310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 292410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 292510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // C++0x [dcl.init]p6: 292610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // If a program calls for the default initialization of an object 292710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // of a const-qualified type T, T shall be a class type with a 292810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // user-provided default constructor. 292910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Kind.getKind() == InitializationKind::IK_Default && 293010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Entity.getType().isConstQualified() && 293110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl cast<CXXConstructorDecl>(Best->Function)->isImplicit()) { 293210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 293310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return; 293410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 293510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 293610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Add the constructor initialization step. Any cv-qualification conversion is 293710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // subsumed by the initialization. 293810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl bool HadMultipleCandidates = (CandidateSet.size() > 1); 293910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function); 294010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Sequence.AddConstructorInitializationStep(CtorDecl, 294110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Best->FoundDecl.getAccess(), 294210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl DestType, HadMultipleCandidates, 29436cd03dbb310f472b14b8d6d69d8c9b5b7f1200e2Sebastian Redl InitListSyntax, AsInitializerList); 294410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl} 294510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 294613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic bool 294713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian RedlResolveOverloadedFunctionForReferenceBinding(Sema &S, 294813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 294913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType &SourceType, 295013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType &UnqualifiedSourceType, 295113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType UnqualifiedTargetType, 295213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) { 295313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (S.Context.getCanonicalType(UnqualifiedSourceType) == 295413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Context.OverloadTy) { 295513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl DeclAccessPair Found; 295613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl bool HadMultipleCandidates = false; 295713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (FunctionDecl *Fn 295813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl = S.ResolveAddressOfOverloadedFunction(Initializer, 295913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl UnqualifiedTargetType, 296013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl false, Found, 296113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl &HadMultipleCandidates)) { 296213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.AddAddressOverloadResolutionStep(Fn, Found, 296313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl HadMultipleCandidates); 296413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceType = Fn->getType(); 296513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl UnqualifiedSourceType = SourceType.getUnqualifiedType(); 296613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } else if (!UnqualifiedTargetType->isRecordType()) { 296713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 296813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return true; 296913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 297013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 297113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return false; 297213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 297313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 297413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceInitializationCore(Sema &S, 297513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 297613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 297713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 297813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1, QualType T1, 297913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals, 298013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2, QualType T2, 298113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals, 298213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence); 298313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 298413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryListInitialization(Sema &S, 298513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 298613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 298713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *InitList, 298813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence); 298913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 299013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl/// \brief Attempt list initialization of a reference. 299113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceListInitialization(Sema &S, 299213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 299313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 299413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *InitList, 299513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) 299613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl{ 299713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // First, catch C++03 where this isn't possible. 299813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (!S.getLangOptions().CPlusPlus0x) { 299913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList); 300013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 300113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 300213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 300313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType DestType = Entity.getType(); 300413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 300513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals; 300613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 300713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 300813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Reference initialization via an initializer list works thus: 300913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // If the initializer list consists of a single element that is 301013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // reference-related to the referenced type, bind directly to that element 301113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // (possibly creating temporaries). 301213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Otherwise, initialize a temporary with the initializer list and 301313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // bind to that. 301413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (InitList->getNumInits() == 1) { 301513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer = InitList->getInit(0); 301613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2 = Initializer->getType(); 301713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals; 301813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 301913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 302013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // If this fails, creating a temporary wouldn't work either. 302113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2, 302213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1, Sequence)) 302313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 302413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 302513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceLocation DeclLoc = Initializer->getLocStart(); 302613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl bool dummy1, dummy2, dummy3; 302713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sema::ReferenceCompareResult RefRelationship 302813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, dummy1, 302913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl dummy2, dummy3); 303013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (RefRelationship >= Sema::Ref_Related) { 303113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Try to bind the reference here. 303213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1, 303313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1Quals, cv2T2, T2, T2Quals, Sequence); 303413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (Sequence) 303513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.RewrapReferenceInitList(cv1T1, InitList); 303613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 303713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 303813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 303913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 304013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Not reference-related. Create a temporary and bind to that. 304113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 304213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 304313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryListInitialization(S, TempEntity, Kind, InitList, Sequence); 304413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (Sequence) { 304513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (DestType->isRValueReferenceType() || 304613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl (T1Quals.hasConst() && !T1Quals.hasVolatile())) 304713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 304813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl else 304913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Sequence.SetFailed( 305013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 305113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 305213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 305313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 305412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola/// \brief Attempt list initialization (C++0x [dcl.init.list]) 305512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindolastatic void TryListInitialization(Sema &S, 305612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola const InitializedEntity &Entity, 305712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola const InitializationKind &Kind, 305812ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola InitListExpr *InitList, 305912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola InitializationSequence &Sequence) { 306012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola QualType DestType = Entity.getType(); 306112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 306214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // C++ doesn't allow scalar initialization with more than one argument. 306314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // But C99 complex numbers are scalars and it makes sense there. 306414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (S.getLangOptions().CPlusPlus && DestType->isScalarType() && 306514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl !DestType->isAnyComplexType() && InitList->getNumInits() > 1) { 306614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar); 306714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 306814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 306914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (DestType->isReferenceType()) { 307013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceListInitialization(S, Entity, Kind, InitList, Sequence); 307112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola return; 307214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 307314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (DestType->isRecordType() && !DestType->isAggregateType()) { 307408ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl if (S.getLangOptions().CPlusPlus0x) { 307508ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl Expr *Arg = InitList; 3076168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // A direct-initializer is not list-syntax, i.e. there's no special 3077168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // treatment of "A a({1, 2});". 307808ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl TryConstructorInitialization(S, Entity, Kind, &Arg, 1, DestType, 3079168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Sequence, Kind.getKind() != InitializationKind::IK_Direct); 308008ae369fbe870cfb5077fbd1c652836b8dbeab8bSebastian Redl } else 308110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType); 308214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 308314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 308414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl 308514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListChecker CheckInitList(S, Entity, InitList, 3086c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl DestType, /*VerifyOnly=*/true, 3087168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Kind.getKind() != InitializationKind::IK_DirectList || 3088c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl !S.getLangOptions().CPlusPlus0x); 308914b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (CheckInitList.HadError()) { 309014b0c194b356a1204d081765b3e6699687bed97cSebastian Redl Sequence.SetFailed(InitializationSequence::FK_ListInitializationFailed); 309114b0c194b356a1204d081765b3e6699687bed97cSebastian Redl return; 309212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola } 309312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 309414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Add the list initialization step with the built init list. 309512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Sequence.AddListInitializationStep(DestType); 309612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola} 309720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 309820093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Try a reference initialization that involves calling a conversion 309920093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// function. 310020093b4bf698f292c664676987541d5103b65b15Douglas Gregorstatic OverloadingResult TryRefInitWithConversionFunction(Sema &S, 310120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 310220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 310320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 310420093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool AllowRValues, 310520093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3106d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 310720093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 310820093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T1 = cv1T1.getUnqualifiedType(); 310920093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 311020093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType T2 = cv2T2.getUnqualifiedType(); 311120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 311220093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase; 3113569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion; 3114f85e193739c953358c865005855253af4f68a497John McCall bool ObjCLifetimeConversion; 3115dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi assert(!S.CompareReferenceRelationship(Initializer->getLocStart(), 3116569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T1, T2, DerivedToBase, 3117f85e193739c953358c865005855253af4f68a497John McCall ObjCConversion, 3118f85e193739c953358c865005855253af4f68a497John McCall ObjCLifetimeConversion) && 311920093b4bf698f292c664676987541d5103b65b15Douglas Gregor "Must have incompatible references when binding via conversion"); 312060cfcecaf48e4310339dcfbdb0e3f0e6d2853855Chandler Carruth (void)DerivedToBase; 3121569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor (void)ObjCConversion; 3122f85e193739c953358c865005855253af4f68a497John McCall (void)ObjCLifetimeConversion; 3123f85e193739c953358c865005855253af4f68a497John McCall 312420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the candidate set directly in the initialization sequence 312520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // structure, so that it will persist if we fail. 312620093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 312720093b4bf698f292c664676987541d5103b65b15Douglas Gregor CandidateSet.clear(); 312820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 312920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 313020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 3131168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool AllowExplicit = Kind.AllowExplicit(); 3132dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 313320093b4bf698f292c664676987541d5103b65b15Douglas Gregor const RecordType *T1RecordType = 0; 31346b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) && 31356b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T1, 0)) { 313620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting to is a class type. Enumerate its constructors 313720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to see if there is a suitable conversion. 313820093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl()); 3139572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall 314020093b4bf698f292c664676987541d5103b65b15Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 3141e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(T1RecordDecl); 314220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Con != ConEnd; ++Con) { 31439aa472c45d2bd81b7b52c225e8acc560d716db97John McCall NamedDecl *D = *Con; 31449aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 31459aa472c45d2bd81b7b52c225e8acc560d716db97John McCall 314620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Find the constructor (which may be a template). 314720093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConstructorDecl *Constructor = 0; 31489aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionTemplateDecl *ConstructorTmpl = dyn_cast<FunctionTemplateDecl>(D); 314920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 315020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor = cast<CXXConstructorDecl>( 315120093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 315220093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 31539aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Constructor = cast<CXXConstructorDecl>(D); 3154dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 315520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!Constructor->isInvalidDecl() && 315620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 315720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConstructorTmpl) 31589aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 315986820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall /*ExplicitArgs*/ 0, 3160b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis &Initializer, 1, CandidateSet, 3161b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 316220093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 31639aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddOverloadCandidate(Constructor, FoundDecl, 3164b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis &Initializer, 1, CandidateSet, 3165b72db8977ed032d6425045d7e9d36e49d9b2d3f8Argyrios Kyrtzidis /*SuppressUserConversions=*/true); 316620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3167dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 316820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3169572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl()) 3170572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 3171dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 31726b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor const RecordType *T2RecordType = 0; 31736b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor if ((T2RecordType = T2->getAs<RecordType>()) && 31746b6d01fbc297d703f7ad1e605aa97afc6289a64fDouglas Gregor !S.RequireCompleteType(Kind.getLocation(), T2, 0)) { 317520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // The type we're converting from is a class type, enumerate its conversion 317620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // functions. 317720093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl()); 317820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3179eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 318020093b4bf698f292c664676987541d5103b65b15Douglas Gregor = T2RecordDecl->getVisibleConversionFunctions(); 3181eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 3182eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall E = Conversions->end(); I != E; ++I) { 318320093b4bf698f292c664676987541d5103b65b15Douglas Gregor NamedDecl *D = *I; 318420093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 318520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<UsingShadowDecl>(D)) 318620093b4bf698f292c664676987541d5103b65b15Douglas Gregor D = cast<UsingShadowDecl>(D)->getTargetDecl(); 3187dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 318820093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 318920093b4bf698f292c664676987541d5103b65b15Douglas Gregor CXXConversionDecl *Conv; 319020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 319120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 319220093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 31934680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Conv = cast<CXXConversionDecl>(D); 3194dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 319520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the conversion function doesn't return a reference type, 319620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // it can't be considered for this conversion unless we're allowed to 319720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // consider rvalues. 3198dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Do we need to make sure that we only consider conversion 3199dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // candidates with reference-compatible results? That might be needed to 320020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // break recursion. 320120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if ((AllowExplicit || !Conv->isExplicit()) && 320220093b4bf698f292c664676987541d5103b65b15Douglas Gregor (AllowRValues || Conv->getConversionType()->isLValueReferenceType())){ 320320093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvTemplate) 32049aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 320586820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, 3206564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor DestType, CandidateSet); 320720093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 32089aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 3209564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor Initializer, DestType, CandidateSet); 321020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 321120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 321220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3213572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl()) 3214572fc62b52b5b113cbaf528bd3ec00fcde19a46eJohn McCall return OR_No_Viable_Function; 3215dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 321620093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceLocation DeclLoc = Initializer->getLocStart(); 321720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3218dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 321920093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 3220dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (OverloadingResult Result 32218fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) 322220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return Result; 322303981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 322420093b4bf698f292c664676987541d5103b65b15Douglas Gregor FunctionDecl *Function = Best->Function; 322503981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 322625ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth // This is the overload that will actually be used for the initialization, so 322725ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth // mark it as used. 32285f2987c11491edb186401d4e8eced275f0ea7c5eEli Friedman S.MarkFunctionReferenced(DeclLoc, Function); 322925ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth 323003981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Compute the returned type of the conversion. 323120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (isa<CXXConversionDecl>(Function)) 323220093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = Function->getResultType(); 323320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 323420093b4bf698f292c664676987541d5103b65b15Douglas Gregor T2 = cv1T1; 323503981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 323603981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // Add the user-defined conversion step. 323722c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 32389aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Sequence.AddUserConversionStep(Function, Best->FoundDecl, 323922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara T2.getNonLValueExprType(S.Context), 324022c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 324103981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman 3242dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Determine whether we need to perform derived-to-base or 324303981014e4f0c3b4e935872dda96a28c2f1874eaEli Friedman // cv-qualification adjustments. 32445baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = VK_RValue; 3245906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl if (T2->isLValueReferenceType()) 32465baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = VK_LValue; 3247906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl else if (const RValueReferenceType *RRef = T2->getAs<RValueReferenceType>()) 32485baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue; 3249906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 325020093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool NewDerivedToBase = false; 3251569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool NewObjCConversion = false; 3252f85e193739c953358c865005855253af4f68a497John McCall bool NewObjCLifetimeConversion = false; 325320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult NewRefRelationship 3254dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi = S.CompareReferenceRelationship(DeclLoc, T1, 32556398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor T2.getNonLValueExprType(S.Context), 3256f85e193739c953358c865005855253af4f68a497John McCall NewDerivedToBase, NewObjCConversion, 3257f85e193739c953358c865005855253af4f68a497John McCall NewObjCLifetimeConversion); 3258a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor if (NewRefRelationship == Sema::Ref_Incompatible) { 3259a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // If the type we've converted to is not reference-related to the 3260a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // type we're looking for, then there is another conversion step 3261a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // we need to perform to produce a temporary of the right type 3262a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor // that we'll be binding to. 3263a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ImplicitConversionSequence ICS; 3264a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.setStandard(); 3265a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor ICS.Standard = Best->FinalConversion; 3266a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor T2 = ICS.Standard.getToType(2); 3267a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor Sequence.AddConversionSequenceStep(ICS, T2); 3268a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor } else if (NewDerivedToBase) 326920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 327020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Context.getQualifiedType(T1, 3271dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi T2.getNonReferenceType().getQualifiers()), 32725baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK); 3273569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (NewObjCConversion) 3274569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 3275569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, 3276569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor T2.getNonReferenceType().getQualifiers())); 3277569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 327820093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (cv1T1.getQualifiers() != T2.getNonReferenceType().getQualifiers()) 32795baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK); 3280dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 328120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, !T2->isReferenceType()); 328220093b4bf698f292c664676987541d5103b65b15Douglas Gregor return OR_Success; 328320093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 3284dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 328583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void CheckCXX98CompatAccessibleCopy(Sema &S, 328683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const InitializedEntity &Entity, 328783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr); 328883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 3289dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// \brief Attempt reference initialization (C++0x [dcl.init.ref]) 3290dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryReferenceInitialization(Sema &S, 329120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 329220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 329320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 329420093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3295d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 329620093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType(); 32975535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T1Quals; 32985535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals); 329920093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType cv2T2 = Initializer->getType(); 33005535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth Qualifiers T2Quals; 33015535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals); 33024680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 330320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // If the initializer is the address of an overloaded function, try 330420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to resolve the overloaded function. If all goes well, T2 is the 330520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type of the resulting function. 330613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2, 330713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1, Sequence)) 330813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl return; 330913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 331013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Delegate everything else to a subfunction. 331113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1, 331213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl T1Quals, cv2T2, T2, T2Quals, Sequence); 331313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 33144680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 331513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl/// \brief Reference initialization without resolving overloaded functions. 331613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlstatic void TryReferenceInitializationCore(Sema &S, 331713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializedEntity &Entity, 331813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const InitializationKind &Kind, 331913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *Initializer, 332013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv1T1, QualType T1, 332113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T1Quals, 332213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType cv2T2, QualType T2, 332313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Qualifiers T2Quals, 332413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializationSequence &Sequence) { 332513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType DestType = Entity.getType(); 332613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl SourceLocation DeclLoc = Initializer->getLocStart(); 332720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Compute some basic properties of the types and the initializer. 332820093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isLValueRef = DestType->isLValueReferenceType(); 332920093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool isRValueRef = !isLValueRef; 333020093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool DerivedToBase = false; 3331569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor bool ObjCConversion = false; 3332f85e193739c953358c865005855253af4f68a497John McCall bool ObjCLifetimeConversion = false; 33334680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Expr::Classification InitCategory = Initializer->Classify(S.Context); 333420093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sema::ReferenceCompareResult RefRelationship 3335569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase, 3336f85e193739c953358c865005855253af4f68a497John McCall ObjCConversion, ObjCLifetimeConversion); 33374680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 333820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p5: 3339dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // A reference to type "cv1 T1" is initialized by an expression of type 334020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // "cv2 T2" as follows: 334120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 3342dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the reference is an lvalue reference and the initializer 334320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // expression 33444680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // Note the analogous bullet points for rvlaue refs to functions. Because 33454680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // there are no function rvalues in C++, rvalue refs to functions are treated 33464680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // like lvalue refs. 334720093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadingResult ConvOvlResult = OR_Success; 33484680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl bool T1Function = T1->isFunctionType(); 33494680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (isLValueRef || T1Function) { 3350dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (InitCategory.isLValue() && 335114d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 3352dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 335314d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related))) { 3354dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - is an lvalue (but is not a bit-field), and "cv1 T1" is 335520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // reference-compatible with "cv2 T2," or 335620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 3357dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Per C++ [over.best.ics]p2, we don't diagnose whether the lvalue is a 335820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // bit-field when we're determining whether the reference initialization 3359de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // can occur. However, we do pay attention to whether it is a bit-field 3360de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // to decide whether we're actually binding to a temporary created from 3361de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor // the bit-field. 336220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DerivedToBase) 336320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddDerivedToBaseCastStep( 3364dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Context.getQualifiedType(T1, T2Quals), 33655baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue); 3366569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor else if (ObjCConversion) 3367569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor Sequence.AddObjCObjectConversionStep( 3368569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 3369569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 33705535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth if (T1Quals != T2Quals) 33715baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall Sequence.AddQualificationConversionStep(cv1T1, VK_LValue); 3372de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor bool BindingTemporary = T1Quals.hasConst() && !T1Quals.hasVolatile() && 3373093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson (Initializer->getBitField() || Initializer->refersToVectorElement()); 3374de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, BindingTemporary); 337520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 337620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3377dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3378dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 3379dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 3380dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible 3381dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // with "cv3 T3" (this conversion is selected by enumerating the 338220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // applicable conversion functions (13.3.1.6) and choosing the best 338320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // one through overload resolution (13.3)), 33844680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // If we have an rvalue ref to function type here, the rhs must be 33854680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl // an rvalue. 33864680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() && 33874680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl (isLValueRef || InitCategory.isRValue())) { 3388dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, Kind, 338920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer, 33904680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl /*AllowRValues=*/isRValueRef, 339120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 339220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult == OR_Success) 339320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 33941d31833450e6d2947a33cb0840d87661d92eec07John McCall if (ConvOvlResult != OR_No_Viable_Function) { 33951d31833450e6d2947a33cb0840d87661d92eec07John McCall Sequence.SetOverloadFailure( 33961d31833450e6d2947a33cb0840d87661d92eec07John McCall InitializationSequence::FK_ReferenceInitOverloadFailed, 33971d31833450e6d2947a33cb0840d87661d92eec07John McCall ConvOvlResult); 33981d31833450e6d2947a33cb0840d87661d92eec07John McCall } 339920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 340020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 34014680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 3402dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, the reference shall be an lvalue reference to a 340320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // non-volatile const type (i.e., cv1 shall be const), or the reference 340469d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor // shall be an rvalue reference. 3405b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile())) { 34063afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 34073afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 34083afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 340920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 341020093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 341120093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 3412b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor else 34134680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl Sequence.SetFailed(InitCategory.isLValue() 341420093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? (RefRelationship == Sema::Ref_Related 341520093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? InitializationSequence::FK_ReferenceInitDropsQualifiers 341620093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToUnrelated) 341720093b4bf698f292c664676987541d5103b65b15Douglas Gregor : InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); 34184680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 341920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 342020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 34214680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl 3422c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - If the initializer expression 3423c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // - is an xvalue, class prvalue, array prvalue, or function lvalue and 3424c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // "cv1 T1" is reference-compatible with "cv2 T2" 3425c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // Note: functions are handled below. 3426c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (!T1Function && 342714d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || 3428dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi (Kind.isCStyleOrFunctionalCast() && 342914d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor RefRelationship == Sema::Ref_Related)) && 3430c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isXValue() || 3431c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isRecordType()) || 3432c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor (InitCategory.isPRValue() && T2->isArrayType()))) { 3433c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ExprValueKind ValueKind = InitCategory.isXValue()? VK_XValue : VK_RValue; 3434c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (InitCategory.isPRValue() && T2->isRecordType()) { 3435523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the 3436523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // compiler the freedom to perform a copy here or bind to the 3437523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object, while C++0x requires that we bind directly to the 3438523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // object. Hence, we always bind to the object without making an 3439523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // extra copy. However, in C++03 requires that we check for the 3440523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // presence of a suitable copy constructor: 3441523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // 3442523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // The constructor that would be used to make the copy shall 3443523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // be callable whether or not the copy is actually done. 344462ec1f2fd7368542bb926c04797fb07023547694Francois Pichet if (!S.getLangOptions().CPlusPlus0x && !S.getLangOptions().MicrosoftExt) 3445523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor Sequence.AddExtraneousCopyToTemporary(cv2T2); 344683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith else if (S.getLangOptions().CPlusPlus0x) 344783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CheckCXX98CompatAccessibleCopy(S, Entity, Initializer); 344820093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3449dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3450c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (DerivedToBase) 3451c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddDerivedToBaseCastStep(S.Context.getQualifiedType(T1, T2Quals), 3452c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor ValueKind); 3453c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor else if (ObjCConversion) 3454c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddObjCObjectConversionStep( 3455c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor S.Context.getQualifiedType(T1, T2Quals)); 3456dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3457c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T1Quals != T2Quals) 3458c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor Sequence.AddQualificationConversionStep(cv1T1, ValueKind); 3459dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi Sequence.AddReferenceBindingStep(cv1T1, 346065bfd682010f599a9a04fc7523e95e28c27508baPeter Collingbourne /*bindingTemporary=*/InitCategory.isPRValue()); 3461dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi return; 3462c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor } 3463dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3464dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - has a class type (i.e., T2 is a class type), where T1 is not 3465dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // reference-related to T2, and can be implicitly converted to an 3466c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // xvalue, class prvalue, or function lvalue of type "cv3 T3", 3467c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor // where "cv1 T1" is reference-compatible with "cv3 T3", 3468c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor if (T2->isRecordType()) { 346920093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (RefRelationship == Sema::Ref_Incompatible) { 347020093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult = TryRefInitWithConversionFunction(S, Entity, 347120093b4bf698f292c664676987541d5103b65b15Douglas Gregor Kind, Initializer, 347220093b4bf698f292c664676987541d5103b65b15Douglas Gregor /*AllowRValues=*/true, 347320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence); 347420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (ConvOvlResult) 347520093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetOverloadFailure( 347620093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 347720093b4bf698f292c664676987541d5103b65b15Douglas Gregor ConvOvlResult); 3478dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 347920093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 348020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3481dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 348220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 348320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 348420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 34850099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi 34860099530a2288df7c2140dd8992b7310b9f6930a9NAKAMURA Takumi // - Otherwise, a temporary of type "cv1 T1" is created and initialized 348720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // from the initializer expression using the rules for a non-reference 3488dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy initialization (8.5). The reference is then bound to the 348920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // temporary. [...] 3490369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 349120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine whether we are allowed to call explicit constructors or 349220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // explicit conversion operators. 3493168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool AllowExplicit = Kind.AllowExplicit(); 3494369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 3495369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1); 3496369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall 3497f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS 3498f85e193739c953358c865005855253af4f68a497John McCall = S.TryImplicitConversion(Initializer, TempEntity.getType(), 3499369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*SuppressUserConversions*/ false, 3500369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall AllowExplicit, 350114d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*FIXME:InOverloadResolution=*/false, 3502f85e193739c953358c865005855253af4f68a497John McCall /*CStyle=*/Kind.isCStyleOrFunctionalCast(), 3503f85e193739c953358c865005855253af4f68a497John McCall /*AllowObjCWritebackConversion=*/false); 3504f85e193739c953358c865005855253af4f68a497John McCall 3505f85e193739c953358c865005855253af4f68a497John McCall if (ICS.isBad()) { 350620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // FIXME: Use the conversion function set stored in ICS to turn 350720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // this into an overloading ambiguity diagnostic. However, we need 350820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // to keep that set as an OverloadCandidateSet rather than as some 350920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // other kind of set. 351018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) 351118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetOverloadFailure( 351218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence::FK_ReferenceInitOverloadFailed, 351318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor ConvOvlResult); 35143afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) 35153afb97700200f629d6036e437267af9c1fd37c90Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 351618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 351718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed); 351820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 3519f85e193739c953358c865005855253af4f68a497John McCall } else { 3520f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddConversionSequenceStep(ICS, TempEntity.getType()); 352120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 352220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 352320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // [...] If T1 is reference-related to T2, cv1 must be the 352420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // same cv-qualification as, or greater cv-qualification 352520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // than, cv2; otherwise, the program is ill-formed. 35265535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T1CVRQuals = T1Quals.getCVRQualifiers(); 35275535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth unsigned T2CVRQuals = T2Quals.getCVRQualifiers(); 3528dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship == Sema::Ref_Related && 35295535c38a2fcface6c13bc8bbeca66882de2fa227Chandler Carruth (T1CVRQuals | T2CVRQuals) != T1CVRQuals) { 353020093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers); 353120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 353220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 353320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3534dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // [...] If T1 is reference-related to T2 and the reference is an rvalue 3535b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor // reference, the initializer expression shall not be an lvalue. 3536dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (RefRelationship >= Sema::Ref_Related && !isLValueRef && 3537b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitCategory.isLValue()) { 3538b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor Sequence.SetFailed( 3539b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor InitializationSequence::FK_RValueReferenceBindingToLValue); 3540b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor return; 3541b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor } 3542dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 354320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); 354420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 354520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 354620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 354720093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt character array initialization from a string literal 3548dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi/// (C++ [dcl.init.string], C99 6.7.8). 3549dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryStringLiteralInitialization(Sema &S, 355020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 355120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 355220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 355320093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3554d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddStringInitStep(Entity.getType()); 355520093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 355620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 355771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor/// \brief Attempt value initialization (C++ [dcl.init]p7). 3558dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryValueInitialization(Sema &S, 355971d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializedEntity &Entity, 356071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor const InitializationKind &Kind, 356171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor InitializationSequence &Sequence) { 35621d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // C++98 [dcl.init]p5, C++11 [dcl.init]p7: 356371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // 356471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // To value-initialize an object of type T means: 3565d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType T = Entity.getType(); 3566dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 356771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is an array type, then each element is value-initialized; 35681d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith T = S.Context.getBaseElementType(T); 3569dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 357071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (const RecordType *RT = T->getAs<RecordType>()) { 357171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 35721d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // C++98: 357371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // -- if T is a class type (clause 9) with a user-declared 357471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // constructor (12.1), then the default constructor for T is 357571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // called (and the initialization is ill-formed if T has no 357671d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor // accessible default constructor); 35771d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith if (!S.getLangOptions().CPlusPlus0x) { 35781d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith if (ClassDecl->hasUserDeclaredConstructor()) 35791d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // FIXME: we really want to refer to a single subobject of the array, 35801d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // but Entity doesn't have a way to capture that (yet). 35811d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith return TryConstructorInitialization(S, Entity, Kind, 0, 0, 35821d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith T, Sequence); 35831d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith } else { 35841d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // C++11: 35851d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // -- if T is a class type (clause 9) with either no default constructor 35861d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // (12.1 [class.ctor]) or a default constructor that is user-provided 35871d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // or deleted, then the object is default-initialized; 35881d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith CXXConstructorDecl *CD = S.LookupDefaultConstructor(ClassDecl); 35891d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith if (!CD || !CD->getCanonicalDecl()->isDefaulted() || CD->isDeleted()) 35901d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith return TryConstructorInitialization(S, Entity, Kind, 0, 0, 35911d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith T, Sequence); 35921d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith } 3593dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 35941d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // -- if T is a (possibly cv-qualified) non-union class type without a 35951d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // user-provided or deleted default constructor, then the object is 35961d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // zero-initialized and, if T has a non-trivial default constructor, 35971d0c9a8d0573d1f670f484cc17aa94f06be971a5Richard Smith // default-initialized; 3598465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if ((ClassDecl->getTagKind() == TTK_Class || 3599ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor ClassDecl->getTagKind() == TTK_Struct)) { 3600d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 3601dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi return TryConstructorInitialization(S, Entity, Kind, 0, 0, T, Sequence); 360216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 360371d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 360471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 360571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 3606d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Sequence.AddZeroInitializationStep(Entity.getType()); 360771d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor} 360871d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor 360999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor/// \brief Attempt default initialization (C++ [dcl.init]p6). 361099a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregorstatic void TryDefaultInitialization(Sema &S, 361199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializedEntity &Entity, 361299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor const InitializationKind &Kind, 361399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitializationSequence &Sequence) { 361499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(Kind.getKind() == InitializationKind::IK_Default); 3615dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 361699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // C++ [dcl.init]p6: 361799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // To default-initialize an object of type T means: 361899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is an array type, each element is default-initialized; 3619f85e193739c953358c865005855253af4f68a497John McCall QualType DestType = S.Context.getBaseElementType(Entity.getType()); 3620f85e193739c953358c865005855253af4f68a497John McCall 362199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - if T is a (possibly cv-qualified) class type (Clause 9), the default 362299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // constructor for T is called (and the initialization is ill-formed if 362399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // T has no accessible default constructor); 362460c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (DestType->isRecordType() && S.getLangOptions().CPlusPlus) { 36254e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth TryConstructorInitialization(S, Entity, Kind, 0, 0, DestType, Sequence); 36264e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth return; 362799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 3628dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 362999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // - otherwise, no initialization is performed. 3630dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 363199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // If a program calls for the default initialization of an object of 3632dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // a const-qualified type T, T shall be a class type with a user-provided 363399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // default constructor. 3634f85e193739c953358c865005855253af4f68a497John McCall if (DestType.isConstQualified() && S.getLangOptions().CPlusPlus) { 363599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst); 3636f85e193739c953358c865005855253af4f68a497John McCall return; 3637f85e193739c953358c865005855253af4f68a497John McCall } 3638f85e193739c953358c865005855253af4f68a497John McCall 3639f85e193739c953358c865005855253af4f68a497John McCall // If the destination type has a lifetime property, zero-initialize it. 3640f85e193739c953358c865005855253af4f68a497John McCall if (DestType.getQualifiers().hasObjCLifetime()) { 3641f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddZeroInitializationStep(Entity.getType()); 3642f85e193739c953358c865005855253af4f68a497John McCall return; 3643f85e193739c953358c865005855253af4f68a497John McCall } 364499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor} 364599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 364620093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]), 364720093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// which enumerates all conversion functions and performs overload resolution 364820093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// to select the best. 3649dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic void TryUserDefinedConversion(Sema &S, 365020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 365120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 365220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer, 365320093b4bf698f292c664676987541d5103b65b15Douglas Gregor InitializationSequence &Sequence) { 3654d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 36554a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert(!DestType->isReferenceType() && "References are handled elsewhere"); 36564a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor QualType SourceType = Initializer->getType(); 36574a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor assert((DestType->isRecordType() || SourceType->isRecordType()) && 36584a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor "Must have a class type to perform a user-defined conversion"); 3659dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 36604a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Build the candidate set directly in the initialization sequence 36614a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // structure, so that it will persist if we fail. 36624a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet(); 36634a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CandidateSet.clear(); 3664dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 36654a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Determine whether we are allowed to call explicit constructors or 36664a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // explicit conversion operators. 3667168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool AllowExplicit = Kind.AllowExplicit(); 3668dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 36694a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) { 36704a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting to is a class type. Enumerate its constructors 36714a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // to see if there is a suitable conversion. 36724a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor CXXRecordDecl *DestRecordDecl 36734a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor = cast<CXXRecordDecl>(DestRecordType->getDecl()); 3674dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3675087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Try to complete the type we're converting to. 3676dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (!S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { 3677087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclContext::lookup_iterator Con, ConEnd; 3678e5eee5a52d98021de862b7965c88577598d52ccbDouglas Gregor for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl); 3679087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Con != ConEnd; ++Con) { 3680087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor NamedDecl *D = *Con; 3681087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); 3682dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3683087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor // Find the constructor (which may be a template). 3684087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor CXXConstructorDecl *Constructor = 0; 3685087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor FunctionTemplateDecl *ConstructorTmpl 3686087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor = dyn_cast<FunctionTemplateDecl>(D); 36874a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConstructorTmpl) 3688087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>( 3689087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor ConstructorTmpl->getTemplatedDecl()); 36904712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor else 3691087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor = cast<CXXConstructorDecl>(D); 3692dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3693087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (!Constructor->isInvalidDecl() && 3694087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor Constructor->isConvertingConstructor(AllowExplicit)) { 3695087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor if (ConstructorTmpl) 3696087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 3697087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor /*ExplicitArgs*/ 0, 3698087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor &Initializer, 1, CandidateSet, 36994712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 3700087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor else 3701087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor S.AddOverloadCandidate(Constructor, FoundDecl, 3702087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor &Initializer, 1, CandidateSet, 37034712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor /*SuppressUserConversions=*/true); 3704087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 3705dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 3706087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor } 37074a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 3708cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 3709cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman SourceLocation DeclLoc = Initializer->getLocStart(); 3710cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 37114a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) { 37124a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // The type we're converting from is a class type, enumerate its conversion 37134a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // functions. 3714cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 371533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // We can only enumerate the conversion functions for a complete type; if 371633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman // the type isn't complete, simply skip this step. 371733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (!S.RequireCompleteType(DeclLoc, SourceType, 0)) { 371833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *SourceRecordDecl 371933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = cast<CXXRecordDecl>(SourceRecordType->getDecl()); 3720dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3721eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall const UnresolvedSetImpl *Conversions 372233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman = SourceRecordDecl->getVisibleConversionFunctions(); 3723eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetImpl::const_iterator I = Conversions->begin(), 3724dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi E = Conversions->end(); 372533c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman I != E; ++I) { 372633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman NamedDecl *D = *I; 372733c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext()); 372833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (isa<UsingShadowDecl>(D)) 372933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman D = cast<UsingShadowDecl>(D)->getTargetDecl(); 3730dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 373133c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D); 373233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CXXConversionDecl *Conv; 37334a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (ConvTemplate) 373433c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl()); 37354a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor else 373632daa4223ccb2c0afe5fbe151c6eb1ab64816957John McCall Conv = cast<CXXConversionDecl>(D); 3737dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 373833c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (AllowExplicit || !Conv->isExplicit()) { 373933c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman if (ConvTemplate) 37409aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(), 374186820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall ActingDC, Initializer, DestType, 374233c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman CandidateSet); 374333c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman else 37449aa472c45d2bd81b7b52c225e8acc560d716db97John McCall S.AddConversionCandidate(Conv, I.getPair(), ActingDC, 374586820f58e077bfd8fdf7309129b6ff2c5c4eb0e4John McCall Initializer, DestType, CandidateSet); 374633c2da9b3abdade4f0df4f90962fb8c518967fc4Eli Friedman } 37474a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 37484a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 37494a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 3750dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 3751dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Perform overload resolution. If it fails, return the failed result. 37524a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor OverloadCandidateSet::iterator Best; 37531d31833450e6d2947a33cb0840d87661d92eec07John McCall if (OverloadingResult Result 37548fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) { 37554a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.SetOverloadFailure( 3756dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi InitializationSequence::FK_UserConversionOverloadFailed, 37574a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Result); 37584a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 37594a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 37601d31833450e6d2947a33cb0840d87661d92eec07John McCall 37614a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor FunctionDecl *Function = Best->Function; 37625f2987c11491edb186401d4e8eced275f0ea7c5eEli Friedman S.MarkFunctionReferenced(DeclLoc, Function); 376322c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 3764dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37654a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (isa<CXXConstructorDecl>(Function)) { 37664a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step. Any cv-qualification conversion is 3767f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // subsumed by the initialization. Per DR5, the created temporary is of the 3768f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // cv-unqualified type of the destination. 3769f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith Sequence.AddUserConversionStep(Function, Best->FoundDecl, 3770f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith DestType.getUnqualifiedType(), 377122c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 37724a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor return; 37734a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 37744a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 37754a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // Add the user-defined conversion step that calls the conversion function. 37765291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor QualType ConvType = Function->getCallResultType(); 37773fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor if (ConvType->getAs<RecordType>()) { 3778f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // If we're converting to a class type, there may be an copy of 37793fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // the resulting temporary object (possible to create an object of 37803fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // a base class type). That copy is not a separate conversion, so 37813fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // we just make a note of the actual destination type (possibly a 37823fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // base class of the type returned by the conversion function) and 37833fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // let the user-defined conversion step handle the conversion. 378422c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType, 378522c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 37863fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor return; 37873fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor } 37884a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor 378922c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType, 379022c107b2b99887b5aec6d1fd38210031e944e31fAbramo Bagnara HadMultipleCandidates); 3791dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 37923fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // If the conversion following the call to the conversion function 37933fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // is interesting, add it as a separate step. 37944a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor if (Best->FinalConversion.First || Best->FinalConversion.Second || 37954a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Best->FinalConversion.Third) { 37964a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ImplicitConversionSequence ICS; 37971d31833450e6d2947a33cb0840d87661d92eec07John McCall ICS.setStandard(); 37984a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor ICS.Standard = Best->FinalConversion; 37994a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor Sequence.AddConversionSequenceStep(ICS, DestType); 38004a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor } 380120093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 380220093b4bf698f292c664676987541d5103b65b15Douglas Gregor 3803f85e193739c953358c865005855253af4f68a497John McCall/// The non-zero enum values here are indexes into diagnostic alternatives. 3804f85e193739c953358c865005855253af4f68a497John McCallenum InvalidICRKind { IIK_okay, IIK_nonlocal, IIK_nonscalar }; 3805f85e193739c953358c865005855253af4f68a497John McCall 3806f85e193739c953358c865005855253af4f68a497John McCall/// Determines whether this expression is an acceptable ICR source. 3807c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCallstatic InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e, 3808c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall bool isAddressOf) { 3809f85e193739c953358c865005855253af4f68a497John McCall // Skip parens. 3810f85e193739c953358c865005855253af4f68a497John McCall e = e->IgnoreParens(); 3811f85e193739c953358c865005855253af4f68a497John McCall 3812f85e193739c953358c865005855253af4f68a497John McCall // Skip address-of nodes. 3813f85e193739c953358c865005855253af4f68a497John McCall if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) { 3814f85e193739c953358c865005855253af4f68a497John McCall if (op->getOpcode() == UO_AddrOf) 3815c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true); 3816f85e193739c953358c865005855253af4f68a497John McCall 3817f85e193739c953358c865005855253af4f68a497John McCall // Skip certain casts. 3818c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) { 3819c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall switch (ce->getCastKind()) { 3820f85e193739c953358c865005855253af4f68a497John McCall case CK_Dependent: 3821f85e193739c953358c865005855253af4f68a497John McCall case CK_BitCast: 3822f85e193739c953358c865005855253af4f68a497John McCall case CK_LValueBitCast: 3823f85e193739c953358c865005855253af4f68a497John McCall case CK_NoOp: 3824c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf); 3825f85e193739c953358c865005855253af4f68a497John McCall 3826f85e193739c953358c865005855253af4f68a497John McCall case CK_ArrayToPointerDecay: 3827f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonscalar; 3828f85e193739c953358c865005855253af4f68a497John McCall 3829f85e193739c953358c865005855253af4f68a497John McCall case CK_NullToPointer: 3830f85e193739c953358c865005855253af4f68a497John McCall return IIK_okay; 3831f85e193739c953358c865005855253af4f68a497John McCall 3832f85e193739c953358c865005855253af4f68a497John McCall default: 3833f85e193739c953358c865005855253af4f68a497John McCall break; 3834f85e193739c953358c865005855253af4f68a497John McCall } 3835f85e193739c953358c865005855253af4f68a497John McCall 3836f85e193739c953358c865005855253af4f68a497John McCall // If we have a declaration reference, it had better be a local variable. 3837c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else if (isa<DeclRefExpr>(e) || isa<BlockDeclRefExpr>(e)) { 3838c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (!isAddressOf) return IIK_nonlocal; 3839c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall 3840c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall VarDecl *var; 3841c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (isa<DeclRefExpr>(e)) { 3842c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl()); 3843c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (!var) return IIK_nonlocal; 3844c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } else { 3845c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall var = cast<BlockDeclRefExpr>(e)->getDecl(); 3846c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall } 3847c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall 3848c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal); 3849f85e193739c953358c865005855253af4f68a497John McCall 3850f85e193739c953358c865005855253af4f68a497John McCall // If we have a conditional operator, check both sides. 3851f85e193739c953358c865005855253af4f68a497John McCall } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) { 3852c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf)) 3853f85e193739c953358c865005855253af4f68a497John McCall return iik; 3854f85e193739c953358c865005855253af4f68a497John McCall 3855c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall return isInvalidICRSource(C, cond->getRHS(), isAddressOf); 3856f85e193739c953358c865005855253af4f68a497John McCall 3857f85e193739c953358c865005855253af4f68a497John McCall // These are never scalar. 3858f85e193739c953358c865005855253af4f68a497John McCall } else if (isa<ArraySubscriptExpr>(e)) { 3859f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonscalar; 3860f85e193739c953358c865005855253af4f68a497John McCall 3861f85e193739c953358c865005855253af4f68a497John McCall // Otherwise, it needs to be a null pointer constant. 3862f85e193739c953358c865005855253af4f68a497John McCall } else { 3863f85e193739c953358c865005855253af4f68a497John McCall return (e->isNullPointerConstant(C, Expr::NPC_ValueDependentIsNull) 3864f85e193739c953358c865005855253af4f68a497John McCall ? IIK_okay : IIK_nonlocal); 3865f85e193739c953358c865005855253af4f68a497John McCall } 3866f85e193739c953358c865005855253af4f68a497John McCall 3867f85e193739c953358c865005855253af4f68a497John McCall return IIK_nonlocal; 3868f85e193739c953358c865005855253af4f68a497John McCall} 3869f85e193739c953358c865005855253af4f68a497John McCall 3870f85e193739c953358c865005855253af4f68a497John McCall/// Check whether the given expression is a valid operand for an 3871f85e193739c953358c865005855253af4f68a497John McCall/// indirect copy/restore. 3872f85e193739c953358c865005855253af4f68a497John McCallstatic void checkIndirectCopyRestoreSource(Sema &S, Expr *src) { 3873f85e193739c953358c865005855253af4f68a497John McCall assert(src->isRValue()); 3874f85e193739c953358c865005855253af4f68a497John McCall 3875c03fa498b9598fe88ef8fb97315f27d09e56aa50John McCall InvalidICRKind iik = isInvalidICRSource(S.Context, src, false); 3876f85e193739c953358c865005855253af4f68a497John McCall if (iik == IIK_okay) return; 3877f85e193739c953358c865005855253af4f68a497John McCall 3878f85e193739c953358c865005855253af4f68a497John McCall S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback) 3879f85e193739c953358c865005855253af4f68a497John McCall << ((unsigned) iik - 1) // shift index into diagnostic explanations 3880f85e193739c953358c865005855253af4f68a497John McCall << src->getSourceRange(); 3881f85e193739c953358c865005855253af4f68a497John McCall} 3882f85e193739c953358c865005855253af4f68a497John McCall 3883cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor/// \brief Determine whether we have compatible array types for the 3884cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor/// purposes of GNU by-copy array initialization. 3885cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregorstatic bool hasCompatibleArrayTypes(ASTContext &Context, 3886cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *Dest, 3887cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *Source) { 3888cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // If the source and destination array types are equivalent, we're 3889cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // done. 3890cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0))) 3891cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return true; 3892cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3893cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Make sure that the element types are the same. 3894cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!Context.hasSameType(Dest->getElementType(), Source->getElementType())) 3895cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return false; 3896cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3897cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // The only mismatch we allow is when the destination is an 3898cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // incomplete array type and the source is a constant array type. 3899cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor return Source->isConstantArrayType() && Dest->isIncompleteArrayType(); 3900cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor} 3901cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 3902f85e193739c953358c865005855253af4f68a497John McCallstatic bool tryObjCWritebackConversion(Sema &S, 3903f85e193739c953358c865005855253af4f68a497John McCall InitializationSequence &Sequence, 3904f85e193739c953358c865005855253af4f68a497John McCall const InitializedEntity &Entity, 3905f85e193739c953358c865005855253af4f68a497John McCall Expr *Initializer) { 3906f85e193739c953358c865005855253af4f68a497John McCall bool ArrayDecay = false; 3907f85e193739c953358c865005855253af4f68a497John McCall QualType ArgType = Initializer->getType(); 3908f85e193739c953358c865005855253af4f68a497John McCall QualType ArgPointee; 3909f85e193739c953358c865005855253af4f68a497John McCall if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) { 3910f85e193739c953358c865005855253af4f68a497John McCall ArrayDecay = true; 3911f85e193739c953358c865005855253af4f68a497John McCall ArgPointee = ArgArrayType->getElementType(); 3912f85e193739c953358c865005855253af4f68a497John McCall ArgType = S.Context.getPointerType(ArgPointee); 3913f85e193739c953358c865005855253af4f68a497John McCall } 3914f85e193739c953358c865005855253af4f68a497John McCall 3915f85e193739c953358c865005855253af4f68a497John McCall // Handle write-back conversion. 3916f85e193739c953358c865005855253af4f68a497John McCall QualType ConvertedArgType; 3917f85e193739c953358c865005855253af4f68a497John McCall if (!S.isObjCWritebackConversion(ArgType, Entity.getType(), 3918f85e193739c953358c865005855253af4f68a497John McCall ConvertedArgType)) 3919f85e193739c953358c865005855253af4f68a497John McCall return false; 3920f85e193739c953358c865005855253af4f68a497John McCall 3921f85e193739c953358c865005855253af4f68a497John McCall // We should copy unless we're passing to an argument explicitly 3922f85e193739c953358c865005855253af4f68a497John McCall // marked 'out'. 3923f85e193739c953358c865005855253af4f68a497John McCall bool ShouldCopy = true; 3924f85e193739c953358c865005855253af4f68a497John McCall if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl())) 3925f85e193739c953358c865005855253af4f68a497John McCall ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out); 3926f85e193739c953358c865005855253af4f68a497John McCall 3927f85e193739c953358c865005855253af4f68a497John McCall // Do we need an lvalue conversion? 3928f85e193739c953358c865005855253af4f68a497John McCall if (ArrayDecay || Initializer->isGLValue()) { 3929f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS; 3930f85e193739c953358c865005855253af4f68a497John McCall ICS.setStandard(); 3931f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.setAsIdentityConversion(); 3932f85e193739c953358c865005855253af4f68a497John McCall 3933f85e193739c953358c865005855253af4f68a497John McCall QualType ResultType; 3934f85e193739c953358c865005855253af4f68a497John McCall if (ArrayDecay) { 3935f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First = ICK_Array_To_Pointer; 3936f85e193739c953358c865005855253af4f68a497John McCall ResultType = S.Context.getPointerType(ArgPointee); 3937f85e193739c953358c865005855253af4f68a497John McCall } else { 3938f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First = ICK_Lvalue_To_Rvalue; 3939f85e193739c953358c865005855253af4f68a497John McCall ResultType = Initializer->getType().getNonLValueExprType(S.Context); 3940f85e193739c953358c865005855253af4f68a497John McCall } 3941f85e193739c953358c865005855253af4f68a497John McCall 3942f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddConversionSequenceStep(ICS, ResultType); 3943f85e193739c953358c865005855253af4f68a497John McCall } 3944f85e193739c953358c865005855253af4f68a497John McCall 3945f85e193739c953358c865005855253af4f68a497John McCall Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy); 3946f85e193739c953358c865005855253af4f68a497John McCall return true; 3947f85e193739c953358c865005855253af4f68a497John McCall} 3948f85e193739c953358c865005855253af4f68a497John McCall 394920093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::InitializationSequence(Sema &S, 395020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 395120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 395220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, 39535769d6195087229770d7ac90449443e026c47103John McCall unsigned NumArgs) 39545769d6195087229770d7ac90449443e026c47103John McCall : FailedCandidateSet(Kind.getLocation()) { 395512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola ASTContext &Context = S.Context; 3956dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 395720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init]p16: 3958dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // The semantics of initializers are as follows. The destination type is 3959dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // the type of the object or reference being initialized and the source 396020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type is the type of the initializer expression. The source type is not 3961dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // defined when the initializer is a braced-init-list or when it is a 396220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // parenthesized list of expressions. 396312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola QualType DestType = Entity.getType(); 396420093b4bf698f292c664676987541d5103b65b15Douglas Gregor 396512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola if (DestType->isDependentType() || 396620093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr::hasAnyTypeDependentArguments(Args, NumArgs)) { 396720093b4bf698f292c664676987541d5103b65b15Douglas Gregor SequenceKind = DependentSequence; 396820093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 396920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 397020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 39717491c499e826682e128a400038361ebcbde30eecSebastian Redl // Almost everything is a normal sequence. 39727491c499e826682e128a400038361ebcbde30eecSebastian Redl setSequenceKind(NormalSequence); 39737491c499e826682e128a400038361ebcbde30eecSebastian Redl 3974241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall for (unsigned I = 0; I != NumArgs; ++I) 397532509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall if (Args[I]->getType()->isNonOverloadPlaceholderType()) { 39765acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall // FIXME: should we be doing this here? 397732509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall ExprResult result = S.CheckPlaceholderExpr(Args[I]); 397832509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall if (result.isInvalid()) { 397932509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall SetFailed(FK_PlaceholderType); 398032509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall return; 39815acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall } 398232509f1e60451d86e9fbc473b6e853ba10b5fd1eJohn McCall Args[I] = result.take(); 3983429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley } 3984241d5580d2f3969d2cd2a94b4a92c762b5dc1e04John McCall 39855acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 398620093b4bf698f292c664676987541d5103b65b15Douglas Gregor QualType SourceType; 398720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr *Initializer = 0; 398899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs == 1) { 398920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Initializer = Args[0]; 399020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (!isa<InitListExpr>(Initializer)) 399120093b4bf698f292c664676987541d5103b65b15Douglas Gregor SourceType = Initializer->getType(); 399220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 3993dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 39943a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl // - If the initializer is a (non-parenthesized) braced-init-list, the 39953a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl // object is list-initialized (8.5.4). 39963a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl if (Kind.getKind() != InitializationKind::IK_Direct) { 39973a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) { 39983a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl TryListInitialization(S, Entity, Kind, InitList, *this); 39993a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl return; 40003a45c0e61dfc19f27b8ebcb15dd70159a36f1f9aSebastian Redl } 400120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4002dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 400320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a reference type, see 8.5.3. 400420093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isReferenceType()) { 400520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // C++0x [dcl.init.ref]p1: 400620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // A variable declared to be a T& or T&&, that is, "reference to type T" 400720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (8.3.2), shall be initialized by an object, or function, of type T or 400820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // by an object that can be converted into a T. 400920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (Therefore, multiple arguments are not permitted.) 401020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (NumArgs != 1) 401112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_TooManyInitsForReference); 401220093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 401312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryReferenceInitialization(S, Entity, Kind, Args[0], *this); 401420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 401520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4016dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 401720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the initializer is (), the object is value-initialized. 401899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (Kind.getKind() == InitializationKind::IK_Value || 401999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor (Kind.getKind() == InitializationKind::IK_Direct && NumArgs == 0)) { 402012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryValueInitialization(S, Entity, Kind, *this); 402120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 402220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4023dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 402499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // Handle default initialization. 40257663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky if (Kind.getKind() == InitializationKind::IK_Default) { 402612ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryDefaultInitialization(S, Entity, Kind, *this); 402799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 402899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 402918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 4030ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // - If the destination type is an array of characters, an array of 4031ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // char16_t, an array of char32_t, or an array of wchar_t, and the 4032ce6c9b7da219c8640a0559f75770cfc6622de083John McCall // initializer is a string literal, see 8.5.2. 4033dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the destination type is an array, the program is 403420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // ill-formed. 4035cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const ArrayType *DestAT = Context.getAsArrayType(DestType)) { 403673076431605556fdbf28d287d084a73a24a8b8d4John McCall if (Initializer && isa<VariableArrayType>(DestAT)) { 403773076431605556fdbf28d287d084a73a24a8b8d4John McCall SetFailed(FK_VariableLengthArrayHasInitializer); 403873076431605556fdbf28d287d084a73a24a8b8d4John McCall return; 403973076431605556fdbf28d287d084a73a24a8b8d4John McCall } 404073076431605556fdbf28d287d084a73a24a8b8d4John McCall 4041cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (Initializer && IsStringInit(Initializer, DestAT, Context)) { 404212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this); 4043ce6c9b7da219c8640a0559f75770cfc6622de083John McCall return; 4044ce6c9b7da219c8640a0559f75770cfc6622de083John McCall } 4045ce6c9b7da219c8640a0559f75770cfc6622de083John McCall 4046cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Note: as an GNU C extension, we allow initialization of an 4047cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // array from a compound literal that creates an array of the same 4048cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // type, so long as the initializer has no side effects. 4049cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!S.getLangOptions().CPlusPlus && Initializer && 4050cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) && 4051cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor Initializer->getType()->isArrayType()) { 4052cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor const ArrayType *SourceAT 4053cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor = Context.getAsArrayType(Initializer->getType()); 4054cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT)) 405512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayTypeMismatch); 4056cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor else if (Initializer->HasSideEffects(S.Context)) 405712ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_NonConstantArrayInit); 4058cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor else { 405912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddArrayInitStep(DestType); 4060cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 4061cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } else if (DestAT->getElementType()->isAnyCharacterType()) 406212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayNeedsInitListOrStringLiteral); 406320093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 406412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_ArrayNeedsInitList); 4065dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 406620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 406720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4068cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 4069f85e193739c953358c865005855253af4f68a497John McCall // Determine whether we should consider writeback conversions for 4070f85e193739c953358c865005855253af4f68a497John McCall // Objective-C ARC. 4071f85e193739c953358c865005855253af4f68a497John McCall bool allowObjCWritebackConversion = S.getLangOptions().ObjCAutoRefCount && 4072f85e193739c953358c865005855253af4f68a497John McCall Entity.getKind() == InitializedEntity::EK_Parameter; 4073f85e193739c953358c865005855253af4f68a497John McCall 4074f85e193739c953358c865005855253af4f68a497John McCall // We're at the end of the line for C: it's either a write-back conversion 4075f85e193739c953358c865005855253af4f68a497John McCall // or it's a C assignment. There's no need to check anything else. 4076cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman if (!S.getLangOptions().CPlusPlus) { 4077f85e193739c953358c865005855253af4f68a497John McCall // If allowed, check whether this is an Objective-C writeback conversion. 4078f85e193739c953358c865005855253af4f68a497John McCall if (allowObjCWritebackConversion && 407912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola tryObjCWritebackConversion(S, *this, Entity, Initializer)) { 4080f85e193739c953358c865005855253af4f68a497John McCall return; 4081f85e193739c953358c865005855253af4f68a497John McCall } 4082f85e193739c953358c865005855253af4f68a497John McCall 4083f85e193739c953358c865005855253af4f68a497John McCall // Handle initialization in C 408412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddCAssignmentStep(DestType); 408512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 4086cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman return; 4087cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 4088dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4089f85e193739c953358c865005855253af4f68a497John McCall assert(S.getLangOptions().CPlusPlus); 4090f85e193739c953358c865005855253af4f68a497John McCall 409120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - If the destination type is a (possibly cv-qualified) class type: 409220093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (DestType->isRecordType()) { 4093dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - If the initialization is direct-initialization, or if it is 4094dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // copy-initialization where the cv-unqualified version of the 4095dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // source type is the same class as, or a derived class of, the 409620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // class of the destination, constructors are considered. [...] 409720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Direct || 409820093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Kind.getKind() == InitializationKind::IK_Copy && 409920093b4bf698f292c664676987541d5103b65b15Douglas Gregor (Context.hasSameUnqualifiedType(SourceType, DestType) || 410020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.IsDerivedFrom(SourceType, DestType)))) 4101dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TryConstructorInitialization(S, Entity, Kind, Args, NumArgs, 410212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola Entity.getType(), *this); 4103dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise (i.e., for the remaining copy-initialization cases), 410420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // user-defined conversion sequences that can convert from the source 4105dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // type to the destination type or (when a conversion function is 410620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // used) to a derived class thereof are enumerated as described in 410720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // 13.3.1.4, and the best one is chosen through overload resolution 410820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // (13.3). 410920093b4bf698f292c664676987541d5103b65b15Douglas Gregor else 411012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 411120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 411220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4113dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 411499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (NumArgs > 1) { 411512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(FK_TooManyInitsForScalar); 411699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return; 411799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor } 411899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor assert(NumArgs == 1 && "Zero-argument case handled above"); 4119dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4120dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // - Otherwise, if the source type is a (possibly cv-qualified) class 412120093b4bf698f292c664676987541d5103b65b15Douglas Gregor // type, conversion functions are considered. 412299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (!SourceType.isNull() && SourceType->isRecordType()) { 412312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola TryUserDefinedConversion(S, Entity, Kind, Initializer, *this); 412412ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 412520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return; 412620093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4127dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 412820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // - Otherwise, the initial value of the object being initialized is the 41294a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor // (possibly converted) value of the initializer expression. Standard 413020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // conversions (Clause 4) will be used, if necessary, to convert the 4131dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // initializer expression to the cv-unqualified version of the 413220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // destination type; no user-defined conversions are considered. 4133f85e193739c953358c865005855253af4f68a497John McCall 4134f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence ICS 4135f85e193739c953358c865005855253af4f68a497John McCall = S.TryImplicitConversion(Initializer, Entity.getType(), 4136f85e193739c953358c865005855253af4f68a497John McCall /*SuppressUserConversions*/true, 4137369371ce0c2b0d8051a8089e620eb41513fce9a2John McCall /*AllowExplicitConversions*/ false, 413814d0aee957f11b9613fa4312919bec3cc5456a1cDouglas Gregor /*InOverloadResolution*/ false, 4139f85e193739c953358c865005855253af4f68a497John McCall /*CStyle=*/Kind.isCStyleOrFunctionalCast(), 4140f85e193739c953358c865005855253af4f68a497John McCall allowObjCWritebackConversion); 4141f85e193739c953358c865005855253af4f68a497John McCall 4142f85e193739c953358c865005855253af4f68a497John McCall if (ICS.isStandard() && 4143f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.Second == ICK_Writeback_Conversion) { 4144f85e193739c953358c865005855253af4f68a497John McCall // Objective-C ARC writeback conversion. 4145f85e193739c953358c865005855253af4f68a497John McCall 4146f85e193739c953358c865005855253af4f68a497John McCall // We should copy unless we're passing to an argument explicitly 4147f85e193739c953358c865005855253af4f68a497John McCall // marked 'out'. 4148f85e193739c953358c865005855253af4f68a497John McCall bool ShouldCopy = true; 4149f85e193739c953358c865005855253af4f68a497John McCall if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl())) 4150f85e193739c953358c865005855253af4f68a497John McCall ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out); 4151f85e193739c953358c865005855253af4f68a497John McCall 4152f85e193739c953358c865005855253af4f68a497John McCall // If there was an lvalue adjustment, add it as a separate conversion. 4153f85e193739c953358c865005855253af4f68a497John McCall if (ICS.Standard.First == ICK_Array_To_Pointer || 4154f85e193739c953358c865005855253af4f68a497John McCall ICS.Standard.First == ICK_Lvalue_To_Rvalue) { 4155f85e193739c953358c865005855253af4f68a497John McCall ImplicitConversionSequence LvalueICS; 4156f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.setStandard(); 4157f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.setAsIdentityConversion(); 4158f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0)); 4159f85e193739c953358c865005855253af4f68a497John McCall LvalueICS.Standard.First = ICS.Standard.First; 416012ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0)); 4161f85e193739c953358c865005855253af4f68a497John McCall } 416212ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola 416312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy); 4164f85e193739c953358c865005855253af4f68a497John McCall } else if (ICS.isBad()) { 41651be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor DeclAccessPair dap; 41661be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor if (Initializer->getType() == Context.OverloadTy && 41671be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor !S.ResolveAddressOfOverloadedFunction(Initializer 41681be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor , DestType, false, dap)) 416912ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); 41708e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor else 417112ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola SetFailed(InitializationSequence::FK_ConversionFailed); 4172f85e193739c953358c865005855253af4f68a497John McCall } else { 417312ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola AddConversionSequenceStep(ICS, Entity.getType()); 4174856d3798af7c2f7251e4a295f3da7a09ce4c62abJohn McCall 417512ce0a085f89f07c76bf034aa6b838ef50542241Rafael Espindola MaybeProduceObjCObject(S, *this, Entity); 41768e960435696b4ccf6a8ad0ed0530e3280b77af8bDouglas Gregor } 417720093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 417820093b4bf698f292c664676987541d5103b65b15Douglas Gregor 417920093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::~InitializationSequence() { 41805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner for (SmallVectorImpl<Step>::iterator Step = Steps.begin(), 418120093b4bf698f292c664676987541d5103b65b15Douglas Gregor StepEnd = Steps.end(); 418220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) 418320093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step->Destroy(); 418420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 418520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 418620093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 418720093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Perform initialization 418820093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 4189dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumistatic Sema::AssignmentAction 419018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorgetAssignmentAction(const InitializedEntity &Entity) { 419118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch(Entity.getKind()) { 419218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 419318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 4194a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Exception: 4195a3998bd364f8c6b4a520f479083da1d6e30482a1Douglas Gregor case InitializedEntity::EK_Base: 4196059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 419718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 419818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 419918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 4200dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (Entity.getDecl() && 4201688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext())) 4202688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor return Sema::AA_Sending; 4203688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor 420418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Passing; 420518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 420618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Result: 420718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Returning; 420818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 420918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 421018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // FIXME: Can we tell apart casting vs. converting? 421118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Casting; 4212dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 421318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Member: 4214d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_ArrayElement: 4215d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 42160c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4217310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 42184773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 421918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return Sema::AA_Initializing; 422018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 422118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 42227530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid EntityKind!"); 422318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 422418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 42254154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether we should binding a created object as a temporary when 42264154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// initializing the given entity. 42272f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregorstatic bool shouldBindAsTemporary(const InitializedEntity &Entity) { 422818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor switch (Entity.getKind()) { 42291b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_ArrayElement: 42301b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson case InitializedEntity::EK_Member: 42312f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor case InitializedEntity::EK_Result: 423218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_New: 423318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Variable: 423418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Base: 4235059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 4236d3d824d45c32d457493e7cb79cc34a4761afb760Anders Carlsson case InitializedEntity::EK_VectorElement: 42370c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4238a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson case InitializedEntity::EK_Exception: 4239310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 42404773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 424118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return false; 4242dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 424318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Parameter: 424418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case InitializedEntity::EK_Temporary: 424518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return true; 424618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 4247dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 424818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor llvm_unreachable("missed an InitializedEntity kind?"); 424918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 425018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 42514154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// \brief Whether the given entity, when initialized with an object 42524154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor/// created for that initialization, requires destruction. 42534154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregorstatic bool shouldDestroyTemporary(const InitializedEntity &Entity) { 42544154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor switch (Entity.getKind()) { 42554154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Member: 42564154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Result: 42574154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_New: 42584154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Base: 4259059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt case InitializedEntity::EK_Delegating: 42604154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_VectorElement: 42610c706c29f20b6fa36759fa41333b9c3ec0bd2969Eli Friedman case InitializedEntity::EK_ComplexElement: 4262310b1c421665241d9b135c517d5031716d4a3221Fariborz Jahanian case InitializedEntity::EK_BlockElement: 42634773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 42644154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return false; 4265dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 42664154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Variable: 42674154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Parameter: 42684154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Temporary: 42694154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_ArrayElement: 42704154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor case InitializedEntity::EK_Exception: 42714154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor return true; 42724154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 4273dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4274dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi llvm_unreachable("missed an InitializedEntity kind?"); 42754154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor} 42764154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor 427783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Look for copy and move constructors and constructor templates, for 427883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// copying an object via direct-initialization (per C++11 [dcl.init]p16). 427983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void LookupCopyAndMoveConstructors(Sema &S, 428083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet &CandidateSet, 428183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CXXRecordDecl *Class, 428283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr) { 428383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith DeclContext::lookup_iterator Con, ConEnd; 428483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith for (llvm::tie(Con, ConEnd) = S.LookupConstructors(Class); 428583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Con != ConEnd; ++Con) { 428683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CXXConstructorDecl *Constructor = 0; 428783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 428883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if ((Constructor = dyn_cast<CXXConstructorDecl>(*Con))) { 428983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Handle copy/moveconstructors, only. 429083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Constructor || Constructor->isInvalidDecl() || 429183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith !Constructor->isCopyOrMoveConstructor() || 429283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith !Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 429383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 429483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 429583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith DeclAccessPair FoundDecl 429683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith = DeclAccessPair::make(Constructor, Constructor->getAccess()); 429783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.AddOverloadCandidate(Constructor, FoundDecl, 429883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith &CurInitExpr, 1, CandidateSet); 429983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 430083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 430183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 430283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Handle constructor templates. 430383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith FunctionTemplateDecl *ConstructorTmpl = cast<FunctionTemplateDecl>(*Con); 430483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (ConstructorTmpl->isInvalidDecl()) 430583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 430683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 430783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Constructor = cast<CXXConstructorDecl>( 430883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith ConstructorTmpl->getTemplatedDecl()); 430983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Constructor->isConvertingConstructor(/*AllowExplicit=*/true)) 431083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith continue; 431183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 431283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // FIXME: Do we need to limit this to copy-constructor-like 431383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // candidates? 431483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith DeclAccessPair FoundDecl 431583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith = DeclAccessPair::make(ConstructorTmpl, ConstructorTmpl->getAccess()); 431683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 0, 431783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith &CurInitExpr, 1, CandidateSet, true); 431883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 431983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 432083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 432183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Get the location at which initialization diagnostics should appear. 432283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic SourceLocation getInitializationLoc(const InitializedEntity &Entity, 432383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *Initializer) { 432483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith switch (Entity.getKind()) { 432583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Result: 432683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getReturnLoc(); 432783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 432883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Exception: 432983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getThrowLoc(); 433083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 433183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Variable: 433283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Entity.getDecl()->getLocation(); 433383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 43344773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor case InitializedEntity::EK_LambdaCapture: 43354773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor return Entity.getCaptureLoc(); 43364773654f2700d6fbb20612fbb6763b35860fa74dDouglas Gregor 433783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_ArrayElement: 433883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Member: 433983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Parameter: 434083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Temporary: 434183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_New: 434283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Base: 434383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_Delegating: 434483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_VectorElement: 434583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_ComplexElement: 434683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case InitializedEntity::EK_BlockElement: 434783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return Initializer->getLocStart(); 434883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 434983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith llvm_unreachable("missed an InitializedEntity kind?"); 435083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 435183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 4352523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \brief Make a (potentially elidable) temporary copy of the object 4353523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// provided by the given initializer by calling the appropriate copy 4354523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// constructor. 4355523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4356523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param S The Sema object used for type-checking. 4357523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 435863e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara/// \param T The type of the temporary object, which must either be 4359523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// the type of the initializer expression or a superclass thereof. 4360523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4361523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param Enter The entity being initialized. 4362523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4363523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param CurInit The initializer expression. 4364523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4365523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \param IsExtraneousCopy Whether this is an "extraneous" copy that 4366523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// is permitted in C++03 (but not C++0x) when binding a reference to 4367523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// an rvalue. 4368523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// 4369523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// \returns An expression that copies the initializer expression into 4370523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// a temporary object, or an error expression if a copy could not be 4371523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor/// created. 437260d7b3a319d84d688752be3870615ac0f111fb16John McCallstatic ExprResult CopyObject(Sema &S, 43738fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor QualType T, 43748fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor const InitializedEntity &Entity, 43758fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor ExprResult CurInit, 43768fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor bool IsExtraneousCopy) { 43773fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine which class type we're copying to. 43781b36a2fcb2cea310c01fc2a80a9da915e5d2ceb0Anders Carlsson Expr *CurInitExpr = (Expr *)CurInit.get(); 4379dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXRecordDecl *Class = 0; 4380523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) 43812f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Class = cast<CXXRecordDecl>(Record->getDecl()); 43822f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (!Class) 43832f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor return move(CurInit); 43842f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 4385f5d8f466c3eebaffc51468812bdcbe7f0fe4891aDouglas Gregor // C++0x [class.copy]p32: 43862f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // When certain criteria are met, an implementation is allowed to 43872f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // omit the copy/move construction of a class object, even if the 43882f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // copy/move constructor and/or destructor for the object have 43892f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // side effects. [...] 43902f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // - when a temporary class object that has not been bound to a 43912f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // reference (12.2) would be copied/moved to a class object 43922f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // with the same cv-unqualified type, the copy/move operation 43932f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // can be omitted by constructing the temporary object 43942f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // directly into the target of the omitted copy/move 4395dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // 43962f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor // Note that the other three bullets are handled elsewhere. Copy 43973c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // elision for return statements and throw expressions are handled as part 4398dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // of constructor initialization, while copy elision for exception handlers 43993c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor // is handled by the run-time. 4400558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall bool Elidable = CurInitExpr->isTemporaryObject(S.Context, Class); 440183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith SourceLocation Loc = getInitializationLoc(Entity, CurInit.get()); 4402f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 4403dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Make sure that the type we are copying is complete. 4404f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor if (S.RequireCompleteType(Loc, T, S.PDiag(diag::err_temp_copy_incomplete))) 4405f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor return move(CurInit); 4406f86fcb341116e72c5497e6b57695f46eca5f29e9Douglas Gregor 4407cc15f010672a13b38104a32e3cefc7adc07ffbf7Douglas Gregor // Perform overload resolution using the class's copy/move constructors. 440883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Only consider constructors and constructor templates. Per 440983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // C++0x [dcl.init]p16, second bullet to class types, this initialization 441083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // is direct-initialization. 44115769d6195087229770d7ac90449443e026c47103John McCall OverloadCandidateSet CandidateSet(Loc); 441283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith LookupCopyAndMoveConstructors(S, CandidateSet, Class, CurInitExpr); 4413dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 44147cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates = (CandidateSet.size() > 1); 44157cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 441618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor OverloadCandidateSet::iterator Best; 441725ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth switch (CandidateSet.BestViableFunction(S, Loc, Best)) { 441818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Success: 441918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 4420dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 442118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_No_Viable_Function: 442257d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin S.Diag(Loc, IsExtraneousCopy && !S.isSFINAEContext() 442357d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin ? diag::ext_rvalue_to_reference_temp_copy_no_viable 442457d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin : diag::err_temp_copy_no_viable) 44257abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 442618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 4427120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall CandidateSet.NoteCandidates(S, OCD_AllCandidates, &CurInitExpr, 1); 442857d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin if (!IsExtraneousCopy || S.isSFINAEContext()) 4429f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 443057d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin return move(CurInit); 4431dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 443218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Ambiguous: 443318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_ambiguous) 44347abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 443518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 4436120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall CandidateSet.NoteCandidates(S, OCD_ViableCandidates, &CurInitExpr, 1); 4437f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4438dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 443918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case OR_Deleted: 444018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Loc, diag::err_temp_copy_deleted) 44417abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregor << (int)Entity.getKind() << CurInitExpr->getType() 444218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << CurInitExpr->getSourceRange(); 444318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 4444f85e193739c953358c865005855253af4f68a497John McCall << 1 << Best->Function->isDeleted(); 4445f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 444618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 444718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 44483fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function); 4449ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 44503fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 4451523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 44529a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Loc, Constructor, Entity, 445357d12fd4a2bc739c4a4d62a364b7f08cd483c59eJeffrey Yasskin Best->FoundDecl.getAccess(), IsExtraneousCopy); 4454523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 4455523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor if (IsExtraneousCopy) { 4456523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // If this is a totally extraneous copy for C++03 reference 4457523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // binding purposes, just return the original initialization 44582559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // expression. We don't generate an (elided) copy operation here 44592559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // because doing so would require us to pass down a flag to avoid 44602559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // infinite recursion, where each step adds another extraneous, 44612559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // elidable copy. 44622559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 44632559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Instantiate the default arguments of any extra parameters in 44642559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // the selected copy constructor, as if we were going to create a 44652559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // proper call to the copy constructor. 44662559a7045a74679c80376305397a5953d038e1d0Douglas Gregor for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) { 44672559a7045a74679c80376305397a5953d038e1d0Douglas Gregor ParmVarDecl *Parm = Constructor->getParamDecl(I); 44682559a7045a74679c80376305397a5953d038e1d0Douglas Gregor if (S.RequireCompleteType(Loc, Parm->getType(), 44692559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.PDiag(diag::err_call_incomplete_argument))) 44702559a7045a74679c80376305397a5953d038e1d0Douglas Gregor break; 44712559a7045a74679c80376305397a5953d038e1d0Douglas Gregor 44722559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // Build the default argument expression; we don't actually care 44732559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if this succeeds or not, because this routine will complain 44742559a7045a74679c80376305397a5953d038e1d0Douglas Gregor // if there was a problem. 44752559a7045a74679c80376305397a5953d038e1d0Douglas Gregor S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm); 44762559a7045a74679c80376305397a5953d038e1d0Douglas Gregor } 4477523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 4478523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor return S.Owned(CurInitExpr); 4479523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor } 4480dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 44815f2987c11491edb186401d4e8eced275f0ea7c5eEli Friedman S.MarkFunctionReferenced(Loc, Constructor); 448225ca421a6049350a2748c8fd0c19a052eba6ae99Chandler Carruth 44833fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor // Determine the arguments required to actually perform the 4484523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // constructor call (we might have derived-to-base conversions, or 4485523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor // the copy constructor may have default arguments). 4486f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (S.CompleteConstructorCall(Constructor, MultiExprArg(&CurInitExpr, 1), 44873fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Loc, ConstructorArgs)) 4488f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 44893fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 4490b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // Actually perform the constructor call. 4491b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.BuildCXXConstructExpr(Loc, T, Constructor, Elidable, 44927a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall move_arg(ConstructorArgs), 44937cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 44947a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 4495428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 4496428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 4497dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4498b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // If we're supposed to bind temporaries, do so. 4499b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity)) 4500b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 4501b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor return move(CurInit); 450218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 450320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 450483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// \brief Check whether elidable copy construction for binding a reference to 450583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// a temporary would have succeeded if we were building in C++98 mode, for 450683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith/// -Wc++98-compat. 450783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smithstatic void CheckCXX98CompatAccessibleCopy(Sema &S, 450883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const InitializedEntity &Entity, 450983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Expr *CurInitExpr) { 451083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith assert(S.getLangOptions().CPlusPlus0x); 451183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 451283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith const RecordType *Record = CurInitExpr->getType()->getAs<RecordType>(); 451383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (!Record) 451483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return; 451583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 451683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith SourceLocation Loc = getInitializationLoc(Entity, CurInitExpr); 451783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith if (S.Diags.getDiagnosticLevel(diag::warn_cxx98_compat_temp_copy, Loc) 451883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith == DiagnosticsEngine::Ignored) 451983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith return; 452083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 452183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Find constructors which would have been considered. 452283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet CandidateSet(Loc); 452383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith LookupCopyAndMoveConstructors( 452483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S, CandidateSet, cast<CXXRecordDecl>(Record->getDecl()), CurInitExpr); 452583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 452683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // Perform overload resolution. 452783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadCandidateSet::iterator Best; 452883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith OverloadingResult OR = CandidateSet.BestViableFunction(S, Loc, Best); 452983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 453083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy) 453183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith << OR << (int)Entity.getKind() << CurInitExpr->getType() 453283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith << CurInitExpr->getSourceRange(); 453383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 453483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith switch (OR) { 453583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Success: 453683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.CheckConstructorAccess(Loc, cast<CXXConstructorDecl>(Best->Function), 453783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith Best->FoundDecl.getAccess(), Diag); 453883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith // FIXME: Check default arguments as far as that's possible. 453983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 454083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 454183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_No_Viable_Function: 454283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 454383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CandidateSet.NoteCandidates(S, OCD_AllCandidates, &CurInitExpr, 1); 454483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 454583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 454683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Ambiguous: 454783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 454883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith CandidateSet.NoteCandidates(S, OCD_ViableCandidates, &CurInitExpr, 1); 454983da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 455083da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 455183da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith case OR_Deleted: 455283da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Loc, Diag); 455383da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 455483da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith << 1 << Best->Function->isDeleted(); 455583da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith break; 455683da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith } 455783da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith} 455883da2e711902c4c54f5601c9000d646dfff06aeaRichard Smith 4559a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregorvoid InitializationSequence::PrintInitLocationNote(Sema &S, 4560a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor const InitializedEntity &Entity) { 4561a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Parameter && Entity.getDecl()) { 4562a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getLocation().isInvalid()) 4563a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor return; 4564a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 4565a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor if (Entity.getDecl()->getDeclName()) 4566a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here) 4567a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor << Entity.getDecl()->getDeclName(); 4568a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor else 4569a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here); 4570a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } 4571a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor} 4572a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor 45733b80232b50c29b245e674f5aa02047b408e41018Sebastian Redlstatic bool isReferenceBinding(const InitializationSequence::Step &s) { 45743b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl return s.Kind == InitializationSequence::SK_BindReference || 45753b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl s.Kind == InitializationSequence::SK_BindReferenceToTemporary; 45763b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl} 45773b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl 457810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redlstatic ExprResult 457910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian RedlPerformConstructorInitialization(Sema &S, 458010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializedEntity &Entity, 458110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializationKind &Kind, 458210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl MultiExprArg Args, 458310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl const InitializationSequence::Step& Step, 458410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl bool &ConstructorInitRequiresZeroInit) { 458510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl unsigned NumArgs = Args.size(); 458610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructorDecl *Constructor 458710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl = cast<CXXConstructorDecl>(Step.Function.Function); 458810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl bool HadMultipleCandidates = Step.Function.HadMultipleCandidates; 458910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 459010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Build a call to the selected constructor. 459110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ASTOwningVector<Expr*> ConstructorArgs(S); 459210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid()) 459310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ? Kind.getEqualLoc() 459410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl : Kind.getLocation(); 459510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 459610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Kind.getKind() == InitializationKind::IK_Default) { 459710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Force even a trivial, implicit default constructor to be 459810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // semantically checked. We do this explicitly because we don't build 459910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // the definition for completely trivial constructors. 460010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXRecordDecl *ClassDecl = Constructor->getParent(); 460110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl assert(ClassDecl && "No parent class for constructor."); 460210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() && 460310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ClassDecl->hasTrivialDefaultConstructor() && 460410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl !Constructor->isUsed(false)) 460510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.DefineImplicitDefaultConstructor(Loc, Constructor); 460610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 460710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 460810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ExprResult CurInit = S.Owned((Expr *)0); 460910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 461010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Determine the arguments required to actually perform the constructor 461110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // call. 461210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (S.CompleteConstructorCall(Constructor, move(Args), 461310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Loc, ConstructorArgs)) 461410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return ExprError(); 461510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 461610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 461710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Entity.getKind() == InitializedEntity::EK_Temporary && 461810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl NumArgs != 1 && // FIXME: Hack to work around cast weirdness 461910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl (Kind.getKind() == InitializationKind::IK_Direct || 462010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Kind.getKind() == InitializationKind::IK_Value)) { 462110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // An explicitly-constructed temporary, e.g., X(1, 2). 462210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl unsigned NumExprs = ConstructorArgs.size(); 462310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Expr **Exprs = (Expr **)ConstructorArgs.take(); 46245f2987c11491edb186401d4e8eced275f0ea7c5eEli Friedman S.MarkFunctionReferenced(Loc, Constructor); 462510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.DiagnoseUseOfDecl(Constructor, Loc); 462610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 462710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 462810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (!TSInfo) 462910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc); 463010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 463110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CurInit = S.Owned(new (S.Context) CXXTemporaryObjectExpr(S.Context, 463210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Constructor, 463310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl TSInfo, 463410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Exprs, 463510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl NumExprs, 463610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Kind.getParenRange(), 463710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl HadMultipleCandidates, 463810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructorInitRequiresZeroInit)); 463910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } else { 464010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::ConstructionKind ConstructKind = 464110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::CK_Complete; 464210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 464310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Entity.getKind() == InitializedEntity::EK_Base) { 464410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind = Entity.getBaseSpecifier()->isVirtual() ? 464510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::CK_VirtualBase : 464610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CXXConstructExpr::CK_NonVirtualBase; 464710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } else if (Entity.getKind() == InitializedEntity::EK_Delegating) { 464810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind = CXXConstructExpr::CK_Delegating; 464910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 465010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 465110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Only get the parenthesis range if it is a direct construction. 465210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl SourceRange parenRange = 465310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Kind.getKind() == InitializationKind::IK_Direct ? 465410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Kind.getParenRange() : SourceRange(); 465510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 465610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // If the entity allows NRVO, mark the construction as elidable 465710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // unconditionally. 465810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (Entity.allowsNRVO()) 465910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 466010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Constructor, /*Elidable=*/true, 466110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl move_arg(ConstructorArgs), 466210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl HadMultipleCandidates, 466310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructorInitRequiresZeroInit, 466410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind, 466510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl parenRange); 466610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl else 466710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), 466810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Constructor, 466910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl move_arg(ConstructorArgs), 467010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl HadMultipleCandidates, 467110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructorInitRequiresZeroInit, 467210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructKind, 467310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl parenRange); 467410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 467510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (CurInit.isInvalid()) 467610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return ExprError(); 467710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 467810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl // Only check access if all of that succeeded. 467910f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.CheckConstructorAccess(Loc, Constructor, Entity, 468010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl Step.Function.FoundDecl.getAccess()); 468110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc); 468210f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 468310f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl if (shouldBindAsTemporary(Entity)) 468410f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 468510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 468610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl return move(CurInit); 468710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl} 468810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl 4689dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 469020093b4bf698f292c664676987541d5103b65b15Douglas GregorInitializationSequence::Perform(Sema &S, 469120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 469220093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 4693f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiExprArg Args, 4694d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor QualType *ResultType) { 4695d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (Failed()) { 469620093b4bf698f292c664676987541d5103b65b15Douglas Gregor unsigned NumArgs = Args.size(); 469720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Diagnose(S, Entity, Kind, (Expr **)Args.release(), NumArgs); 4698f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 469920093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4700dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 47017491c499e826682e128a400038361ebcbde30eecSebastian Redl if (getKind() == DependentSequence) { 4702d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // If the declaration is a non-dependent, incomplete array type 4703d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // that has an initializer, then its type will be completed once 4704d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // the initializer is instantiated. 4705d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (ResultType && !Entity.getType()->isDependentType() && 4706d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Args.size() == 1) { 4707d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DeclType = Entity.getType(); 4708d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (const IncompleteArrayType *ArrayT 4709d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getAsIncompleteArrayType(DeclType)) { 4710d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // FIXME: We don't currently have the ability to accurately 4711d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // compute the length of an initializer list without 4712d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // performing full type-checking of the initializer list 4713d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // (since we have to determine where braces are implicitly 4714d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // introduced and such). So, we fall back to making the array 4715d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // type a dependently-sized array type with no specified 4716d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // bound. 4717d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (isa<InitListExpr>((Expr *)Args.get()[0])) { 4718d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor SourceRange Brackets; 4719d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor 4720d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor // Scavange the location of the brackets from the entity, if we can. 4721d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (DeclaratorDecl *DD = Entity.getDecl()) { 4722d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) { 4723d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor TypeLoc TL = TInfo->getTypeLoc(); 4724d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor if (IncompleteArrayTypeLoc *ArrayLoc 4725d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor = dyn_cast<IncompleteArrayTypeLoc>(&TL)) 4726d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Brackets = ArrayLoc->getBracketsRange(); 4727d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor } 4728d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4729d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4730d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor *ResultType 4731d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor = S.Context.getDependentSizedArrayType(ArrayT->getElementType(), 4732d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor /*NumElts=*/0, 4733d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getSizeModifier(), 4734d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor ArrayT->getIndexTypeCVRQualifiers(), 4735d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor Brackets); 4736d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4737d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 4738d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 4739d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 47405b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (Kind.getKind() == InitializationKind::IK_Direct && 47415b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl !Kind.isExplicitCast()) { 47425b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl // Rebuild the ParenListExpr. 47435b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl SourceRange ParenRange = Kind.getParenRange(); 47445b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl return S.ActOnParenListExpr(ParenRange.getBegin(), ParenRange.getEnd(), 47455b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl move(Args)); 47465b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl } 47470d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek assert(Kind.getKind() == InitializationKind::IK_Copy || 47480d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek Kind.isExplicitCast()); 47490d9106fc97cde979a995e26b18bcd2643f8afb55Manuel Klimek return ExprResult(Args.release()[0]); 475020093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 475120093b4bf698f292c664676987541d5103b65b15Douglas Gregor 47527491c499e826682e128a400038361ebcbde30eecSebastian Redl // No steps means no initialization. 47537491c499e826682e128a400038361ebcbde30eecSebastian Redl if (Steps.empty()) 475499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor return S.Owned((Expr *)0); 4755dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4756d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType().getNonReferenceType(); 4757d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor // FIXME: Ugly hack around the fact that Entity.getType() is not 4758a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // the same as Entity.getDecl()->getType() in cases involving type merging, 4759a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman // and we want latter when it makes sense. 4760d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor if (ResultType) 4761a91eb541a6adf81acf872e7315bc6b814c3241ebEli Friedman *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() : 4762d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor Entity.getType(); 476320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 476460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult CurInit = S.Owned((Expr *)0); 4765dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4766dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // For initialization steps that start with a single initializer, 476799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // grab the only argument out the Args and place it into the "current" 476899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor // initializer. 476999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor switch (Steps.front().Kind) { 477018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ResolveAddressOfOverloadedFunction: 477118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseRValue: 4772906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 477318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CastDerivedToBaseLValue: 477418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReference: 477518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_BindReferenceToTemporary: 4776523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 477718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_UserConversion: 477818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionLValue: 4779906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 478018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_QualificationConversionRValue: 478118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConversionSequence: 47828713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case SK_ListConstructorCall: 478318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ListInitialization: 478413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 478513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 478618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: 4787cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: 4788cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ObjCObjectConversion: 4789f85e193739c953358c865005855253af4f68a497John McCall case SK_ArrayInit: 4790f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 4791f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 47922b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_ProduceObjCObject: 47932b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_StdInitializerList: { 479418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(Args.size() == 1); 4795429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = Args.get()[0]; 4796429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (!CurInit.get()) return ExprError(); 479718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 4798f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 4799dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 480018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ConstructorInitialization: 480118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_ZeroInitialization: 480218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 480320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4804dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4805dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Walk through the computed steps for the initialization sequence, 480620093b4bf698f292c664676987541d5103b65b15Douglas Gregor // performing the specified conversions along the way. 480716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool ConstructorInitRequiresZeroInit = false; 480820093b4bf698f292c664676987541d5103b65b15Douglas Gregor for (step_iterator Step = step_begin(), StepEnd = step_end(); 480920093b4bf698f292c664676987541d5103b65b15Douglas Gregor Step != StepEnd; ++Step) { 481020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 4811f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4812dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4813429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType(); 4814dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 481520093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Step->Kind) { 481620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 4817dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // Overload resolution determined which function invoke; update the 481820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // initializer to reflect that choice. 4819429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckAddressOfMemberAccess(CurInit.get(), Step->Function.FoundDecl); 4820b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()); 4821b13b737a2450167c82e148590e8019b839ce6b98John McCall CurInit = S.FixOverloadedFunctionReference(move(CurInit), 48226bb8017bb9e828d118e15e59d71c66bba323c364John McCall Step->Function.FoundDecl, 48239aa472c45d2bd81b7b52c225e8acc560d716db97John McCall Step->Function.Function); 482420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4825dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 482620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseRValue: 4827906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 482820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_CastDerivedToBaseLValue: { 482920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a derived-to-base cast that produces either an rvalue or an 483020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // lvalue. Perform that cast. 4831dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4832f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXCastPath BasePath; 48335cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 483420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Casts to inaccessible base classes are allowed with C-style casts. 483520093b4bf698f292c664676987541d5103b65b15Douglas Gregor bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast(); 483620093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CheckDerivedToBaseConversion(SourceType, Step->Type, 4837429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getLocStart(), 4838429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getSourceRange(), 48395cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson &BasePath, IgnoreBaseAccess)) 4840f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4841dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 48426fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (S.BasePathInvolvesVirtualBase(BasePath)) { 48436fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor QualType T = SourceType; 48446fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) 48456fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor T = Pointer->getPointeeType(); 48466fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const RecordType *RecordTy = T->getAs<RecordType>()) 4847429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.MarkVTableUsed(CurInit.get()->getLocStart(), 48486fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor cast<CXXRecordDecl>(RecordTy->getDecl())); 48496fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor } 48506fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 48515baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 4852906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_CastDerivedToBaseLValue ? 48535baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 4854906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_CastDerivedToBaseXValue ? 48555baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 48565baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 4857f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 4858f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Step->Type, 48592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_DerivedToBase, 48605baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall CurInit.get(), 48615baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall &BasePath, VK)); 486220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 486320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4864dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 486520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReference: 4866429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (FieldDecl *BitField = CurInit.get()->getBitField()) { 486720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // References cannot bind to bit fields (C++ [dcl.init.ref]p5). 486820093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield) 4869d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor << Entity.getType().isVolatileQualified() 487020093b4bf698f292c664676987541d5103b65b15Douglas Gregor << BitField->getDeclName() 4871429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 487220093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(BitField->getLocation(), diag::note_bitfield_decl); 4873f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 487420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4875a6fe0bf89db4372c9e8e8a5c2a50593c2977df29Anders Carlsson 4876429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInit.get()->refersToVectorElement()) { 487741593e3b7da967b52bc3c7f488b8752dee63f38eJohn McCall // References cannot bind to vector elements. 4878093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element) 4879093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson << Entity.getType().isVolatileQualified() 4880429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 4881a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 4882f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4883093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson } 4884dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 488520093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Reference binding does not have any corresponding ASTs. 488620093b4bf698f292c664676987541d5103b65b15Douglas Gregor 488720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 4888429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType)) 4889f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 48903aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 489120093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 48923aba09376c5f49c4c8d176109ea4835bc2c528eeAnders Carlsson 489320093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_BindReferenceToTemporary: 489420093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Check exception specifications 4895429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType)) 4896f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 489720093b4bf698f292c664676987541d5103b65b15Douglas Gregor 489803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // Materialize the temporary into memory. 4899b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor CurInit = new (S.Context) MaterializeTemporaryExpr( 4900b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor Entity.getType().getNonReferenceType(), 4901b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor CurInit.get(), 490203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor Entity.getType()->isLValueReferenceType()); 4903d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor 4904d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor // If we're binding to an Objective-C object that has lifetime, we 4905d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor // need cleanups. 4906d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor if (S.getLangOptions().ObjCAutoRefCount && 4907d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor CurInit.get()->getType()->isObjCLifetimeType()) 4908d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor S.ExprNeedsCleanups = true; 4909d7b23167763f43d3e76b0de26141b1e52613ee3cDouglas Gregor 491020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 4911dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4912523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 4913dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInit = CopyObject(S, Step->Type, Entity, move(CurInit), 4914523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor /*IsExtraneousCopy=*/true); 4915523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 4916523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 491720093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_UserConversion: { 491820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // We have a user-defined conversion that invokes either a constructor 491920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // or a conversion function. 4920daa8e4e888758d55a7a759dd4a91b83921cef222John McCall CastKind CastKind; 492118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor bool IsCopy = false; 49229aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FunctionDecl *Fn = Step->Function.Function; 49239aa472c45d2bd81b7b52c225e8acc560d716db97John McCall DeclAccessPair FoundFn = Step->Function.FoundDecl; 49247cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates = Step->Function.HadMultipleCandidates; 49254154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor bool CreatedObject = false; 4926b13b737a2450167c82e148590e8019b839ce6b98John McCall if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) { 492720093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the selected constructor. 4928ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(S); 4929429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley SourceLocation Loc = CurInit.get()->getLocStart(); 493020093b4bf698f292c664676987541d5103b65b15Douglas Gregor CurInit.release(); // Ownership transferred into MultiExprArg, below. 4931b13b737a2450167c82e148590e8019b839ce6b98John McCall 493220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Determine the arguments required to actually perform the constructor 493320093b4bf698f292c664676987541d5103b65b15Douglas Gregor // call. 4934429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley Expr *Arg = CurInit.get(); 493520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (S.CompleteConstructorCall(Constructor, 4936429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley MultiExprArg(&Arg, 1), 493720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Loc, ConstructorArgs)) 4938f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4939dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4940f2e4dfcd325db2c1a960697be2c750f277dcafceRichard Smith // Build an expression that constructs a temporary. 4941dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CurInit = S.BuildCXXConstructExpr(Loc, Step->Type, Constructor, 49427a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall move_arg(ConstructorArgs), 49437cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates, 49447a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall /*ZeroInit*/ false, 4945428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::CK_Complete, 4946428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange()); 494720093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid()) 4948f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4949b13b737a2450167c82e148590e8019b839ce6b98John McCall 49509a68a67c6ae4982001815cc04f69b8781058263aAnders Carlsson S.CheckConstructorAccess(Kind.getLocation(), Constructor, Entity, 49519aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn.getAccess()); 4952b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 4953dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 49542de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_ConstructorConversion; 495518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor QualType Class = S.Context.getTypeDeclType(Constructor->getParent()); 495618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.Context.hasSameUnqualifiedType(SourceType, Class) || 495718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.IsDerivedFrom(SourceType, Class)) 495818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor IsCopy = true; 4959dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 49604154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = true; 496120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 496220093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build a call to the conversion function. 4963b13b737a2450167c82e148590e8019b839ce6b98John McCall CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn); 4964429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), 0, 49659aa472c45d2bd81b7b52c225e8acc560d716db97John McCall FoundFn); 4966b697e084341185a08b3946df032fbc75f76a66e0John McCall S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()); 4967dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 4968dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi // FIXME: Should we move this initialization into a separate 496920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // derived-to-base conversion? I believe the answer is "no", because 497020093b4bf698f292c664676987541d5103b65b15Douglas Gregor // we don't want to turn off access control here for c-style casts. 4971429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = 4972429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.PerformObjectArgumentInitialization(CurInit.take(), /*Qualifier=*/0, 4973429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley FoundFn, Conversion); 4974429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if(CurInitExprRes.isInvalid()) 4975f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4976429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(CurInitExprRes); 4977dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 497820093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Build the actual call to the conversion function. 49797cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion, 49807cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara HadMultipleCandidates); 498120093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (CurInit.isInvalid() || !CurInit.get()) 4982f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 4983dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 49842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CastKind = CK_UserDefinedConversion; 4985dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 49864154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor CreatedObject = Conversion->getResultType()->isRecordType(); 498720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 4988dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 49893b80232b50c29b245e674f5aa02047b408e41018Sebastian Redl bool RequiresCopy = !IsCopy && !isReferenceBinding(Steps.back()); 4990960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara bool MaybeBindToTemp = RequiresCopy || shouldBindAsTemporary(Entity); 4991960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara 4992960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara if (!MaybeBindToTemp && CreatedObject && shouldDestroyTemporary(Entity)) { 4993429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType T = CurInit.get()->getType(); 49944154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor if (const RecordType *Record = T->getAs<RecordType>()) { 4995dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi CXXDestructorDecl *Destructor 4996db89f289a22897f1031c92f3e49f7a9ba7bae61eDouglas Gregor = S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl())); 4997429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckDestructorAccess(CurInit.get()->getLocStart(), Destructor, 49984154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor S.PDiag(diag::err_access_dtor_temp) << T); 49995f2987c11491edb186401d4e8eced275f0ea7c5eEli Friedman S.MarkFunctionReferenced(CurInit.get()->getLocStart(), Destructor); 5000429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getLocStart()); 50014154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 50024154e0b1a5d03cbe4836e381c7d6187b7a0a200cDouglas Gregor } 5003dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5004f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, 5005429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get()->getType(), 5006429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CastKind, CurInit.get(), 0, 5007104be6fc8de206c9b79b241b36ebaf9407b3be08Eli Friedman CurInit.get()->getValueKind())); 5008960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara if (MaybeBindToTemp) 5009960809e7e9f4a6e949797d20bc081da80495c0e1Abramo Bagnara CurInit = S.MaybeBindToTemporary(CurInit.takeAs<Expr>()); 50102f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor if (RequiresCopy) 5011523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor CurInit = CopyObject(S, Entity.getType().getNonReferenceType(), Entity, 5012523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor move(CurInit), /*IsExtraneousCopy=*/false); 501320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 501420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5015906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 501620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case SK_QualificationConversionLValue: 5017906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 5018906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionRValue: { 501920093b4bf698f292c664676987541d5103b65b15Douglas Gregor // Perform a qualification conversion; these can never go wrong. 50205baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK = 5021906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl Step->Kind == SK_QualificationConversionLValue ? 50225baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_LValue : 5023906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl (Step->Kind == SK_QualificationConversionXValue ? 50245baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_XValue : 50255baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall VK_RValue); 5026429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = S.ImpCastExprToType(CurInit.take(), Step->Type, CK_NoOp, VK); 502720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5028906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl } 5029906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 5030f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor case SK_ConversionSequence: { 5031f85e193739c953358c865005855253af4f68a497John McCall Sema::CheckedConversionKind CCK 5032f85e193739c953358c865005855253af4f68a497John McCall = Kind.isCStyleCast()? Sema::CCK_CStyleCast 5033f85e193739c953358c865005855253af4f68a497John McCall : Kind.isFunctionalCast()? Sema::CCK_FunctionalCast 5034c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith : Kind.isExplicitCast()? Sema::CCK_OtherCast 5035f85e193739c953358c865005855253af4f68a497John McCall : Sema::CCK_ImplicitConversion; 5036429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = 5037429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.PerformImplicitConversion(CurInit.get(), Step->Type, *Step->ICS, 5038f85e193739c953358c865005855253af4f68a497John McCall getAssignmentAction(Entity), CCK); 5039429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInitExprRes.isInvalid()) 5040f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5041429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(CurInitExprRes); 504220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5043f0e43e5c4634870b8ac7bf65d5ffa5f292d4c8a5Douglas Gregor } 5044dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5045d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case SK_ListInitialization: { 5046429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley InitListExpr *InitList = cast<InitListExpr>(CurInit.get()); 504713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Hack: We must pass *ResultType if available in order to set the type 504813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // of arrays, e.g. in 'int ar[] = {1, 2, 3};'. 504913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // But in 'const X &x = {1, 2, 3};' we're supposed to initialize a 505013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // temporary, not a reference, so we should pass Ty. 505113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Worst case: 'const int (&arref)[] = {1, 2, 3};'. 505213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Since this step is never used for a reference directly, we explicitly 505313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // unwrap references here and rewrap them afterwards. 505413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // We also need to create a InitializeTemporary entity for this. 505513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl QualType Ty = ResultType ? ResultType->getNonReferenceType() : Step->Type; 505613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl bool IsTemporary = ResultType && (*ResultType)->isReferenceType(); 505713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(Ty); 505813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListChecker PerformInitList(S, IsTemporary ? TempEntity : Entity, 505913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitList, Ty, /*VerifyOnly=*/false, 5060168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Kind.getKind() != InitializationKind::IK_DirectList || 5061c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl !S.getLangOptions().CPlusPlus0x); 506214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl if (PerformInitList.HadError()) 5063f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5064d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 506513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (ResultType) { 506613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if ((*ResultType)->isRValueReferenceType()) 506713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Ty = S.Context.getRValueReferenceType(Ty); 506813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl else if ((*ResultType)->isLValueReferenceType()) 506913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Ty = S.Context.getLValueReferenceType(Ty, 507013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl (*ResultType)->getAs<LValueReferenceType>()->isSpelledAsLValue()); 507113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl *ResultType = Ty; 507213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 507313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 507413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *StructuredInitList = 507513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl PerformInitList.getFullyStructuredList(); 5076d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor CurInit.release(); 507713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl CurInit = S.Owned(StructuredInitList); 5078d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5079d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 508051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor 508110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl case SK_ListConstructorCall: { 5082168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // When an initializer list is passed for a parameter of type "reference 5083168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // to object", we don't get an EK_Temporary entity, but instead an 5084168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // EK_Parameter entity with reference type. 5085168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // FIXME: This is a hack. Why is this necessary here, but not in other 5086168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl // places where implicit temporaries are created? 5087168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl InitializedEntity TempEntity = InitializedEntity::InitializeTemporary( 5088168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Entity.getType().getNonReferenceType()); 5089168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl bool UseTemporary = Entity.getType()->isReferenceType(); 509010f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl InitListExpr *InitList = cast<InitListExpr>(CurInit.get()); 509110f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl MultiExprArg Arg(InitList->getInits(), InitList->getNumInits()); 5092168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl CurInit = PerformConstructorInitialization(S, UseTemporary ? TempEntity : 5093168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Entity, 5094168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Kind, move(Arg), *Step, 509510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructorInitRequiresZeroInit); 509610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl break; 509710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl } 50988713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 509913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 510013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl CurInit = S.Owned(cast<InitListExpr>(CurInit.take())->getInit(0)); 510113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 510213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 510313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: { 510413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Expr *E = CurInit.take(); 510513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *Syntactic = Step->WrappingSyntacticList; 510613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl InitListExpr *ILE = new (S.Context) InitListExpr(S.Context, 510713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl Syntactic->getLBraceLoc(), &E, 1, Syntactic->getRBraceLoc()); 510813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setSyntacticForm(Syntactic); 510913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setType(E->getType()); 511013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ILE->setValueKind(E->getValueKind()); 511113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl CurInit = S.Owned(ILE); 511213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 511313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 511413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 511510f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl case SK_ConstructorInitialization: 511610f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl CurInit = PerformConstructorInitialization(S, Entity, Kind, move(Args), 511710f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl *Step, 511810f04a6267eb07d3be00db1fd0369e1398f5d0a8Sebastian Redl ConstructorInitRequiresZeroInit); 511951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 5120dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 512171d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor case SK_ZeroInitialization: { 512216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor step_iterator NextStep = Step; 512316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ++NextStep; 5124dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi if (NextStep != StepEnd && 512516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor NextStep->Kind == SK_ConstructorInitialization) { 512616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // The need for zero-initialization is recorded directly into 512716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor // the call to the object's constructor within the next step. 512816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ConstructorInitRequiresZeroInit = true; 512916006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else if (Kind.getKind() == InitializationKind::IK_Value && 513016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor S.getLangOptions().CPlusPlus && 513116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor !Kind.isImplicitValueInit()) { 5132ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); 5133ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!TSInfo) 5134dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi TSInfo = S.Context.getTrivialTypeSourceInfo(Step->Type, 5135ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Kind.getRange().getBegin()); 5136ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 5137ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CurInit = S.Owned(new (S.Context) CXXScalarValueInitExpr( 5138ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo->getType().getNonLValueExprType(S.Context), 5139ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TSInfo, 514071d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor Kind.getRange().getEnd())); 514116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } else { 514271d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor CurInit = S.Owned(new (S.Context) ImplicitValueInitExpr(Step->Type)); 514316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 514471d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor break; 514571d1740c94060b424bb745d6c6973ff27cfdee06Douglas Gregor } 514618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 514718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor case SK_CAssignment: { 5148429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType SourceType = CurInit.get()->getType(); 5149429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult Result = move(CurInit); 515018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Sema::AssignConvertType ConvTy = 5151429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckSingleAssignmentConstraints(Step->Type, Result); 5152429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (Result.isInvalid()) 5153429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 5154429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(Result); 5155aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 5156aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor // If this is a call, allow conversion to a transparent union. 5157429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley ExprResult CurInitExprRes = move(CurInit); 5158aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor if (ConvTy != Sema::Compatible && 5159aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor Entity.getKind() == InitializedEntity::EK_Parameter && 5160429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExprRes) 5161aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor == Sema::Compatible) 5162aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor ConvTy = Sema::Compatible; 5163429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley if (CurInitExprRes.isInvalid()) 5164429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return ExprError(); 5165429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = move(CurInitExprRes); 5166aa0373107968aa7a26bf63f4a2673b8325b800afDouglas Gregor 5167a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor bool Complained; 516818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(), 516918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Step->Type, SourceType, 5170429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit.get(), 5171a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor getAssignmentAction(Entity), 5172a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor &Complained)) { 5173a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 5174f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5175a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor } else if (Complained) 5176a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 517718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor break; 517818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor } 5179cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman 5180cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman case SK_StringInit: { 5181cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman QualType Ty = Step->Type; 5182429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CheckStringInit(CurInit.get(), ResultType ? *ResultType : Ty, 5183fef8b344ea299a1717cc94486f5df6facf3e337cJohn McCall S.Context.getAsArrayType(Ty), S); 5184cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman break; 5185cfdc81a83467973b14e4ea5e9e9af1690f135415Eli Friedman } 5186569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 5187569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 5188429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley CurInit = S.ImpCastExprToType(CurInit.take(), Step->Type, 51892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_ObjCObjectLValueCast, 5190c1c0dfb376b829b94d4c61e9f358ce23e6aa3169Eli Friedman CurInit.get()->getValueKind()); 5191569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 5192cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5193cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 5194cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // Okay: we checked everything before creating this step. Note that 5195cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // this is a GNU extension. 5196cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Diag(Kind.getLocation(), diag::ext_array_init_copy) 5197429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << Step->Type << CurInit.get()->getType() 5198429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley << CurInit.get()->getSourceRange(); 5199cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5200cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // If the destination type is an incomplete array type, update the 5201cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor // type accordingly. 5202cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (ResultType) { 5203cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const IncompleteArrayType *IncompleteDest 5204cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor = S.Context.getAsIncompleteArrayType(Step->Type)) { 5205cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor if (const ConstantArrayType *ConstantSource 5206429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley = S.Context.getAsConstantArrayType(CurInit.get()->getType())) { 5207cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor *ResultType = S.Context.getConstantArrayType( 5208cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor IncompleteDest->getElementType(), 5209cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ConstantSource->getSize(), 5210cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ArrayType::Normal, 0); 5211cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 5212cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 5213cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor } 5214f85e193739c953358c865005855253af4f68a497John McCall break; 5215cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5216f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 5217f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 5218f85e193739c953358c865005855253af4f68a497John McCall checkIndirectCopyRestoreSource(S, CurInit.get()); 5219f85e193739c953358c865005855253af4f68a497John McCall CurInit = S.Owned(new (S.Context) 5220f85e193739c953358c865005855253af4f68a497John McCall ObjCIndirectCopyRestoreExpr(CurInit.take(), Step->Type, 5221f85e193739c953358c865005855253af4f68a497John McCall Step->Kind == SK_PassByIndirectCopyRestore)); 5222f85e193739c953358c865005855253af4f68a497John McCall break; 5223f85e193739c953358c865005855253af4f68a497John McCall 5224f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 5225f85e193739c953358c865005855253af4f68a497John McCall CurInit = S.Owned(ImplicitCastExpr::Create(S.Context, Step->Type, 522633e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall CK_ARCProduceObject, 5227f85e193739c953358c865005855253af4f68a497John McCall CurInit.take(), 0, VK_RValue)); 5228cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 52292b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 52302b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_StdInitializerList: { 52312b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl QualType Dest = Step->Type; 52322b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl QualType E; 52332b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl bool Success = S.isStdInitializerList(Dest, &E); 52342b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl (void)Success; 52352b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl assert(Success && "Destination type changed?"); 52362b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitListExpr *ILE = cast<InitListExpr>(CurInit.take()); 52372b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl unsigned NumInits = ILE->getNumInits(); 52382b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl SmallVector<Expr*, 16> Converted(NumInits); 52392b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializedEntity HiddenArray = InitializedEntity::InitializeTemporary( 52402b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Context.getConstantArrayType(E, 52412b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()), 52422b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl NumInits), 52432b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ArrayType::Normal, 0)); 52442b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializedEntity Element =InitializedEntity::InitializeElement(S.Context, 52452b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 0, HiddenArray); 52462b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl for (unsigned i = 0; i < NumInits; ++i) { 52472b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Element.setElementIndex(i); 52482b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ExprResult Init = S.Owned(ILE->getInit(i)); 52492b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ExprResult Res = S.PerformCopyInitialization(Element, 52502b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Init.get()->getExprLoc(), 52512b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Init); 52522b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl assert(!Res.isInvalid() && "Result changed since try phase."); 52532b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Converted[i] = Res.take(); 52542b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 52552b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitListExpr *Semantic = new (S.Context) 52562b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitListExpr(S.Context, ILE->getLBraceLoc(), 52572b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Converted.data(), NumInits, ILE->getRBraceLoc()); 52582b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Semantic->setSyntacticForm(ILE); 52592b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Semantic->setType(Dest); 52602b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl CurInit = S.Owned(Semantic); 52612b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl break; 52622b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 526320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 526420093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 526515d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall 526615d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall // Diagnose non-fatal problems with the completed initialization. 526715d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall if (Entity.getKind() == InitializedEntity::EK_Member && 526815d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl())->isBitField()) 526915d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall S.CheckBitFieldInitialization(Kind.getLocation(), 527015d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall cast<FieldDecl>(Entity.getDecl()), 527115d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall CurInit.get()); 5272dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 527320093b4bf698f292c664676987541d5103b65b15Douglas Gregor return move(CurInit); 527420093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 527520093b4bf698f292c664676987541d5103b65b15Douglas Gregor 527620093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 527720093b4bf698f292c664676987541d5103b65b15Douglas Gregor// Diagnose initialization failures 527820093b4bf698f292c664676987541d5103b65b15Douglas Gregor//===----------------------------------------------------------------------===// 5279dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumibool InitializationSequence::Diagnose(Sema &S, 528020093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializedEntity &Entity, 528120093b4bf698f292c664676987541d5103b65b15Douglas Gregor const InitializationKind &Kind, 528220093b4bf698f292c664676987541d5103b65b15Douglas Gregor Expr **Args, unsigned NumArgs) { 5283d695d6bb7323672e29dbb1556a3dafde3d3b2732Sebastian Redl if (!Failed()) 528420093b4bf698f292c664676987541d5103b65b15Douglas Gregor return false; 5285dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5286d6542d8efcf8389c3aab764f9e29ac284e16eda6Douglas Gregor QualType DestType = Entity.getType(); 528720093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (Failure) { 528820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_TooManyInitsForReference: 52899db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // FIXME: Customize for the initialized entity? 52909db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (NumArgs == 0) 52919db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_without_init) 52929db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType.getNonReferenceType(); 52939db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor else // FIXME: diagnostic below could be better! 52949db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits) 52959db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); 529620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5297dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 529820093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitList: 529920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 530020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) 530120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << (Failure == FK_ArrayNeedsInitListOrStringLiteral); 530220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5303dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5304cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 5305cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 5306cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor S.Diag(Kind.getLocation(), 5307cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor (Failure == FK_ArrayTypeMismatch 5308cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor ? diag::err_array_init_different_type 5309cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor : diag::err_array_init_non_constant_array)) 5310cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << DestType.getNonReferenceType() 5311cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << Args[0]->getType() 5312cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor << Args[0]->getSourceRange(); 5313cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 5314cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 531573076431605556fdbf28d287d084a73a24a8b8d4John McCall case FK_VariableLengthArrayHasInitializer: 531673076431605556fdbf28d287d084a73a24a8b8d4John McCall S.Diag(Kind.getLocation(), diag::err_variable_object_no_init) 531773076431605556fdbf28d287d084a73a24a8b8d4John McCall << Args[0]->getSourceRange(); 531873076431605556fdbf28d287d084a73a24a8b8d4John McCall break; 531973076431605556fdbf28d287d084a73a24a8b8d4John McCall 53206bb8017bb9e828d118e15e59d71c66bba323c364John McCall case FK_AddressOfOverloadFailed: { 53216bb8017bb9e828d118e15e59d71c66bba323c364John McCall DeclAccessPair Found; 5322dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.ResolveAddressOfOverloadedFunction(Args[0], 532320093b4bf698f292c664676987541d5103b65b15Douglas Gregor DestType.getNonReferenceType(), 53246bb8017bb9e828d118e15e59d71c66bba323c364John McCall true, 53256bb8017bb9e828d118e15e59d71c66bba323c364John McCall Found); 532620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 53276bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 5328dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 532920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitOverloadFailed: 53304a520a2bd8a6b79fa5d4771f02e34e7bd6bc461dDouglas Gregor case FK_UserConversionOverloadFailed: 533120093b4bf698f292c664676987541d5103b65b15Douglas Gregor switch (FailedOverloadResult) { 533220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Ambiguous: 533318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Failure == FK_UserConversionOverloadFailed) 533418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_ambiguous_condition) 533518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getType() << DestType 533618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 533718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor else 533818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor S.Diag(Kind.getLocation(), diag::err_ref_init_ambiguous) 533918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << DestType << Args[0]->getType() 534018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << Args[0]->getSourceRange(); 534118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 5342120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, Args, NumArgs); 534320093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5344dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 534520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_No_Viable_Function: 534620093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition) 534720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 534820093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 5349120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args, NumArgs); 535020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5351dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 535220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Deleted: { 535320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function) 535420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() << DestType.getNonReferenceType() 535520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 535620093b4bf698f292c664676987541d5103b65b15Douglas Gregor OverloadCandidateSet::iterator Best; 5357120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 53588fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best, 53598fcc516a5d5b2fec0023a9dced29285a38b95355Douglas Gregor true); 536020093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (Ovl == OR_Deleted) { 536120093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 5362f85e193739c953358c865005855253af4f68a497John McCall << 1 << Best->Function->isDeleted(); 536320093b4bf698f292c664676987541d5103b65b15Douglas Gregor } else { 53649f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Inconsistent overload resolution?"); 536520093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 536620093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 536720093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5368dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 536920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case OR_Success: 53709f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Conversion did not fail!"); 537120093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 537220093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5373dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 537420093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 537513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl if (isa<InitListExpr>(Args[0])) { 537613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl S.Diag(Kind.getLocation(), 537713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl diag::err_lvalue_reference_bind_to_initlist) 537813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << DestType.getNonReferenceType().isVolatileQualified() 537913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << DestType.getNonReferenceType() 538013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl << Args[0]->getSourceRange(); 538113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 538213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 538313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Intentional fallthrough 538413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 538520093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 5386dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Kind.getLocation(), 538720093b4bf698f292c664676987541d5103b65b15Douglas Gregor Failure == FK_NonConstLValueReferenceBindingToTemporary 538820093b4bf698f292c664676987541d5103b65b15Douglas Gregor ? diag::err_lvalue_reference_bind_to_temporary 538920093b4bf698f292c664676987541d5103b65b15Douglas Gregor : diag::err_lvalue_reference_bind_to_unrelated) 5390ef06e2451c3069569ba543e7b1c5e0de7a257005Douglas Gregor << DestType.getNonReferenceType().isVolatileQualified() 539120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 539220093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 539320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 539420093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5395dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 539620093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_RValueReferenceBindingToLValue: 539720093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref) 5398fb5d7efc279335bde2cdc0a73da525d6b28201e9Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getType() 539920093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 540020093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5401dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 540220093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitDropsQualifiers: 540320093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) 540420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 540520093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 540620093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 540720093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5408dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 540920093b4bf698f292c664676987541d5103b65b15Douglas Gregor case FK_ReferenceInitFailed: 541020093b4bf698f292c664676987541d5103b65b15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_failed) 541120093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType.getNonReferenceType() 54127eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 541320093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getType() 541420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 5415926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor if (DestType.getNonReferenceType()->isObjCObjectPointerType() && 5416926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor Args[0]->getType()->isObjCObjectPointerType()) 5417926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor S.EmitRelatedResultTypeNote(Args[0]); 541820093b4bf698f292c664676987541d5103b65b15Douglas Gregor break; 5419dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 54201be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor case FK_ConversionFailed: { 54211be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor QualType FromType = Args[0]->getType(); 54226efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed) 542318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor << (int)Entity.getKind() 542420093b4bf698f292c664676987541d5103b65b15Douglas Gregor << DestType 54257eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall << Args[0]->isLValue() 54261be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor << FromType 542720093b4bf698f292c664676987541d5103b65b15Douglas Gregor << Args[0]->getSourceRange(); 54286efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu S.HandleFunctionTypeMismatch(PDiag, FromType, DestType); 54296efd4c55a1a481d92966a91141c03e8145234cf6Richard Trieu S.Diag(Kind.getLocation(), PDiag); 5430926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor if (DestType.getNonReferenceType()->isObjCObjectPointerType() && 5431926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor Args[0]->getType()->isObjCObjectPointerType()) 5432926df6cfabf3eaa4afc990c097fa4619b76a9b57Douglas Gregor S.EmitRelatedResultTypeNote(Args[0]); 5433d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 54341be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor } 5435429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 5436429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 5437429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley // No-op. This error has already been reported. 5438429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley break; 5439429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 5440d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_TooManyInitsForScalar: { 544199a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceRange R; 544299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor 544399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor if (InitListExpr *InitList = dyn_cast<InitListExpr>(Args[0])) 544419311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R = SourceRange(InitList->getInit(0)->getLocEnd(), 544599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor InitList->getLocEnd()); 5446dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi else 544719311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R = SourceRange(Args[0]->getLocEnd(), Args[NumArgs - 1]->getLocEnd()); 5448d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 544919311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor R.setBegin(S.PP.getLocForEndOfToken(R.getBegin())); 545019311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor if (Kind.isCStyleOrFunctionalCast()) 545119311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg) 545219311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << R; 545319311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor else 545419311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor S.Diag(Kind.getLocation(), diag::err_excess_initializers) 545519311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor << /*scalar=*/2 << R; 5456d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5457d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor } 5458d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 5459d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_ReferenceBindingToInitList: 5460d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list) 5461d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << DestType.getNonReferenceType() << Args[0]->getSourceRange(); 5462d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5463d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor 5464d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor case FK_InitListBadDestinationType: 5465d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type) 5466d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange(); 5467d87b61f6398bab21176f73818a8d11ca1c3632c8Douglas Gregor break; 5468dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5469cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl case FK_ListConstructorOverloadFailed: 547051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case FK_ConstructorOverloadFailed: { 547151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor SourceRange ArgsRange; 547251c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (NumArgs) 5473dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi ArgsRange = SourceRange(Args[0]->getLocStart(), 547451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor Args[NumArgs - 1]->getLocEnd()); 5475dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5476cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl if (Failure == FK_ListConstructorOverloadFailed) { 5477cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl assert(NumArgs == 1 && "List construction from other than 1 argument."); 5478cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl InitListExpr *InitList = cast<InitListExpr>(Args[0]); 5479cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl Args = InitList->getInits(); 5480cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl NumArgs = InitList->getNumInits(); 5481cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl } 5482cf15cef8447e8b3ae08e81ad25ae9eb443038acfSebastian Redl 548351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // FIXME: Using "DestType" for the entity we're printing is probably 548451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor // bad. 548551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor switch (FailedOverloadResult) { 548651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Ambiguous: 548751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_ambiguous_init) 548851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 5489120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, 5490120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall Args, NumArgs); 549151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 5492dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 549351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_No_Viable_Function: 54949db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Kind.getKind() == InitializationKind::IK_Default && 54959db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor (Entity.getKind() == InitializedEntity::EK_Base || 54969db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor Entity.getKind() == InitializedEntity::EK_Member) && 54979db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 54989db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default initialization of a member or 54999db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // base within a constructor. If no viable function was 55009db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // found, notify the user that she needs to explicitly 55019db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialize this base/member. 55029db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor 55039db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = cast<CXXConstructorDecl>(S.CurContext); 55049db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Base) { 55059db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 55069db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 55079db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 55089db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*base=*/0 55099db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getType(); 55109db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 55119db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor RecordDecl *BaseDecl 55129db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getBaseSpecifier()->getType()->getAs<RecordType>() 55139db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ->getDecl(); 55149db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(BaseDecl->getLocation(), diag::note_previous_decl) 55159db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(BaseDecl); 55169db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 55179db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_missing_default_ctor) 55189db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 55199db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 55209db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*member=*/1 55219db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 55229db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_field_decl); 55239db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 55249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (const RecordType *Record 55259db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor = Entity.getType()->getAs<RecordType>()) 5526dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi S.Diag(Record->getDecl()->getLocation(), 55279db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor diag::note_previous_decl) 55289db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTagDeclType(Record->getDecl()); 55299db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 55309db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor break; 55319db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 55329db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 553351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init) 553451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << DestType << ArgsRange; 5535120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args, NumArgs); 553651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 5537dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 553851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Deleted: { 553951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init) 554051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor << true << DestType << ArgsRange; 554151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor OverloadCandidateSet::iterator Best; 5542120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall OverloadingResult Ovl 5543120d63cd4465230c2cd56508c7cd8e0ad00848e7John McCall = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best); 554451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor if (Ovl == OR_Deleted) { 554551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor S.Diag(Best->Function->getLocation(), diag::note_unavailable_here) 5546f85e193739c953358c865005855253af4f68a497John McCall << 1 << Best->Function->isDeleted(); 554751c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } else { 554851c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Inconsistent overload resolution?"); 554951c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 555051c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor break; 555151c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 5552dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 555351c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor case OR_Success: 555451c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor llvm_unreachable("Conversion did not fail!"); 555551c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 555651c56d6c8a944c2e49dd714db65a780d9f627e15Douglas Gregor } 55579fdefb338ead088dd7a5dd4ff3df807586b26d41David Blaikie break; 5558dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 555999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor case FK_DefaultInitOfConst: 55609db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (Entity.getKind() == InitializedEntity::EK_Member && 55619db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor isa<CXXConstructorDecl>(S.CurContext)) { 55629db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // This is implicit default-initialization of a const member in 55639db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // a constructor. Complain that it needs to be explicitly 55649db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor // initialized. 55659db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext); 55669db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor) 55679db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Constructor->isImplicit() 55689db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << S.Context.getTypeDeclType(Constructor->getParent()) 55699db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << /*const=*/1 55709db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 55719db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl) 55729db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << Entity.getName(); 55739db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 55749db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor S.Diag(Kind.getLocation(), diag::err_default_init_const) 55759db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor << DestType << (bool)DestType->getAs<RecordType>(); 55769db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } 557799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor break; 5578dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 55798713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_Incomplete: 55808713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl S.RequireCompleteType(Kind.getLocation(), DestType, 55818713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl diag::err_init_incomplete_type); 55828713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl break; 55838713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 558414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl case FK_ListInitializationFailed: { 558514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl // Run the init list checker again to emit diagnostics. 558614b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListExpr* InitList = cast<InitListExpr>(Args[0]); 558714b0c194b356a1204d081765b3e6699687bed97cSebastian Redl QualType DestType = Entity.getType(); 558814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl InitListChecker DiagnoseInitList(S, Entity, InitList, 5589c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl DestType, /*VerifyOnly=*/false, 5590168319c81b8f4e7addf36ad15ef24919faf23504Sebastian Redl Kind.getKind() != InitializationKind::IK_DirectList || 5591c223518ebf72e1709dc8938cd9384161ea5ec0bbSebastian Redl !S.getLangOptions().CPlusPlus0x); 559214b0c194b356a1204d081765b3e6699687bed97cSebastian Redl assert(DiagnoseInitList.HadError() && 559314b0c194b356a1204d081765b3e6699687bed97cSebastian Redl "Inconsistent init list check result."); 559414b0c194b356a1204d081765b3e6699687bed97cSebastian Redl break; 559514b0c194b356a1204d081765b3e6699687bed97cSebastian Redl } 55965acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 55975acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: { 55985acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall // FIXME: Already diagnosed! 55995acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 56005acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall } 56012b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 56022b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case FK_InitListElementCopyFailure: { 56032b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // Try to perform all copies again. 56042b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitListExpr* InitList = cast<InitListExpr>(Args[0]); 56052b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl unsigned NumInits = InitList->getNumInits(); 56062b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl QualType DestType = Entity.getType(); 56072b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl QualType E; 56082b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl bool Success = S.isStdInitializerList(DestType, &E); 56092b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl (void)Success; 56102b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl assert(Success && "Where did the std::initializer_list go?"); 56112b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializedEntity HiddenArray = InitializedEntity::InitializeTemporary( 56122b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl S.Context.getConstantArrayType(E, 56132b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()), 56142b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl NumInits), 56152b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ArrayType::Normal, 0)); 56162b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl InitializedEntity Element = InitializedEntity::InitializeElement(S.Context, 56172b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 0, HiddenArray); 56182b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // Show at most 3 errors. Otherwise, you'd get a lot of errors for errors 56192b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // where the init list type is wrong, e.g. 56202b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // std::initializer_list<void*> list = { 1, 2, 3, 4, 5, 6, 7, 8 }; 56212b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl // FIXME: Emit a note if we hit the limit? 56222b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl int ErrorCount = 0; 56232b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl for (unsigned i = 0; i < NumInits && ErrorCount < 3; ++i) { 56242b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl Element.setElementIndex(i); 56252b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ExprResult Init = S.Owned(InitList->getInit(i)); 56262b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl if (S.PerformCopyInitialization(Element, Init.get()->getExprLoc(), Init) 56272b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl .isInvalid()) 56282b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl ++ErrorCount; 56292b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 56302b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl break; 56312b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl } 563220093b4bf698f292c664676987541d5103b65b15Douglas Gregor } 5633dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5634a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor PrintInitLocationNote(S, Entity); 563520093b4bf698f292c664676987541d5103b65b15Douglas Gregor return true; 563620093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 563718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 56385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid InitializationSequence::dump(raw_ostream &OS) const { 5639de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (SequenceKind) { 5640de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FailedSequence: { 5641de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "Failed sequence: "; 5642de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (Failure) { 5643de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForReference: 5644de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for reference"; 5645de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5646dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5647de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitList: 5648de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list"; 5649de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5650dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5651de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ArrayNeedsInitListOrStringLiteral: 5652de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "array requires initializer list or string literal"; 5653de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5654dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5655cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_ArrayTypeMismatch: 5656cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "array type mismatch"; 5657cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 5658cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5659cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case FK_NonConstantArrayInit: 5660cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "non-constant array initializer"; 5661cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 5662cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5663de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_AddressOfOverloadFailed: 5664de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "address of overloaded function failed"; 5665de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5666dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5667de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitOverloadFailed: 5668de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overload resolution for reference initialization failed"; 5669de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5670dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5671de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToTemporary: 5672de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to temporary"; 5673de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5674dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5675de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_NonConstLValueReferenceBindingToUnrelated: 5676de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "non-const lvalue reference bound to unrelated type"; 5677de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5678dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5679de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_RValueReferenceBindingToLValue: 5680de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "rvalue reference bound to an lvalue"; 5681de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5682dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5683de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitDropsQualifiers: 5684de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization drops qualifiers"; 5685de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5686dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5687de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceInitFailed: 5688de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "reference initialization failed"; 5689de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5690dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5691de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConversionFailed: 5692de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "conversion failed"; 5693de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5694dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5695429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley case FK_ConversionFromPropertyFailed: 5696429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley OS << "conversion from property failed"; 5697429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley break; 5698429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley 5699de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_TooManyInitsForScalar: 5700de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "too many initializers for scalar"; 5701de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5702dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5703de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ReferenceBindingToInitList: 5704de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "referencing binding to initializer list"; 5705de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5706dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5707de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_InitListBadDestinationType: 5708de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "initializer list for non-aggregate, non-scalar type"; 5709de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5710dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5711de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_UserConversionOverloadFailed: 5712de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "overloading failed for user-defined conversion"; 5713de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5714dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5715de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_ConstructorOverloadFailed: 5716de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor overloading failed"; 5717de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5718dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5719de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case FK_DefaultInitOfConst: 5720de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "default initialization of a const variable"; 5721de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5722dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 572372a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor case FK_Incomplete: 572472a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor OS << "initialization of incomplete type"; 572572a43bbf6802c8fcfd04dcb2be8eafcb0b8fe29cDouglas Gregor break; 57268713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 57278713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case FK_ListInitializationFailed: 572814b0c194b356a1204d081765b3e6699687bed97cSebastian Redl OS << "list initialization checker failure"; 57295acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 57305acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall 573173076431605556fdbf28d287d084a73a24a8b8d4John McCall case FK_VariableLengthArrayHasInitializer: 573273076431605556fdbf28d287d084a73a24a8b8d4John McCall OS << "variable length array has an initializer"; 573373076431605556fdbf28d287d084a73a24a8b8d4John McCall break; 573473076431605556fdbf28d287d084a73a24a8b8d4John McCall 57355acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall case FK_PlaceholderType: 57365acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall OS << "initializer expression isn't contextually valid"; 57375acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall break; 5738b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky 5739b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky case FK_ListConstructorOverloadFailed: 5740b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky OS << "list constructor overloading failed"; 5741b0c6c33c3479d2cb4c3b9f5a6e58c58d07c731e7Nick Lewycky break; 57422b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 57432b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case FK_InitListElementCopyFailure: 57442b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl OS << "copy construction of initializer list element failed"; 57452b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl break; 5746dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi } 5747de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << '\n'; 5748de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 5749de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 5750dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5751de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case DependentSequence: 57527491c499e826682e128a400038361ebcbde30eecSebastian Redl OS << "Dependent sequence\n"; 5753de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor return; 5754dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 57557491c499e826682e128a400038361ebcbde30eecSebastian Redl case NormalSequence: 57567491c499e826682e128a400038361ebcbde30eecSebastian Redl OS << "Normal sequence: "; 5757de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5758de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 5759dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5760de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) { 5761de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor if (S != step_begin()) { 5762de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << " -> "; 5763de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 5764dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5765de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor switch (S->Kind) { 5766de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ResolveAddressOfOverloadedFunction: 5767de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "resolve address of overloaded function"; 5768de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5769dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5770de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseRValue: 5771de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (rvalue" << S->Type.getAsString() << ")"; 5772de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5773dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5774906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_CastDerivedToBaseXValue: 5775906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "derived-to-base case (xvalue" << S->Type.getAsString() << ")"; 5776906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl break; 5777dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5778de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CastDerivedToBaseLValue: 5779de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "derived-to-base case (lvalue" << S->Type.getAsString() << ")"; 5780de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5781dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5782de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReference: 5783de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to lvalue"; 5784de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5785dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5786de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_BindReferenceToTemporary: 5787de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "bind reference to a temporary"; 5788de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5789dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5790523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor case SK_ExtraneousCopyToTemporary: 5791523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor OS << "extraneous C++03 copy to temporary"; 5792523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor break; 5793523d46af407f32fc53861e6f068e8076d4fe84a8Douglas Gregor 5794de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_UserConversion: 5795b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << "user-defined conversion via " << *S->Function.Function; 5796de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5797906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 5798de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionRValue: 5799de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (rvalue)"; 580013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 5801de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 5802906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl case SK_QualificationConversionXValue: 5803906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl OS << "qualification conversion (xvalue)"; 580413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 5805906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 5806de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_QualificationConversionLValue: 5807de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "qualification conversion (lvalue)"; 5808de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5809dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5810de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConversionSequence: 5811de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "implicit conversion sequence ("; 5812de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor S->ICS->DebugPrint(); // FIXME: use OS 5813de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << ")"; 5814de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5815dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5816de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ListInitialization: 58178713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl OS << "list aggregate initialization"; 58188713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl break; 58198713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl 58208713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl case SK_ListConstructorCall: 58218713d4e874f2adc2928ebfb86c845574a14e3b3eSebastian Redl OS << "list initialization via constructor"; 5822de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5823dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 582413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_UnwrapInitList: 582513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl OS << "unwrap reference initializer list"; 582613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 582713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 582813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl case SK_RewrapInitList: 582913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl OS << "rewrap reference initializer list"; 583013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl break; 583113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 5832de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ConstructorInitialization: 5833de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "constructor initialization"; 5834de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5835dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5836de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_ZeroInitialization: 5837de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "zero initialization"; 5838de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5839dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5840de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_CAssignment: 5841de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "C assignment"; 5842de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5843dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA Takumi 5844de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor case SK_StringInit: 5845de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor OS << "string initialization"; 5846de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 5847569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 5848569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case SK_ObjCObjectConversion: 5849569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor OS << "Objective-C object conversion"; 5850569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor break; 5851cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor 5852cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor case SK_ArrayInit: 5853cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor OS << "array initialization"; 5854cd9ec3b4fb3d042f89aa5b572de7df3ef9ee4a80Douglas Gregor break; 5855f85e193739c953358c865005855253af4f68a497John McCall 5856f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectCopyRestore: 5857f85e193739c953358c865005855253af4f68a497John McCall OS << "pass by indirect copy and restore"; 5858f85e193739c953358c865005855253af4f68a497John McCall break; 5859f85e193739c953358c865005855253af4f68a497John McCall 5860f85e193739c953358c865005855253af4f68a497John McCall case SK_PassByIndirectRestore: 5861f85e193739c953358c865005855253af4f68a497John McCall OS << "pass by indirect restore"; 5862f85e193739c953358c865005855253af4f68a497John McCall break; 5863f85e193739c953358c865005855253af4f68a497John McCall 5864f85e193739c953358c865005855253af4f68a497John McCall case SK_ProduceObjCObject: 5865f85e193739c953358c865005855253af4f68a497John McCall OS << "Objective-C object retension"; 5866f85e193739c953358c865005855253af4f68a497John McCall break; 58672b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl 58682b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl case SK_StdInitializerList: 58692b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl OS << "std::initializer_list from initializer list"; 58702b916b8b55aaf0152ab9ad630c8454bf6373b085Sebastian Redl break; 5871de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 5872de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 5873de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 5874de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 5875de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregorvoid InitializationSequence::dump() const { 5876de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor dump(llvm::errs()); 5877de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor} 5878de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 58794c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smithstatic void DiagnoseNarrowingInInitList(Sema &S, InitializationSequence &Seq, 58804c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith QualType EntityType, 58814c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const Expr *PreInit, 58824c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const Expr *PostInit) { 58834c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith if (Seq.step_begin() == Seq.step_end() || PreInit->isValueDependent()) 58844c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return; 58854c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 58864c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // A narrowing conversion can only appear as the final implicit conversion in 58874c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // an initialization sequence. 58884c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const InitializationSequence::Step &LastStep = Seq.step_end()[-1]; 58894c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith if (LastStep.Kind != InitializationSequence::SK_ConversionSequence) 58904c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return; 58914c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 58924c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const ImplicitConversionSequence &ICS = *LastStep.ICS; 58934c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith const StandardConversionSequence *SCS = 0; 58944c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith switch (ICS.getKind()) { 58954c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::StandardConversion: 58964c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith SCS = &ICS.Standard; 58974c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 58984c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::UserDefinedConversion: 58994c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith SCS = &ICS.UserDefined.After; 59004c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 59014c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::AmbiguousConversion: 59024c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::EllipsisConversion: 59034c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case ImplicitConversionSequence::BadConversion: 59044c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return; 59054c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith } 59064c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 59074c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // Determine the type prior to the narrowing conversion. If a conversion 59084c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // operator was used, this may be different from both the type of the entity 59094c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // and of the pre-initialization expression. 59104c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith QualType PreNarrowingType = PreInit->getType(); 59114c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith if (Seq.step_begin() + 1 != Seq.step_end()) 59124c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith PreNarrowingType = Seq.step_end()[-2].Type; 59134c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 59144c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // C++11 [dcl.init.list]p7: Check whether this is a narrowing conversion. 59154c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith APValue ConstantValue; 59168ef7b203332b0c8d65876a1f5e6d1db4e6f40e4bRichard Smith switch (SCS->getNarrowingKind(S.Context, PostInit, ConstantValue)) { 59174c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Not_Narrowing: 59184c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // No narrowing occurred. 59194c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return; 59204c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 59214c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Type_Narrowing: 59224c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // This was a floating-to-integer conversion, which is always considered a 59234c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // narrowing conversion even if the value is a constant and can be 59244c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // represented exactly as an integer. 59254c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), 5926f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor S.getLangOptions().MicrosoftExt || !S.getLangOptions().CPlusPlus0x? 5927f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::warn_init_list_type_narrowing 5928f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : S.isSFINAEContext()? 5929f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::err_init_list_type_narrowing_sfinae 5930f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : diag::err_init_list_type_narrowing) 59314c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 59324c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PreNarrowingType.getLocalUnqualifiedType() 59334c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << EntityType.getLocalUnqualifiedType(); 59344c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 59354c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 59364c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Constant_Narrowing: 59374c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // A constant value was narrowed. 59384c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), 5939f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor S.getLangOptions().MicrosoftExt || !S.getLangOptions().CPlusPlus0x? 5940f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::warn_init_list_constant_narrowing 5941f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : S.isSFINAEContext()? 5942f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::err_init_list_constant_narrowing_sfinae 5943f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : diag::err_init_list_constant_narrowing) 59444c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 594508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith << ConstantValue.getAsString(S.getASTContext(), EntityType) 59469906149972906e340f512a60f72a8676748f24d8Jeffrey Yasskin << EntityType.getLocalUnqualifiedType(); 59474c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 59484c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 59494c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith case NK_Variable_Narrowing: 59504c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith // A variable's value may have been narrowed. 59514c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), 5952f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor S.getLangOptions().MicrosoftExt || !S.getLangOptions().CPlusPlus0x? 5953f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::warn_init_list_variable_narrowing 5954f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : S.isSFINAEContext()? 5955f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor diag::err_init_list_variable_narrowing_sfinae 5956f3c82c5f5c0321babf054983c29ad84cc90244f7Douglas Gregor : diag::err_init_list_variable_narrowing) 59574c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 59584c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PreNarrowingType.getLocalUnqualifiedType() 59599906149972906e340f512a60f72a8676748f24d8Jeffrey Yasskin << EntityType.getLocalUnqualifiedType(); 59604c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith break; 59614c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith } 5962191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 5963f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> StaticCast; 5964191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin llvm::raw_svector_ostream OS(StaticCast); 5965191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin OS << "static_cast<"; 5966191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin if (const TypedefType *TT = EntityType->getAs<TypedefType>()) { 5967191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // It's important to use the typedef's name if there is one so that the 5968191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // fixit doesn't break code using types like int64_t. 5969191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // 5970191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // FIXME: This will break if the typedef requires qualification. But 5971191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // getQualifiedNameAsString() includes non-machine-parsable components. 5972b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << *TT->getDecl(); 5973191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } else if (const BuiltinType *BT = EntityType->getAs<BuiltinType>()) 5974191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin OS << BT->getName(S.getLangOptions()); 5975191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin else { 5976191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // Oops, we didn't find the actual type of the variable. Don't emit a fixit 5977191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin // with a broken cast. 5978191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin return; 5979191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin } 5980191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin OS << ">("; 59814c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.Diag(PostInit->getLocStart(), diag::note_init_list_narrowing_override) 59824c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << PostInit->getSourceRange() 59834c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith << FixItHint::CreateInsertion(PostInit->getLocStart(), OS.str()) 5984191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin << FixItHint::CreateInsertion( 59854c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith S.getPreprocessor().getLocForEndOfToken(PostInit->getLocEnd()), ")"); 5986191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin} 5987191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 598818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 598918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// Initialization helper functions 599018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor//===----------------------------------------------------------------------===// 59912be7e90b81509204b99b7bbf9753ad17b894a12aSean Huntbool 59922be7e90b81509204b99b7bbf9753ad17b894a12aSean HuntSema::CanPerformCopyInitialization(const InitializedEntity &Entity, 59932be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt ExprResult Init) { 59942be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt if (Init.isInvalid()) 59952be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt return false; 59962be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 59972be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt Expr *InitE = Init.get(); 59982be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt assert(InitE && "No initialization expression"); 59992be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 60002be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt InitializationKind Kind = InitializationKind::CreateCopy(SourceLocation(), 60012be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt SourceLocation()); 60022be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 6003383616cd2e61131a534afd9364ef53f643e1f834Sebastian Redl return !Seq.Failed(); 60042be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt} 60052be7e90b81509204b99b7bbf9753ad17b894a12aSean Hunt 6006dfbb02a16ac8c764b5ba1742450513d6212d2f9fNAKAMURA TakumiExprResult 600718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorSema::PerformCopyInitialization(const InitializedEntity &Entity, 600818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor SourceLocation EqualLoc, 6009191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin ExprResult Init, 6010191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin bool TopLevelOfInitList) { 601118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (Init.isInvalid()) 601218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return ExprError(); 601318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 601415d7d12226f83de24f96f4bf4e27ebba30fef51eJohn McCall Expr *InitE = Init.get(); 601518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor assert(InitE && "No initialization expression?"); 601618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 601718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor if (EqualLoc.isInvalid()) 601818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc = InitE->getLocStart(); 601918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 602018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationKind Kind = InitializationKind::CreateCopy(InitE->getLocStart(), 602118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor EqualLoc); 602218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor InitializationSequence Seq(*this, Entity, Kind, &InitE, 1); 602318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor Init.release(); 6024191591336f639dad1504e863733fb831645c1644Jeffrey Yasskin 60254c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith ExprResult Result = Seq.Perform(*this, Entity, Kind, MultiExprArg(&InitE, 1)); 60264c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 60274c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith if (!Result.isInvalid() && TopLevelOfInitList) 60284c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith DiagnoseNarrowingInInitList(*this, Seq, Entity.getType(), 60294c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith InitE, Result.get()); 60304c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith 60314c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith return Result; 603218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 6033