SemaType.cpp revision f8d49f64ef6ab7e632717a31631fc289aab69428
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- SemaType.cpp - Semantic Analysis for Types -----------------------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements type-related semantic analysis. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "Sema.h" 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h" 16980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/DeclObjC.h" 17e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h" 18e4858a65a93fb36c099d8dd2ea0a98e33e77687eDaniel Dunbar#include "clang/Basic/Diagnostic.h" 19e4858a65a93fb36c099d8dd2ea0a98e33e77687eDaniel Dunbar#include "clang/Parse/DeclSpec.h" 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ConvertDeclSpecToType - Convert the specified declspec to the appropriate 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// type object. This returns null on error. 24fca0ddd42965e0b7ae821213486d4e0dd71fb439Chris LattnerQualType Sema::ConvertDeclSpecToType(const DeclSpec &DS) { 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // FIXME: Should move the logic from DeclSpec::Finish to here for validity 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // checking. 27958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner QualType Result; 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (DS.getTypeSpecType()) { 30d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner default: assert(0 && "Unknown TypeSpecType!"); 3196b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner case DeclSpec::TST_void: 3296b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner Result = Context.VoidTy; 3396b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner break; 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_char: 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified) 36fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner Result = Context.CharTy; 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed) 38fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner Result = Context.SignedCharTy; 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else { 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned && 415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer "Unknown TSS value"); 42fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner Result = Context.UnsignedCharTy; 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 44958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner break; 4564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis case DeclSpec::TST_wchar: 4664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified) 4764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis Result = Context.WCharTy; 4864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed) { 49f3a41af4d5c98a72a1d6720bbbfd658e57ef2541Chris Lattner Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec) 50f3a41af4d5c98a72a1d6720bbbfd658e57ef2541Chris Lattner << DS.getSpecifierName(DS.getTypeSpecType()); 5164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis Result = Context.getSignedWCharType(); 5264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis } else { 5364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned && 5464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis "Unknown TSS value"); 55f3a41af4d5c98a72a1d6720bbbfd658e57ef2541Chris Lattner Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec) 56f3a41af4d5c98a72a1d6720bbbfd658e57ef2541Chris Lattner << DS.getSpecifierName(DS.getTypeSpecType()); 5764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis Result = Context.getUnsignedWCharType(); 5864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis } 5964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis break; 60d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner case DeclSpec::TST_unspecified: 6162f5f7ffad57e0c2af2b308af3735351505937cbChris Lattner // "<proto1,proto2>" is an objc qualified ID with a missing id. 62097e916b617bb4a069a03764024c310ed42a6424Chris Lattner if (DeclSpec::ProtocolQualifierListTy PQ = DS.getProtocolQualifiers()) { 63ae4da6150bb837311a2f0f958b01a2989066ba90Chris Lattner Result = Context.getObjCQualifiedIdType((ObjCProtocolDecl**)PQ, 6462f5f7ffad57e0c2af2b308af3735351505937cbChris Lattner DS.getNumProtocolQualifiers()); 6562f5f7ffad57e0c2af2b308af3735351505937cbChris Lattner break; 6662f5f7ffad57e0c2af2b308af3735351505937cbChris Lattner } 6762f5f7ffad57e0c2af2b308af3735351505937cbChris Lattner 68d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // Unspecified typespec defaults to int in C90. However, the C90 grammar 69d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // [C90 6.5] only allows a decl-spec if there was *some* type-specifier, 70d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // type-qualifier, or storage-class-specifier. If not, emit an extwarn. 71d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // Note that the one exception to this is function definitions, which are 72d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // allowed to be completely missing a declspec. This is handled in the 73d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // parser already though by it pretending to have seen an 'int' in this 74d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // case. 75d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner if (getLangOptions().ImplicitInt) { 76d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner if ((DS.getParsedSpecifiers() & (DeclSpec::PQ_StorageClassSpecifier | 77d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner DeclSpec::PQ_TypeSpecifier | 78d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner DeclSpec::PQ_TypeQualifier)) == 0) 79d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner Diag(DS.getSourceRange().getBegin(), diag::ext_missing_declspec); 80d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner } else { 81d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // C99 and C++ require a type specifier. For example, C99 6.7.2p2 says: 82d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // "At least one type specifier shall be given in the declaration 83d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // specifiers in each declaration, and in the specifier-qualifier list in 84d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // each struct declaration and type name." 85d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner if (!DS.hasTypeSpecifier()) 86d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner Diag(DS.getSourceRange().getBegin(), diag::ext_missing_type_specifier); 87d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner } 88d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner 89d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner // FALL THROUGH. 903cbc38bd3569d37f53bd76fa89d24803f48f5036Chris Lattner case DeclSpec::TST_int: { 915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (DS.getTypeSpecSign() != DeclSpec::TSS_unsigned) { 925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (DS.getTypeSpecWidth()) { 93fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner case DeclSpec::TSW_unspecified: Result = Context.IntTy; break; 94fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner case DeclSpec::TSW_short: Result = Context.ShortTy; break; 95fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner case DeclSpec::TSW_long: Result = Context.LongTy; break; 96fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner case DeclSpec::TSW_longlong: Result = Context.LongLongTy; break; 975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (DS.getTypeSpecWidth()) { 100fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner case DeclSpec::TSW_unspecified: Result = Context.UnsignedIntTy; break; 101fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner case DeclSpec::TSW_short: Result = Context.UnsignedShortTy; break; 102fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner case DeclSpec::TSW_long: Result = Context.UnsignedLongTy; break; 103fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner case DeclSpec::TSW_longlong: Result =Context.UnsignedLongLongTy; break; 1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 106958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner break; 1073cbc38bd3569d37f53bd76fa89d24803f48f5036Chris Lattner } 108fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner case DeclSpec::TST_float: Result = Context.FloatTy; break; 109958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner case DeclSpec::TST_double: 110958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner if (DS.getTypeSpecWidth() == DeclSpec::TSW_long) 111fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner Result = Context.LongDoubleTy; 112958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner else 113fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner Result = Context.DoubleTy; 114958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner break; 115fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner case DeclSpec::TST_bool: Result = Context.BoolTy; break; // _Bool or bool 1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_decimal32: // _Decimal32 1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_decimal64: // _Decimal64 1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_decimal128: // _Decimal128 1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(0 && "FIXME: GNU decimal extensions not supported yet!"); 12099dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner case DeclSpec::TST_class: 1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_enum: 1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_union: 1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_struct: { 1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Decl *D = static_cast<Decl *>(DS.getTypeRep()); 12599dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner assert(D && "Didn't get a decl for a class/enum/union/struct?"); 1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 && 1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DS.getTypeSpecSign() == 0 && 1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer "Can't handle qualifiers on typedef names yet!"); 1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // TypeQuals handled by caller. 1302ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor Result = Context.getTypeDeclType(cast<TypeDecl>(D)); 131958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner break; 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_typedef: { 1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Decl *D = static_cast<Decl *>(DS.getTypeRep()); 1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(D && "Didn't get a decl for a typedef?"); 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 && 1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DS.getTypeSpecSign() == 0 && 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer "Can't handle qualifiers on typedef names yet!"); 139ae4da6150bb837311a2f0f958b01a2989066ba90Chris Lattner DeclSpec::ProtocolQualifierListTy PQ = DS.getProtocolQualifiers(); 1402ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor 1413536b443bc50d58a79f14fca9b6842541a434854Steve Naroff // FIXME: Adding a TST_objcInterface clause doesn't seem ideal, so 1423536b443bc50d58a79f14fca9b6842541a434854Steve Naroff // we have this "hack" for now... 143a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek if (ObjCInterfaceDecl *ObjCIntDecl = dyn_cast<ObjCInterfaceDecl>(D)) { 144ae4da6150bb837311a2f0f958b01a2989066ba90Chris Lattner if (PQ == 0) { 145fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner Result = Context.getObjCInterfaceType(ObjCIntDecl); 146958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner break; 147958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner } 1484b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian 149fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner Result = Context.getObjCQualifiedInterfaceType(ObjCIntDecl, 150ae4da6150bb837311a2f0f958b01a2989066ba90Chris Lattner (ObjCProtocolDecl**)PQ, 1517654914fc5c6e2683d9e7358a64b3b53f368a8fcChris Lattner DS.getNumProtocolQualifiers()); 152958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner break; 15362f5f7ffad57e0c2af2b308af3735351505937cbChris Lattner } else if (TypedefDecl *typeDecl = dyn_cast<TypedefDecl>(D)) { 154ae4da6150bb837311a2f0f958b01a2989066ba90Chris Lattner if (Context.getObjCIdType() == Context.getTypedefType(typeDecl) && PQ) { 155ae4da6150bb837311a2f0f958b01a2989066ba90Chris Lattner // id<protocol-list> 156ae4da6150bb837311a2f0f958b01a2989066ba90Chris Lattner Result = Context.getObjCQualifiedIdType((ObjCProtocolDecl**)PQ, 157ae4da6150bb837311a2f0f958b01a2989066ba90Chris Lattner DS.getNumProtocolQualifiers()); 158958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner break; 159c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian } 160c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian } 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // TypeQuals handled by caller. 1622ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor Result = Context.getTypeDeclType(dyn_cast<TypeDecl>(D)); 163958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner break; 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 165958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner case DeclSpec::TST_typeofType: 166958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner Result = QualType::getFromOpaquePtr(DS.getTypeRep()); 167958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner assert(!Result.isNull() && "Didn't get a type for typeof?"); 168d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff // TypeQuals handled by caller. 169fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner Result = Context.getTypeOfType(Result); 170958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner break; 171d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff case DeclSpec::TST_typeofExpr: { 172d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff Expr *E = static_cast<Expr *>(DS.getTypeRep()); 173d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff assert(E && "Didn't get an expression for typeof?"); 174d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff // TypeQuals handled by caller. 175fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner Result = Context.getTypeOfExpr(E); 176958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner break; 177d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff } 1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 179958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner 180958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner // Handle complex types. 181958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner if (DS.getTypeSpecComplex() == DeclSpec::TSC_complex) 182fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner Result = Context.getComplexType(Result); 183958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner 184958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner assert(DS.getTypeSpecComplex() != DeclSpec::TSC_imaginary && 185958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner "FIXME: imaginary types not supported yet!"); 186958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner 18738d8b98803ac354dba15578d65ea99a83dead046Chris Lattner // See if there are any attributes on the declspec that apply to the type (as 18838d8b98803ac354dba15578d65ea99a83dead046Chris Lattner // opposed to the decl). 189fca0ddd42965e0b7ae821213486d4e0dd71fb439Chris Lattner if (const AttributeList *AL = DS.getAttributes()) 190c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner ProcessTypeAttributeList(Result, AL); 191f1d705c3e2276f7f5b97b8b3394b9b3068fdf25bChris Lattner 19296b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // Apply const/volatile/restrict qualifiers to T. 19396b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner if (unsigned TypeQuals = DS.getTypeQualifiers()) { 19496b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner 19596b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // Enforce C99 6.7.3p2: "Types other than pointer types derived from object 19696b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // or incomplete types shall not be restrict-qualified." C++ also allows 19796b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // restrict-qualified references. 19896b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner if (TypeQuals & QualType::Restrict) { 199bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner if (const PointerLikeType *PT = Result->getAsPointerLikeType()) { 200bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner QualType EltTy = PT->getPointeeType(); 201bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner 202bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner // If we have a pointer or reference, the pointee must have an object or 203bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner // incomplete type. 204bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner if (!EltTy->isIncompleteOrObjectType()) { 205bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner Diag(DS.getRestrictSpecLoc(), 206d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner diag::err_typecheck_invalid_restrict_invalid_pointee) 207d162584991885ab004a02573a73ce06422b921fcChris Lattner << EltTy << DS.getSourceRange(); 208bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner TypeQuals &= ~QualType::Restrict; // Remove the restrict qualifier. 209bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner } 210bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner } else { 21196b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner Diag(DS.getRestrictSpecLoc(), 212d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner diag::err_typecheck_invalid_restrict_not_pointer) 213d162584991885ab004a02573a73ce06422b921fcChris Lattner << Result << DS.getSourceRange(); 214bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner TypeQuals &= ~QualType::Restrict; // Remove the restrict qualifier. 21596b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner } 21696b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner } 21796b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner 21896b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // Warn about CV qualifiers on functions: C99 6.7.3p8: "If the specification 21996b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // of a function type includes any type qualifiers, the behavior is 22096b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // undefined." 22196b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner if (Result->isFunctionType() && TypeQuals) { 22296b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // Get some location to point at, either the C or V location. 22396b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner SourceLocation Loc; 22496b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner if (TypeQuals & QualType::Const) 22596b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner Loc = DS.getConstSpecLoc(); 22696b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner else { 22796b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner assert((TypeQuals & QualType::Volatile) && 22896b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner "Has CV quals but not C or V?"); 22996b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner Loc = DS.getVolatileSpecLoc(); 23096b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner } 231d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner Diag(Loc, diag::warn_typecheck_function_qualifiers) 232d162584991885ab004a02573a73ce06422b921fcChris Lattner << Result << DS.getSourceRange(); 23396b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner } 23496b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner 235f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // C++ [dcl.ref]p1: 236f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // Cv-qualified references are ill-formed except when the 237f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // cv-qualifiers are introduced through the use of a typedef 238f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // (7.1.3) or of a template type argument (14.3), in which 239f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // case the cv-qualifiers are ignored. 240f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor if (DS.getTypeSpecType() == DeclSpec::TST_typedef && 241f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor TypeQuals && Result->isReferenceType()) { 242f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor TypeQuals &= ~QualType::Const; 243f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor TypeQuals &= ~QualType::Volatile; 244f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor } 245f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor 24696b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner Result = Result.getQualifiedType(TypeQuals); 24796b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner } 248f1d705c3e2276f7f5b97b8b3394b9b3068fdf25bChris Lattner return Result; 249f1d705c3e2276f7f5b97b8b3394b9b3068fdf25bChris Lattner} 250f1d705c3e2276f7f5b97b8b3394b9b3068fdf25bChris Lattner 2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// GetTypeForDeclarator - Convert the type for the specified declarator to Type 252cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl/// instances. Skip the outermost Skip type objects. 253cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian RedlQualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S, unsigned Skip) { 254b23deda7333cfc2316c989d10745c145dfbea6d6Chris Lattner // long long is a C99 feature. 255d1eb332181f02a7e0a6f9749265e6a0f55555cd4Chris Lattner if (!getLangOptions().C99 && !getLangOptions().CPlusPlus0x && 256b23deda7333cfc2316c989d10745c145dfbea6d6Chris Lattner D.getDeclSpec().getTypeSpecWidth() == DeclSpec::TSW_longlong) 257b23deda7333cfc2316c989d10745c145dfbea6d6Chris Lattner Diag(D.getDeclSpec().getTypeSpecWidthLoc(), diag::ext_longlong); 258b23deda7333cfc2316c989d10745c145dfbea6d6Chris Lattner 259fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner QualType T = ConvertDeclSpecToType(D.getDeclSpec()); 2604c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Walk the DeclTypeInfo, building the recursive type as we go. DeclTypeInfos 2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // are ordered from the identifier out, which is opposite of what we want :). 263cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl for (unsigned i = Skip, e = D.getNumTypeObjects(); i != e; ++i) { 264cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl DeclaratorChunk &DeclType = D.getTypeObject(e-i-1+Skip); 2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (DeclType.Kind) { 2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: assert(0 && "Unknown decltype!"); 2675618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff case DeclaratorChunk::BlockPointer: 2685618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff if (DeclType.Cls.TypeQuals) 2695618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff Diag(D.getIdentifierLoc(), diag::err_qualified_block_pointer_type); 2705618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff if (!T.getTypePtr()->isFunctionType()) 2715618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff Diag(D.getIdentifierLoc(), diag::err_nonfunction_block_type); 2725618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff else 2735618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff T = Context.getBlockPointerType(T); 2745618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff break; 2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclaratorChunk::Pointer: 27602c642e8f40562fcc9d440977f232c021b9d4353Chris Lattner if (T->isReferenceType()) { 2775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C++ 8.3.2p4: There shall be no ... pointers to references ... 278d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner Diag(DeclType.Loc, diag::err_illegal_decl_pointer_to_reference) 279d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name"); 280e1223f7246c2c297f7b62816fd8c6a0a14151977Steve Naroff D.setInvalidType(true); 2815265af5b555f703be365dbc32c4e518fe38d4d9aChris Lattner T = Context.IntTy; 2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 28496b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // Enforce C99 6.7.3p2: "Types other than pointer types derived from 28596b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // object or incomplete types shall not be restrict-qualified." 28696b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner if ((DeclType.Ptr.TypeQuals & QualType::Restrict) && 287d805bec0fbb98aa10abbb41bfdcb2e2fab1bac96Chris Lattner !T->isIncompleteOrObjectType()) { 288d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner Diag(DeclType.Loc, diag::err_typecheck_invalid_restrict_invalid_pointee) 289d162584991885ab004a02573a73ce06422b921fcChris Lattner << T; 29096b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner DeclType.Ptr.TypeQuals &= QualType::Restrict; 29196b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner } 29296b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner 2935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Apply the pointer typequals to the pointer object. 2945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer T = Context.getPointerType(T).getQualifiedType(DeclType.Ptr.TypeQuals); 2955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer break; 296f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor case DeclaratorChunk::Reference: { 297f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // Whether we should suppress the creation of the reference. 298f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor bool SuppressReference = false; 299f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor if (T->isReferenceType()) { 300f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // C++ [dcl.ref]p4: There shall be no references to references. 301f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // 302f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // According to C++ DR 106, references to references are only 303f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // diagnosed when they are written directly (e.g., "int & &"), 304f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // but not when they happen via a typedef: 305f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // 306f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // typedef int& intref; 307f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // typedef intref& intref2; 308f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // 309f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // Parser::ParserDeclaratorInternal diagnoses the case where 310f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // references are written directly; here, we handle the 311f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // collapsing of references-to-references as described in C++ 312f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // DR 106 and amended by C++ DR 540. 313f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor SuppressReference = true; 314f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor } 315f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor 316f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // C++ [dcl.ref]p1: 317f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // A declarator that specifies the type “reference to cv void” 318f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor // is ill-formed. 319f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor if (T->isVoidType()) { 320f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor Diag(DeclType.Loc, diag::err_reference_to_void); 321e1223f7246c2c297f7b62816fd8c6a0a14151977Steve Naroff D.setInvalidType(true); 322f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor T = Context.IntTy; 3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 32596b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // Enforce C99 6.7.3p2: "Types other than pointer types derived from 32696b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // object or incomplete types shall not be restrict-qualified." 32796b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner if (DeclType.Ref.HasRestrict && 328d805bec0fbb98aa10abbb41bfdcb2e2fab1bac96Chris Lattner !T->isIncompleteOrObjectType()) { 329d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner Diag(DeclType.Loc, diag::err_typecheck_invalid_restrict_invalid_pointee) 330d162584991885ab004a02573a73ce06422b921fcChris Lattner << T; 33196b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner DeclType.Ref.HasRestrict = false; 33296b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner } 33396b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner 334f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor if (!SuppressReference) 335f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor T = Context.getReferenceType(T); 33696b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner 33796b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner // Handle restrict on references. 33896b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner if (DeclType.Ref.HasRestrict) 33996b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner T.addRestrict(); 3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer break; 341f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor } 3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclaratorChunk::Array: { 343fd89bc825026e44c68a68db72d4012fd6752e70fChris Lattner DeclaratorChunk::ArrayTypeInfo &ATI = DeclType.Arr; 34494f81fd0b0f81a99d215b225c8c5616295b063f6Chris Lattner Expr *ArraySize = static_cast<Expr*>(ATI.NumElts); 3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ArrayType::ArraySizeModifier ASM; 3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (ATI.isStar) 3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ASM = ArrayType::Star; 3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else if (ATI.hasStatic) 3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ASM = ArrayType::Static; 3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ASM = ArrayType::Normal; 3525265af5b555f703be365dbc32c4e518fe38d4d9aChris Lattner 3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.7.5.2p1: If the element type is an incomplete or function type, 3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // reject it (e.g. void ary[7], struct foo ary[7], void ary[7]()) 3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (T->isIncompleteType()) { 356d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner Diag(D.getIdentifierLoc(), diag::err_illegal_decl_array_incomplete_type) 357d162584991885ab004a02573a73ce06422b921fcChris Lattner << T; 358e1223f7246c2c297f7b62816fd8c6a0a14151977Steve Naroff T = Context.IntTy; 359e1223f7246c2c297f7b62816fd8c6a0a14151977Steve Naroff D.setInvalidType(true); 3605265af5b555f703be365dbc32c4e518fe38d4d9aChris Lattner } else if (T->isFunctionType()) { 361d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner Diag(D.getIdentifierLoc(), diag::err_illegal_decl_array_of_functions) 362d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name"); 363e1223f7246c2c297f7b62816fd8c6a0a14151977Steve Naroff T = Context.getPointerType(T); 364e1223f7246c2c297f7b62816fd8c6a0a14151977Steve Naroff D.setInvalidType(true); 365a1d9fdea79ba7bbd71862b9f9f78f5f117331fc7Chris Lattner } else if (const ReferenceType *RT = T->getAsReferenceType()) { 3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C++ 8.3.2p4: There shall be no ... arrays of references ... 367d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner Diag(D.getIdentifierLoc(), diag::err_illegal_decl_array_of_references) 368d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name"); 369bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner T = RT->getPointeeType(); 370e1223f7246c2c297f7b62816fd8c6a0a14151977Steve Naroff D.setInvalidType(true); 37102c642e8f40562fcc9d440977f232c021b9d4353Chris Lattner } else if (const RecordType *EltTy = T->getAsRecordType()) { 3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the element type is a struct or union that contains a variadic 3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // array, reject it: C99 6.7.2.1p2. 3745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (EltTy->getDecl()->hasFlexibleArrayMember()) { 375d162584991885ab004a02573a73ce06422b921fcChris Lattner Diag(DeclType.Loc, diag::err_flexible_array_in_array) << T; 376e1223f7246c2c297f7b62816fd8c6a0a14151977Steve Naroff T = Context.IntTy; 377e1223f7246c2c297f7b62816fd8c6a0a14151977Steve Naroff D.setInvalidType(true); 3785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 37943477ca46792311640cf29b7cff731e29bebb146Chris Lattner } else if (T->isObjCInterfaceType()) { 380d162584991885ab004a02573a73ce06422b921fcChris Lattner Diag(DeclType.Loc, diag::warn_objc_array_of_interfaces) << T; 3815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 38243477ca46792311640cf29b7cff731e29bebb146Chris Lattner 38342471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff // C99 6.7.5.2p1: The size expression shall have integer type. 38442471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff if (ArraySize && !ArraySize->getType()->isIntegerType()) { 385d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner Diag(ArraySize->getLocStart(), diag::err_array_size_non_int) 386d162584991885ab004a02573a73ce06422b921fcChris Lattner << ArraySize->getType() << ArraySize->getSourceRange(); 38742471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff D.setInvalidType(true); 388fd89bc825026e44c68a68db72d4012fd6752e70fChris Lattner delete ArraySize; 389fd89bc825026e44c68a68db72d4012fd6752e70fChris Lattner ATI.NumElts = ArraySize = 0; 39042471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff } 391c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff llvm::APSInt ConstVal(32); 392c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman if (!ArraySize) { 393c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman T = Context.getIncompleteArrayType(T, ASM, ATI.TypeQuals); 394898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor } else if (ArraySize->isValueDependent()) { 395898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor T = Context.getDependentSizedArrayType(T, ArraySize, ASM, ATI.TypeQuals); 39637148aabe7d153ce682b5715a820a11c0bbfcd59Eli Friedman } else if (!ArraySize->isIntegerConstantExpr(ConstVal, Context) || 397cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl !T->isConstantSizeType()) { 39837148aabe7d153ce682b5715a820a11c0bbfcd59Eli Friedman // Per C99, a variable array is an array with either a non-constant 39937148aabe7d153ce682b5715a820a11c0bbfcd59Eli Friedman // size or an element type that has a non-constant-size 400c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff T = Context.getVariableArrayType(T, ArraySize, ASM, ATI.TypeQuals); 401c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman } else { 40242471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff // C99 6.7.5.2p1: If the expression is a constant expression, it shall 40342471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff // have a value greater than zero. 40442471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff if (ConstVal.isSigned()) { 40542471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff if (ConstVal.isNegative()) { 406dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner Diag(ArraySize->getLocStart(), 407dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner diag::err_typecheck_negative_array_size) 408dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << ArraySize->getSourceRange(); 40942471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff D.setInvalidType(true); 41042471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff } else if (ConstVal == 0) { 41142471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff // GCC accepts zero sized static arrays. 412dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner Diag(ArraySize->getLocStart(), diag::ext_typecheck_zero_array_size) 413dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << ArraySize->getSourceRange(); 41442471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff } 41542471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff } 416c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff T = Context.getConstantArrayType(T, ConstVal, ASM, ATI.TypeQuals); 41742471f8bc6c1179a54941fac3c483ec1bd319436Steve Naroff } 41894f81fd0b0f81a99d215b225c8c5616295b063f6Chris Lattner // If this is not C99, extwarn about VLA's and C99 array size modifiers. 419a1fcbadf4f930c22bb171fb90ed886f5f359d010Chris Lattner if (!getLangOptions().C99) { 420a1fcbadf4f930c22bb171fb90ed886f5f359d010Chris Lattner if (ArraySize && !ArraySize->isValueDependent() && 421a1fcbadf4f930c22bb171fb90ed886f5f359d010Chris Lattner !ArraySize->isIntegerConstantExpr(Context)) 422a1fcbadf4f930c22bb171fb90ed886f5f359d010Chris Lattner Diag(D.getIdentifierLoc(), diag::ext_vla); 423a1fcbadf4f930c22bb171fb90ed886f5f359d010Chris Lattner else if (ASM != ArrayType::Normal || ATI.TypeQuals != 0) 424a1fcbadf4f930c22bb171fb90ed886f5f359d010Chris Lattner Diag(D.getIdentifierLoc(), diag::ext_c99_array_usage); 425a1fcbadf4f930c22bb171fb90ed886f5f359d010Chris Lattner } 4265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer break; 4275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclaratorChunk::Function: 4295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the function declarator has a prototype (i.e. it is not () and 4305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // does not have a K&R-style identifier list), then the arguments are part 4315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // of the type, otherwise the argument list is (). 4325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const DeclaratorChunk::FunctionTypeInfo &FTI = DeclType.Fun; 43368cfd49ea35d9101da9e6d4d5642263c9e95f1a4Chris Lattner 434cd8812948bc8a65dcf10c541c1775e5ba44def6cChris Lattner // C99 6.7.5.3p1: The return type may not be a function or array type. 43568cfd49ea35d9101da9e6d4d5642263c9e95f1a4Chris Lattner if (T->isArrayType() || T->isFunctionType()) { 436d162584991885ab004a02573a73ce06422b921fcChris Lattner Diag(DeclType.Loc, diag::err_func_returning_array_function) << T; 437cd8812948bc8a65dcf10c541c1775e5ba44def6cChris Lattner T = Context.IntTy; 438cd8812948bc8a65dcf10c541c1775e5ba44def6cChris Lattner D.setInvalidType(true); 439cd8812948bc8a65dcf10c541c1775e5ba44def6cChris Lattner } 440cd8812948bc8a65dcf10c541c1775e5ba44def6cChris Lattner 441eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman if (FTI.NumArgs == 0) { 442c6f7345e44e079f373d6bdecaa06c7e06574dc27Argyrios Kyrtzidis if (getLangOptions().CPlusPlus) { 443c6f7345e44e079f373d6bdecaa06c7e06574dc27Argyrios Kyrtzidis // C++ 8.3.5p2: If the parameter-declaration-clause is empty, the 444c6f7345e44e079f373d6bdecaa06c7e06574dc27Argyrios Kyrtzidis // function takes no arguments. 445971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis T = Context.getFunctionType(T, NULL, 0, FTI.isVariadic,FTI.TypeQuals); 446c6f7345e44e079f373d6bdecaa06c7e06574dc27Argyrios Kyrtzidis } else { 447c6f7345e44e079f373d6bdecaa06c7e06574dc27Argyrios Kyrtzidis // Simple void foo(), where the incoming T is the result type. 448c6f7345e44e079f373d6bdecaa06c7e06574dc27Argyrios Kyrtzidis T = Context.getFunctionTypeNoProto(T); 449c6f7345e44e079f373d6bdecaa06c7e06574dc27Argyrios Kyrtzidis } 450eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman } else if (FTI.ArgInfo[0].Param == 0) { 4515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.7.5.3p3: Reject int(x,y,z) when it's not a function definition. 452eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman Diag(FTI.ArgInfo[0].IdentLoc, diag::err_ident_list_in_fn_declaration); 4535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 4545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Otherwise, we have a function with an argument list that is 4555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // potentially variadic. 4565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::SmallVector<QualType, 16> ArgTys; 4575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) { 4598123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner ParmVarDecl *Param = (ParmVarDecl *)FTI.ArgInfo[i].Param; 4608123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner QualType ArgTy = Param->getType(); 46178c75fb3d275079c5fab30eeb33077958f2b0265Chris Lattner assert(!ArgTy.isNull() && "Couldn't parse type?"); 46208d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // 46308d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // Perform the default function/array conversion (C99 6.7.5.3p[7,8]). 46408d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // This matches the conversion that is done in 465bff5f5cfd194c3cc096ba89360fb537814a9666aNate Begeman // Sema::ActOnParamDeclarator(). Without this conversion, the 46608d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // argument type in the function prototype *will not* match the 46708d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // type in ParmVarDecl (which makes the code generator unhappy). 46808d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // 46908d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // FIXME: We still apparently need the conversion in 470e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner // Sema::ActOnParamDeclarator(). This doesn't make any sense, since 47108d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // it should be driving off the type being created here. 47208d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // 47308d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // FIXME: If a source translation tool needs to see the original type, 47408d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // then we need to consider storing both types somewhere... 47508d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff // 476e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner if (ArgTy->isArrayType()) { 477e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner ArgTy = Context.getArrayDecayedType(ArgTy); 478529bd02affa96a311dd9ab131f2ab4d833017fb7Chris Lattner } else if (ArgTy->isFunctionType()) 47908d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff ArgTy = Context.getPointerType(ArgTy); 480e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 4815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Look for 'void'. void is allowed only as a single argument to a 4825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // function with no other parameters (C99 6.7.5.3p10). We record 4835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // int(void) as a FunctionTypeProto with an empty argument list. 48408d51393bfa55a0b7d99db2b2a59f1df7d3f4f68Steve Naroff else if (ArgTy->isVoidType()) { 4855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this is something like 'float(int, void)', reject it. 'void' 4865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // is an incomplete type (C99 6.2.5p19) and function decls cannot 4875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // have arguments of incomplete type. 4885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (FTI.NumArgs != 1 || FTI.isVariadic) { 4895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Diag(DeclType.Loc, diag::err_void_only_param); 4902ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner ArgTy = Context.IntTy; 4918123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner Param->setType(ArgTy); 4922ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner } else if (FTI.ArgInfo[i].Ident) { 4932ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner // Reject, but continue to parse 'int(void abc)'. 4945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Diag(FTI.ArgInfo[i].IdentLoc, 4954565d4e83cec55356fe9c75929579eacced9da36Chris Lattner diag::err_param_with_void_type); 4962ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner ArgTy = Context.IntTy; 4978123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner Param->setType(ArgTy); 4982ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner } else { 4992ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner // Reject, but continue to parse 'float(const void)'. 500f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner if (ArgTy.getCVRQualifiers()) 5012ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner Diag(DeclType.Loc, diag::err_void_param_qualified); 5022ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner 5032ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner // Do not add 'void' to the ArgTys list. 5042ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner break; 5052ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner } 506eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman } else if (!FTI.hasPrototype) { 507eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman if (ArgTy->isPromotableIntegerType()) { 508eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman ArgTy = Context.IntTy; 509eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman } else if (const BuiltinType* BTy = ArgTy->getAsBuiltinType()) { 510eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman if (BTy->getKind() == BuiltinType::Float) 511eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman ArgTy = Context.DoubleTy; 512eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman } 5135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ArgTys.push_back(ArgTy); 5165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer T = Context.getFunctionType(T, &ArgTys[0], ArgTys.size(), 518971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis FTI.isVariadic, FTI.TypeQuals); 5195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer break; 5215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 522c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner 523c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner // See if there are any attributes on this declarator chunk. 524c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner if (const AttributeList *AL = DeclType.getAttrs()) 525c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner ProcessTypeAttributeList(T, AL); 5265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 527971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis 528971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis if (getLangOptions().CPlusPlus && T->isFunctionType()) { 529971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis const FunctionTypeProto *FnTy = T->getAsFunctionTypeProto(); 530971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis assert(FnTy && "Why oh why is there not a FunctionTypeProto here ?"); 531971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis 532971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis // C++ 8.3.5p4: A cv-qualifier-seq shall only be part of the function type 533971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis // for a nonstatic member function, the function type to which a pointer 534971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis // to member refers, or the top-level function type of a function typedef 535971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis // declaration. 536971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis if (FnTy->getTypeQuals() != 0 && 537971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef && 538584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor ((D.getContext() != Declarator::MemberContext && 539584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor (!D.getCXXScopeSpec().isSet() || 540584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor !static_cast<DeclContext*>(D.getCXXScopeSpec().getScopeRep()) 541bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor ->isRecord())) || 542971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static)) { 543971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis if (D.isFunctionDeclarator()) 544971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_function_type); 545971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis else 546971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis Diag(D.getIdentifierLoc(), 547971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis diag::err_invalid_qualified_typedef_function_type_use); 548971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis 549971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis // Strip the cv-quals from the type. 550971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis T = Context.getFunctionType(FnTy->getResultType(), FnTy->arg_type_begin(), 5517fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis FnTy->getNumArgs(), FnTy->isVariadic(), 0); 552971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis } 553971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis } 5545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5550bf29ad534c381087e89efadbf7aff0579bf259fChris Lattner // If there were any type attributes applied to the decl itself (not the 5560bf29ad534c381087e89efadbf7aff0579bf259fChris Lattner // type, apply the type attribute to the type!) 5570bf29ad534c381087e89efadbf7aff0579bf259fChris Lattner if (const AttributeList *Attrs = D.getAttributes()) 558c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner ProcessTypeAttributeList(T, Attrs); 5590bf29ad534c381087e89efadbf7aff0579bf259fChris Lattner 5605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return T; 5615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 563a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// ObjCGetTypeForMethodDefinition - Builds the type for a method definition 564360300ca2ee298d585d29baf006519507d968812Fariborz Jahanian/// declarator 565a526c5c67e5a0473c340903ee542ce570119665fTed KremenekQualType Sema::ObjCGetTypeForMethodDefinition(DeclTy *D) { 566a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCMethodDecl *MDecl = dyn_cast<ObjCMethodDecl>(static_cast<Decl *>(D)); 567306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian QualType T = MDecl->getResultType(); 568306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian llvm::SmallVector<QualType, 16> ArgTys; 569306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian 5703560002bed2be6b428f1a909c489a8857b4417c7Fariborz Jahanian // Add the first two invisible argument types for self and _cmd. 571f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor if (MDecl->isInstanceMethod()) { 572a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek QualType selfTy = Context.getObjCInterfaceType(MDecl->getClassInterface()); 5731f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian selfTy = Context.getPointerType(selfTy); 5741f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian ArgTys.push_back(selfTy); 5751f7b6f88f18d7f6b10265acec5d41c4ed1897487Fariborz Jahanian } 5763560002bed2be6b428f1a909c489a8857b4417c7Fariborz Jahanian else 577a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ArgTys.push_back(Context.getObjCIdType()); 578a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ArgTys.push_back(Context.getObjCSelType()); 5793560002bed2be6b428f1a909c489a8857b4417c7Fariborz Jahanian 58058cce3b0dcbdcc95b7e713795834b4cb2c8a008aChris Lattner for (int i = 0, e = MDecl->getNumParams(); i != e; ++i) { 581306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian ParmVarDecl *PDecl = MDecl->getParamDecl(i); 582306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian QualType ArgTy = PDecl->getType(); 583306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian assert(!ArgTy.isNull() && "Couldn't parse type?"); 584306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian // Perform the default function/array conversion (C99 6.7.5.3p[7,8]). 585306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian // This matches the conversion that is done in 586e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner // Sema::ActOnParamDeclarator(). 587e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner if (ArgTy->isArrayType()) 588e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner ArgTy = Context.getArrayDecayedType(ArgTy); 589306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian else if (ArgTy->isFunctionType()) 590306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian ArgTy = Context.getPointerType(ArgTy); 591306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian ArgTys.push_back(ArgTy); 592306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian } 593306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian T = Context.getFunctionType(T, &ArgTys[0], ArgTys.size(), 5947fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis MDecl->isVariadic(), 0); 595306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian return T; 596306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian} 597306d68f5ef2eab86e0e86ebadd5a6eee1f752c0bFariborz Jahanian 59857373266011f73418381b736015d8d2bb0381176Douglas Gregor/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types (FIXME: 59957373266011f73418381b736015d8d2bb0381176Douglas Gregor/// or pointer-to-member types) that may be similar (C++ 4.4), 60057373266011f73418381b736015d8d2bb0381176Douglas Gregor/// replaces T1 and T2 with the type that they point to and return 60157373266011f73418381b736015d8d2bb0381176Douglas Gregor/// true. If T1 and T2 aren't pointer types or pointer-to-member 60257373266011f73418381b736015d8d2bb0381176Douglas Gregor/// types, or if they are not similar at this level, returns false and 60357373266011f73418381b736015d8d2bb0381176Douglas Gregor/// leaves T1 and T2 unchanged. Top-level qualifiers on T1 and T2 are 6042f639b9f3c6b081f076d2ac6d75115ce44bfa249Douglas Gregor/// ignored. This function will typically be called in a loop that 60557373266011f73418381b736015d8d2bb0381176Douglas Gregor/// successively "unwraps" pointer and pointer-to-member types to 60657373266011f73418381b736015d8d2bb0381176Douglas Gregor/// compare them at each level. 60757373266011f73418381b736015d8d2bb0381176Douglas Gregorbool Sema::UnwrapSimilarPointerTypes(QualType& T1, QualType& T2) 60857373266011f73418381b736015d8d2bb0381176Douglas Gregor{ 60957373266011f73418381b736015d8d2bb0381176Douglas Gregor const PointerType *T1PtrType = T1->getAsPointerType(), 61057373266011f73418381b736015d8d2bb0381176Douglas Gregor *T2PtrType = T2->getAsPointerType(); 61157373266011f73418381b736015d8d2bb0381176Douglas Gregor if (T1PtrType && T2PtrType) { 61257373266011f73418381b736015d8d2bb0381176Douglas Gregor T1 = T1PtrType->getPointeeType(); 61357373266011f73418381b736015d8d2bb0381176Douglas Gregor T2 = T2PtrType->getPointeeType(); 61457373266011f73418381b736015d8d2bb0381176Douglas Gregor return true; 61557373266011f73418381b736015d8d2bb0381176Douglas Gregor } 61657373266011f73418381b736015d8d2bb0381176Douglas Gregor 61757373266011f73418381b736015d8d2bb0381176Douglas Gregor // FIXME: pointer-to-member types 61857373266011f73418381b736015d8d2bb0381176Douglas Gregor return false; 61957373266011f73418381b736015d8d2bb0381176Douglas Gregor} 62057373266011f73418381b736015d8d2bb0381176Douglas Gregor 621cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian RedlSema::TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) { 6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.7.6: Type names have no identifier. This is already validated by 6235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // the parser. 6245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(D.getIdentifier() == 0 && "Type name should have no identifier!"); 6255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 626cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl QualType T = GetTypeForDeclarator(D, S); 6275912a3544e438a92832b8c52c13f48d4f54795dcSteve Naroff 6285912a3544e438a92832b8c52c13f48d4f54795dcSteve Naroff assert(!T.isNull() && "GetTypeForDeclarator() returned null type"); 6295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6306d6eb57225b53fb627c565861d1d0e90645400d1Douglas Gregor // Check that there are no default arguments (C++ only). 6316d6eb57225b53fb627c565861d1d0e90645400d1Douglas Gregor if (getLangOptions().CPlusPlus) 6326d6eb57225b53fb627c565861d1d0e90645400d1Douglas Gregor CheckExtraCXXDefaultArguments(D); 6336d6eb57225b53fb627c565861d1d0e90645400d1Douglas Gregor 6345912a3544e438a92832b8c52c13f48d4f54795dcSteve Naroff // In this context, we *do not* check D.getInvalidType(). If the declarator 6355912a3544e438a92832b8c52c13f48d4f54795dcSteve Naroff // type was invalid, GetTypeForDeclarator() still returns a "valid" type, 6365912a3544e438a92832b8c52c13f48d4f54795dcSteve Naroff // though it will not reflect the user specified type. 6375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return T.getAsOpaquePtr(); 6385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 640c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner 641c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner 642c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner//===----------------------------------------------------------------------===// 643c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner// Type Attribute Processing 644c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner//===----------------------------------------------------------------------===// 645232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner 646232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner/// HandleAddressSpaceTypeAttribute - Process an address_space attribute on the 647c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner/// specified type. The attribute contains 1 argument, the id of the address 648c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner/// space for the type. 649c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattnerstatic void HandleAddressSpaceTypeAttribute(QualType &Type, 650c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner const AttributeList &Attr, Sema &S){ 651232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner // If this type is already address space qualified, reject it. 652232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner // Clause 6.7.3 - Type qualifiers: "No type shall be qualified by qualifiers 653232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner // for two or more different address spaces." 654232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner if (Type.getAddressSpace()) { 655c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner S.Diag(Attr.getLoc(), diag::err_attribute_address_multiple_qualifiers); 656c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner return; 657232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner } 658232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner 659232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner // Check the attribute arguments. 660545dd3401e7f31c256d69cb948a45d5ca781064cChris Lattner if (Attr.getNumArgs() != 1) { 661f3a41af4d5c98a72a1d6720bbbfd658e57ef2541Chris Lattner S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1; 662c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner return; 663232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner } 664545dd3401e7f31c256d69cb948a45d5ca781064cChris Lattner Expr *ASArgExpr = static_cast<Expr *>(Attr.getArg(0)); 665232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner llvm::APSInt addrSpace(32); 666c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner if (!ASArgExpr->isIntegerConstantExpr(addrSpace, S.Context)) { 667dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner S.Diag(Attr.getLoc(), diag::err_attribute_address_space_not_int) 668dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << ASArgExpr->getSourceRange(); 669c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner return; 670232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner } 671232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner 672232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner unsigned ASIdx = static_cast<unsigned>(addrSpace.getZExtValue()); 673c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner Type = S.Context.getASQualType(Type, ASIdx); 674c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner} 675c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner 676c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattnervoid Sema::ProcessTypeAttributeList(QualType &Result, const AttributeList *AL) { 677c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner // Scan through and apply attributes to this type where it makes sense. Some 678c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner // attributes (such as __address_space__, __vector_size__, etc) apply to the 679c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner // type, but others can be present in the type specifiers even though they 680c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner // apply to the decl. Here we apply type attributes and ignore the rest. 681c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner for (; AL; AL = AL->getNext()) { 682c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner // If this is an attribute we can handle, do so now, otherwise, add it to 683c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner // the LeftOverAttrs list for rechaining. 684c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner switch (AL->getKind()) { 685c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner default: break; 686c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner case AttributeList::AT_address_space: 687c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner HandleAddressSpaceTypeAttribute(Result, *AL, *this); 688c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner break; 689c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner } 690c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner } 691232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner} 692232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner 6933c0eb160ca1361a82b9f15b3b40a2425adc14d0fEli Friedman 694