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