SemaType.cpp revision 1e030eb1194763b42c1752723be23b1515f48981
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
142d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall#include "clang/Sema/SemaInternal.h"
157cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/Sema/Template.h"
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h"
17a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor#include "clang/AST/CXXInheritance.h"
18980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/DeclObjC.h"
192943aed177b33ae3f14273b11a7b398e5276ec62Douglas Gregor#include "clang/AST/DeclTemplate.h"
204adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis#include "clang/AST/TypeLoc.h"
2151bd803fbdade51d674598ed45da3d54190a656cJohn McCall#include "clang/AST/TypeLocVisitor.h"
22e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h"
2391a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson#include "clang/Basic/PartialDiagnostic.h"
24d18f9f965bcfe56edcdf9b0d8375ffaad9866b3fCharles Davis#include "clang/Basic/TargetInfo.h"
2519510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/DeclSpec.h"
264994d2d50ceacdc8908f750c55589c0a20942a0aSebastian Redl#include "llvm/ADT/SmallPtrSet.h"
2787c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor#include "llvm/Support/ErrorHandling.h"
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
302dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor/// \brief Perform adjustment on the parameter type of a function.
312dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor///
322dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor/// This routine adjusts the given parameter type @p T to the actual
331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parameter type used by semantic analysis (C99 6.7.5.3p[7,8],
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// C++ [dcl.fct]p3). The adjusted parameter type is returned.
352dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas GregorQualType Sema::adjustParameterType(QualType T) {
362dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor  // C99 6.7.5.3p7:
37778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner  //   A declaration of a parameter as "array of type" shall be
38778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner  //   adjusted to "qualified pointer to type", where the type
39778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner  //   qualifiers (if any) are those specified within the [ and ] of
40778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner  //   the array type derivation.
41778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner  if (T->isArrayType())
422dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor    return Context.getArrayDecayedType(T);
43778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner
44778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner  // C99 6.7.5.3p8:
45778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner  //   A declaration of a parameter as "function returning type"
46778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner  //   shall be adjusted to "pointer to function returning type", as
47778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner  //   in 6.3.2.1.
48778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner  if (T->isFunctionType())
492dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor    return Context.getPointerType(T);
502dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor
512dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor  return T;
522dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor}
532dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor
545db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner
555db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner
565db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner/// isOmittedBlockReturnType - Return true if this declarator is missing a
575db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner/// return type because this is a omitted return type on a block literal.
588ce35b095e8fca45e04c1bda14ed0548ce7536adSebastian Redlstatic bool isOmittedBlockReturnType(const Declarator &D) {
595db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner  if (D.getContext() != Declarator::BlockLiteralContext ||
608ce35b095e8fca45e04c1bda14ed0548ce7536adSebastian Redl      D.getDeclSpec().hasTypeSpecifier())
615db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner    return false;
625db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner
635db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner  if (D.getNumTypeObjects() == 0)
64a64ef0ab5cb6ac9cfb7d40661a9152c4aa488386Chris Lattner    return true;   // ^{ ... }
655db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner
665db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner  if (D.getNumTypeObjects() == 1 &&
675db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner      D.getTypeObject(0).Kind == DeclaratorChunk::Function)
68a64ef0ab5cb6ac9cfb7d40661a9152c4aa488386Chris Lattner    return true;   // ^(int X, float Y) { ... }
695db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner
705db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner  return false;
715db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner}
725db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner
7304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCalltypedef std::pair<const AttributeList*,QualType> DelayedAttribute;
7404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCalltypedef llvm::SmallVectorImpl<DelayedAttribute> DelayedAttributeSet;
7504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
7604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallstatic void ProcessTypeAttributeList(Sema &S, QualType &Type,
77328ce34c7d0c4e8696d352853b48b385dec1fef4Charles Davis                                     bool IsDeclSpec,
7804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall                                     const AttributeList *Attrs,
7904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall                                     DelayedAttributeSet &DelayedFnAttrs);
8004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallstatic bool ProcessFnAttr(Sema &S, QualType &Type, const AttributeList &Attr);
8104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
8204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallstatic void ProcessDelayedFnAttrs(Sema &S, QualType &Type,
8304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall                                  DelayedAttributeSet &Attrs) {
8404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  for (DelayedAttributeSet::iterator I = Attrs.begin(),
8504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall         E = Attrs.end(); I != E; ++I)
86e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    if (ProcessFnAttr(S, Type, *I->first)) {
8704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      S.Diag(I->first->getLoc(), diag::warn_function_attribute_wrong_type)
8804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall        << I->first->getName() << I->second;
89e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara      // Avoid any further processing of this attribute.
90e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara      I->first->setInvalid();
91e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    }
9204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  Attrs.clear();
9304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall}
9404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
9504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallstatic void DiagnoseDelayedFnAttrs(Sema &S, DelayedAttributeSet &Attrs) {
9604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  for (DelayedAttributeSet::iterator I = Attrs.begin(),
9704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall         E = Attrs.end(); I != E; ++I) {
9804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    S.Diag(I->first->getLoc(), diag::warn_function_attribute_wrong_type)
9904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      << I->first->getName() << I->second;
100e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    // Avoid any further processing of this attribute.
101e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    I->first->setInvalid();
10204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  }
10304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  Attrs.clear();
10404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall}
10504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
106930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor/// \brief Convert the specified declspec to the appropriate type
107930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor/// object.
1085db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner/// \param D  the declarator containing the declaration specifier.
1095153ee66d6d4fb37b02f85df38e48dc8b46660dfChris Lattner/// \returns The type described by the declaration specifiers.  This function
1105153ee66d6d4fb37b02f85df38e48dc8b46660dfChris Lattner/// never returns null.
11104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallstatic QualType ConvertDeclSpecToType(Sema &TheSema,
11204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall                                      Declarator &TheDeclarator,
11304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall                                      DelayedAttributeSet &Delayed) {
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: Should move the logic from DeclSpec::Finish to here for validity
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // checking.
1165db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner  const DeclSpec &DS = TheDeclarator.getDeclSpec();
1175db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner  SourceLocation DeclLoc = TheDeclarator.getIdentifierLoc();
1185db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner  if (DeclLoc.isInvalid())
1195db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner    DeclLoc = DS.getSourceRange().getBegin();
1201564e3906cad604a42bd131e584751a75589a9c4Chris Lattner
1211564e3906cad604a42bd131e584751a75589a9c4Chris Lattner  ASTContext &Context = TheSema.Context;
1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1235db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner  QualType Result;
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (DS.getTypeSpecType()) {
12596b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner  case DeclSpec::TST_void:
12696b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    Result = Context.VoidTy;
12796b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    break;
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_char:
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified)
130fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      Result = Context.CharTy;
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed)
132fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      Result = Context.SignedCharTy;
1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else {
1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned &&
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer             "Unknown TSS value");
136fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      Result = Context.UnsignedCharTy;
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
138958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner    break;
13964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  case DeclSpec::TST_wchar:
14064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis    if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified)
14164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis      Result = Context.WCharTy;
14264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis    else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed) {
1431564e3906cad604a42bd131e584751a75589a9c4Chris Lattner      TheSema.Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec)
144f3a41af4d5c98a72a1d6720bbbfd658e57ef2541Chris Lattner        << DS.getSpecifierName(DS.getTypeSpecType());
14564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis      Result = Context.getSignedWCharType();
14664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis    } else {
14764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis      assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned &&
14864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis        "Unknown TSS value");
1491564e3906cad604a42bd131e584751a75589a9c4Chris Lattner      TheSema.Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec)
150f3a41af4d5c98a72a1d6720bbbfd658e57ef2541Chris Lattner        << DS.getSpecifierName(DS.getTypeSpecType());
15164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis      Result = Context.getUnsignedWCharType();
15264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis    }
15364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis    break;
154f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  case DeclSpec::TST_char16:
155f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith      assert(DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
156f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith        "Unknown TSS value");
157f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith      Result = Context.Char16Ty;
158f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    break;
159f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  case DeclSpec::TST_char32:
160f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith      assert(DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
161f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith        "Unknown TSS value");
162f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith      Result = Context.Char32Ty;
163f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    break;
164d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner  case DeclSpec::TST_unspecified:
16562f5f7ffad57e0c2af2b308af3735351505937cbChris Lattner    // "<proto1,proto2>" is an objc qualified ID with a missing id.
166097e916b617bb4a069a03764024c310ed42a6424Chris Lattner    if (DeclSpec::ProtocolQualifierListTy PQ = DS.getProtocolQualifiers()) {
167c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Result = Context.getObjCObjectType(Context.ObjCBuiltinIdTy,
168c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                         (ObjCProtocolDecl**)PQ,
169c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                         DS.getNumProtocolQualifiers());
170c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Result = Context.getObjCObjectPointerType(Result);
17162f5f7ffad57e0c2af2b308af3735351505937cbChris Lattner      break;
17262f5f7ffad57e0c2af2b308af3735351505937cbChris Lattner    }
1735db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner
1745db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner    // If this is a missing declspec in a block literal return context, then it
1755db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner    // is inferred from the return statements inside the block.
1768ce35b095e8fca45e04c1bda14ed0548ce7536adSebastian Redl    if (isOmittedBlockReturnType(TheDeclarator)) {
1775db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner      Result = Context.DependentTy;
1785db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner      break;
1795db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner    }
1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
181d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner    // Unspecified typespec defaults to int in C90.  However, the C90 grammar
182d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner    // [C90 6.5] only allows a decl-spec if there was *some* type-specifier,
183d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner    // type-qualifier, or storage-class-specifier.  If not, emit an extwarn.
184d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner    // Note that the one exception to this is function definitions, which are
185d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner    // allowed to be completely missing a declspec.  This is handled in the
186d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner    // parser already though by it pretending to have seen an 'int' in this
187d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner    // case.
1881564e3906cad604a42bd131e584751a75589a9c4Chris Lattner    if (TheSema.getLangOptions().ImplicitInt) {
18935d276f443462249b436951c1c663820569e1768Chris Lattner      // In C89 mode, we only warn if there is a completely missing declspec
19035d276f443462249b436951c1c663820569e1768Chris Lattner      // when one is not allowed.
1913f84ad22acc25353a47ee88f55ab05dffef5d9a9Chris Lattner      if (DS.isEmpty()) {
1921564e3906cad604a42bd131e584751a75589a9c4Chris Lattner        TheSema.Diag(DeclLoc, diag::ext_missing_declspec)
1933f84ad22acc25353a47ee88f55ab05dffef5d9a9Chris Lattner          << DS.getSourceRange()
194849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor        << FixItHint::CreateInsertion(DS.getSourceRange().getBegin(), "int");
1953f84ad22acc25353a47ee88f55ab05dffef5d9a9Chris Lattner      }
1964310f4ee260e6c7ceeaf299e240f4d789ecc730dDouglas Gregor    } else if (!DS.hasTypeSpecifier()) {
197d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner      // C99 and C++ require a type specifier.  For example, C99 6.7.2p2 says:
198d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner      // "At least one type specifier shall be given in the declaration
199d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner      // specifiers in each declaration, and in the specifier-qualifier list in
200d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner      // each struct declaration and type name."
2014310f4ee260e6c7ceeaf299e240f4d789ecc730dDouglas Gregor      // FIXME: Does Microsoft really have the implicit int extension in C++?
2021564e3906cad604a42bd131e584751a75589a9c4Chris Lattner      if (TheSema.getLangOptions().CPlusPlus &&
2031564e3906cad604a42bd131e584751a75589a9c4Chris Lattner          !TheSema.getLangOptions().Microsoft) {
2041564e3906cad604a42bd131e584751a75589a9c4Chris Lattner        TheSema.Diag(DeclLoc, diag::err_missing_type_specifier)
2053f84ad22acc25353a47ee88f55ab05dffef5d9a9Chris Lattner          << DS.getSourceRange();
2061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
207b78d833b12f7c4baab138f305f72efd49455a3f9Chris Lattner        // When this occurs in C++ code, often something is very broken with the
208b78d833b12f7c4baab138f305f72efd49455a3f9Chris Lattner        // value being declared, poison it as invalid so we don't get chains of
209b78d833b12f7c4baab138f305f72efd49455a3f9Chris Lattner        // errors.
2105db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner        TheDeclarator.setInvalidType(true);
211b78d833b12f7c4baab138f305f72efd49455a3f9Chris Lattner      } else {
2121564e3906cad604a42bd131e584751a75589a9c4Chris Lattner        TheSema.Diag(DeclLoc, diag::ext_missing_type_specifier)
2133f84ad22acc25353a47ee88f55ab05dffef5d9a9Chris Lattner          << DS.getSourceRange();
214b78d833b12f7c4baab138f305f72efd49455a3f9Chris Lattner      }
215d658b562e80d6ef7a1118e34ff12802c6e2fccedChris Lattner    }
2161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // FALL THROUGH.
2183cbc38bd3569d37f53bd76fa89d24803f48f5036Chris Lattner  case DeclSpec::TST_int: {
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (DS.getTypeSpecSign() != DeclSpec::TSS_unsigned) {
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      switch (DS.getTypeSpecWidth()) {
221fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      case DeclSpec::TSW_unspecified: Result = Context.IntTy; break;
222fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      case DeclSpec::TSW_short:       Result = Context.ShortTy; break;
223fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      case DeclSpec::TSW_long:        Result = Context.LongTy; break;
224311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner      case DeclSpec::TSW_longlong:
225311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner        Result = Context.LongLongTy;
226311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner
227311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner        // long long is a C99 feature.
228311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner        if (!TheSema.getLangOptions().C99 &&
229311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner            !TheSema.getLangOptions().CPlusPlus0x)
230311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner          TheSema.Diag(DS.getTypeSpecWidthLoc(), diag::ext_longlong);
231311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner        break;
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else {
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      switch (DS.getTypeSpecWidth()) {
235fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      case DeclSpec::TSW_unspecified: Result = Context.UnsignedIntTy; break;
236fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      case DeclSpec::TSW_short:       Result = Context.UnsignedShortTy; break;
237fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      case DeclSpec::TSW_long:        Result = Context.UnsignedLongTy; break;
238311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner      case DeclSpec::TSW_longlong:
239311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner        Result = Context.UnsignedLongLongTy;
240311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner
241311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner        // long long is a C99 feature.
242311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner        if (!TheSema.getLangOptions().C99 &&
243311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner            !TheSema.getLangOptions().CPlusPlus0x)
244311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner          TheSema.Diag(DS.getTypeSpecWidthLoc(), diag::ext_longlong);
245311157fa6be96e2769bf317390dc9fb85087d5faChris Lattner        break;
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
248958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner    break;
2493cbc38bd3569d37f53bd76fa89d24803f48f5036Chris Lattner  }
250fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner  case DeclSpec::TST_float: Result = Context.FloatTy; break;
251958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner  case DeclSpec::TST_double:
252958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner    if (DS.getTypeSpecWidth() == DeclSpec::TSW_long)
253fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      Result = Context.LongDoubleTy;
254958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner    else
255fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner      Result = Context.DoubleTy;
256958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner    break;
257fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner  case DeclSpec::TST_bool: Result = Context.BoolTy; break; // _Bool or bool
2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_decimal32:    // _Decimal32
2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_decimal64:    // _Decimal64
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_decimal128:   // _Decimal128
2611564e3906cad604a42bd131e584751a75589a9c4Chris Lattner    TheSema.Diag(DS.getTypeSpecTypeLoc(), diag::err_decimal_unsupported);
2628f12f65fad7bfbbdbd4234efe0d484f68c3924b6Chris Lattner    Result = Context.IntTy;
2635db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner    TheDeclarator.setInvalidType(true);
2648f12f65fad7bfbbdbd4234efe0d484f68c3924b6Chris Lattner    break;
26599dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner  case DeclSpec::TST_class:
2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_enum:
2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_union:
2685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_struct: {
269b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    TypeDecl *D = dyn_cast_or_null<TypeDecl>(DS.getRepAsDecl());
2706e24726524c2b51b31bb4b622aa678a46b024f42John McCall    if (!D) {
2716e24726524c2b51b31bb4b622aa678a46b024f42John McCall      // This can happen in C++ with ambiguous lookups.
2726e24726524c2b51b31bb4b622aa678a46b024f42John McCall      Result = Context.IntTy;
2735db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner      TheDeclarator.setInvalidType(true);
2746e24726524c2b51b31bb4b622aa678a46b024f42John McCall      break;
2756e24726524c2b51b31bb4b622aa678a46b024f42John McCall    }
2766e24726524c2b51b31bb4b622aa678a46b024f42John McCall
277a64ef0ab5cb6ac9cfb7d40661a9152c4aa488386Chris Lattner    // If the type is deprecated or unavailable, diagnose it.
27854abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall    TheSema.DiagnoseUseOfDecl(D, DS.getTypeSpecTypeLoc());
279a64ef0ab5cb6ac9cfb7d40661a9152c4aa488386Chris Lattner
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 &&
281a64ef0ab5cb6ac9cfb7d40661a9152c4aa488386Chris Lattner           DS.getTypeSpecSign() == 0 && "No qualifiers on tag names!");
282a64ef0ab5cb6ac9cfb7d40661a9152c4aa488386Chris Lattner
2835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // TypeQuals handled by caller.
284a64ef0ab5cb6ac9cfb7d40661a9152c4aa488386Chris Lattner    Result = Context.getTypeDeclType(D);
2852191b20bfb31fc0e22a158f6b4204cd0b7dbd0fdJohn McCall
2862191b20bfb31fc0e22a158f6b4204cd0b7dbd0fdJohn McCall    // In C++, make an ElaboratedType.
2871564e3906cad604a42bd131e584751a75589a9c4Chris Lattner    if (TheSema.getLangOptions().CPlusPlus) {
288465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      ElaboratedTypeKeyword Keyword
289465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara        = ElaboratedType::getKeywordForTypeSpec(DS.getTypeSpecType());
290465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      Result = TheSema.getElaboratedType(Keyword, DS.getTypeSpecScope(),
291465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                         Result);
2922191b20bfb31fc0e22a158f6b4204cd0b7dbd0fdJohn McCall    }
2935153ee66d6d4fb37b02f85df38e48dc8b46660dfChris Lattner    if (D->isInvalidDecl())
2945db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner      TheDeclarator.setInvalidType(true);
295958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner    break;
2961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
2971a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor  case DeclSpec::TST_typename: {
2985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 &&
2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           DS.getTypeSpecSign() == 0 &&
3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           "Can't handle qualifiers on typedef names yet!");
301b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    Result = TheSema.GetTypeFromParser(DS.getRepAsType());
30227940d2fb346325d6001a7661e4ada099cd8e59cJohn McCall    if (Result.isNull())
30327940d2fb346325d6001a7661e4ada099cd8e59cJohn McCall      TheDeclarator.setInvalidType(true);
30427940d2fb346325d6001a7661e4ada099cd8e59cJohn McCall    else if (DeclSpec::ProtocolQualifierListTy PQ
30527940d2fb346325d6001a7661e4ada099cd8e59cJohn McCall               = DS.getProtocolQualifiers()) {
306c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      if (const ObjCObjectType *ObjT = Result->getAs<ObjCObjectType>()) {
307c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        // Silently drop any existing protocol qualifiers.
308c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        // TODO: determine whether that's the right thing to do.
309c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        if (ObjT->getNumProtocols())
310c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall          Result = ObjT->getBaseType();
311c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
312c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        if (DS.getNumProtocolQualifiers())
313c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall          Result = Context.getObjCObjectType(Result,
314c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                             (ObjCProtocolDecl**) PQ,
315c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                             DS.getNumProtocolQualifiers());
316c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      } else if (Result->isObjCIdType()) {
317ae4da6150bb837311a2f0f958b01a2989066ba90Chris Lattner        // id<protocol-list>
318c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        Result = Context.getObjCObjectType(Context.ObjCBuiltinIdTy,
319c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                           (ObjCProtocolDecl**) PQ,
320c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                           DS.getNumProtocolQualifiers());
321c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        Result = Context.getObjCObjectPointerType(Result);
322c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      } else if (Result->isObjCClassType()) {
3234262a07621043c19292f5fd90b1e426d65cd366cSteve Naroff        // Class<protocol-list>
324c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        Result = Context.getObjCObjectType(Context.ObjCBuiltinClassTy,
325c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                           (ObjCProtocolDecl**) PQ,
326c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                           DS.getNumProtocolQualifiers());
327c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        Result = Context.getObjCObjectPointerType(Result);
3283f84ad22acc25353a47ee88f55ab05dffef5d9a9Chris Lattner      } else {
3291564e3906cad604a42bd131e584751a75589a9c4Chris Lattner        TheSema.Diag(DeclLoc, diag::err_invalid_protocol_qualifiers)
3303f84ad22acc25353a47ee88f55ab05dffef5d9a9Chris Lattner          << DS.getSourceRange();
3315db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner        TheDeclarator.setInvalidType(true);
3323f84ad22acc25353a47ee88f55ab05dffef5d9a9Chris Lattner      }
333c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian    }
3341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // TypeQuals handled by caller.
336958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner    break;
3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
338958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner  case DeclSpec::TST_typeofType:
339e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis    // FIXME: Preserve type source info.
340b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    Result = TheSema.GetTypeFromParser(DS.getRepAsType());
341958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner    assert(!Result.isNull() && "Didn't get a type for typeof?");
342730e175910936eae49e65caea8b2ba81c67edff7Fariborz Jahanian    if (!Result->isDependentType())
343730e175910936eae49e65caea8b2ba81c67edff7Fariborz Jahanian      if (const TagType *TT = Result->getAs<TagType>())
344730e175910936eae49e65caea8b2ba81c67edff7Fariborz Jahanian        TheSema.DiagnoseUseOfDecl(TT->getDecl(),
345730e175910936eae49e65caea8b2ba81c67edff7Fariborz Jahanian                                  DS.getTypeSpecTypeLoc());
346d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff    // TypeQuals handled by caller.
347fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner    Result = Context.getTypeOfType(Result);
348958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner    break;
349d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  case DeclSpec::TST_typeofExpr: {
350b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    Expr *E = DS.getRepAsExpr();
351d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff    assert(E && "Didn't get an expression for typeof?");
352d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff    // TypeQuals handled by caller.
3532a984cad5ac3fdceeff2bd99daa7b90979313475John McCall    Result = TheSema.BuildTypeofExprType(E, DS.getTypeSpecTypeLoc());
3544b52e25f3b05ab0f9d2492276a52323a50a84fb7Douglas Gregor    if (Result.isNull()) {
3554b52e25f3b05ab0f9d2492276a52323a50a84fb7Douglas Gregor      Result = Context.IntTy;
3564b52e25f3b05ab0f9d2492276a52323a50a84fb7Douglas Gregor      TheDeclarator.setInvalidType(true);
3574b52e25f3b05ab0f9d2492276a52323a50a84fb7Douglas Gregor    }
358958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner    break;
359d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  }
3606fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson  case DeclSpec::TST_decltype: {
361b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    Expr *E = DS.getRepAsExpr();
3626fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson    assert(E && "Didn't get an expression for decltype?");
3636fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson    // TypeQuals handled by caller.
3642a984cad5ac3fdceeff2bd99daa7b90979313475John McCall    Result = TheSema.BuildDecltypeType(E, DS.getTypeSpecTypeLoc());
365af017e682918f7a1a95ff08d9ab7ae3426436ca3Anders Carlsson    if (Result.isNull()) {
366af017e682918f7a1a95ff08d9ab7ae3426436ca3Anders Carlsson      Result = Context.IntTy;
3675db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner      TheDeclarator.setInvalidType(true);
368af017e682918f7a1a95ff08d9ab7ae3426436ca3Anders Carlsson    }
3696fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson    break;
3706fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson  }
371e89d15944dd3be750a09805ad21222d2fa9321faAnders Carlsson  case DeclSpec::TST_auto: {
372e89d15944dd3be750a09805ad21222d2fa9321faAnders Carlsson    // TypeQuals handled by caller.
373e89d15944dd3be750a09805ad21222d2fa9321faAnders Carlsson    Result = Context.UndeducedAutoTy;
374e89d15944dd3be750a09805ad21222d2fa9321faAnders Carlsson    break;
375e89d15944dd3be750a09805ad21222d2fa9321faAnders Carlsson  }
3761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
377809070a886684cb5b92eb0e00a6581ab1fa6b17aDouglas Gregor  case DeclSpec::TST_error:
3785153ee66d6d4fb37b02f85df38e48dc8b46660dfChris Lattner    Result = Context.IntTy;
3795db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner    TheDeclarator.setInvalidType(true);
3805153ee66d6d4fb37b02f85df38e48dc8b46660dfChris Lattner    break;
3815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383958858e04e9f98a42031ba69779e49c21f01ca6cChris Lattner  // Handle complex types.
384f244cd7e54753caf6edb76df430dea2f43bb82a8Douglas Gregor  if (DS.getTypeSpecComplex() == DeclSpec::TSC_complex) {
3851564e3906cad604a42bd131e584751a75589a9c4Chris Lattner    if (TheSema.getLangOptions().Freestanding)
3861564e3906cad604a42bd131e584751a75589a9c4Chris Lattner      TheSema.Diag(DS.getTypeSpecComplexLoc(), diag::ext_freestanding_complex);
387fab5b45729db4e24ba43bb94d1bce5f73106be78Chris Lattner    Result = Context.getComplexType(Result);
38882287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  } else if (DS.isTypeAltiVecVector()) {
38982287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    unsigned typeSize = static_cast<unsigned>(Context.getTypeSize(Result));
39082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    assert(typeSize > 0 && "type size for vector must be greater than 0 bits");
391788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    VectorType::AltiVecSpecific AltiVecSpec = VectorType::AltiVec;
392788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    if (DS.isTypeAltiVecPixel())
393788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      AltiVecSpec = VectorType::Pixel;
394788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    else if (DS.isTypeAltiVecBool())
395788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      AltiVecSpec = VectorType::Bool;
396788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    Result = Context.getVectorType(Result, 128/typeSize, AltiVecSpec);
397f244cd7e54753caf6edb76df430dea2f43bb82a8Douglas Gregor  }
3981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39947423bdaa06a3b9c2a859b57c17fc570094dad1cArgyrios Kyrtzidis  // FIXME: Imaginary.
40047423bdaa06a3b9c2a859b57c17fc570094dad1cArgyrios Kyrtzidis  if (DS.getTypeSpecComplex() == DeclSpec::TSC_imaginary)
40147423bdaa06a3b9c2a859b57c17fc570094dad1cArgyrios Kyrtzidis    TheSema.Diag(DS.getTypeSpecComplexLoc(), diag::err_imaginary_not_supported);
4021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40338d8b98803ac354dba15578d65ea99a83dead046Chris Lattner  // See if there are any attributes on the declspec that apply to the type (as
40438d8b98803ac354dba15578d65ea99a83dead046Chris Lattner  // opposed to the decl).
405fca0ddd42965e0b7ae821213486d4e0dd71fb439Chris Lattner  if (const AttributeList *AL = DS.getAttributes())
406328ce34c7d0c4e8696d352853b48b385dec1fef4Charles Davis    ProcessTypeAttributeList(TheSema, Result, true, AL, Delayed);
4071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40896b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner  // Apply const/volatile/restrict qualifiers to T.
40996b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner  if (unsigned TypeQuals = DS.getTypeQualifiers()) {
41096b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner
41196b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    // Enforce C99 6.7.3p2: "Types other than pointer types derived from object
41296b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    // or incomplete types shall not be restrict-qualified."  C++ also allows
41396b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    // restrict-qualified references.
4140953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (TypeQuals & DeclSpec::TQ_restrict) {
4152b5ff1a1471819192ae805b51b888030ecb52914Fariborz Jahanian      if (Result->isAnyPointerType() || Result->isReferenceType()) {
4162b5ff1a1471819192ae805b51b888030ecb52914Fariborz Jahanian        QualType EltTy;
4172b5ff1a1471819192ae805b51b888030ecb52914Fariborz Jahanian        if (Result->isObjCObjectPointerType())
4182b5ff1a1471819192ae805b51b888030ecb52914Fariborz Jahanian          EltTy = Result;
4192b5ff1a1471819192ae805b51b888030ecb52914Fariborz Jahanian        else
4202b5ff1a1471819192ae805b51b888030ecb52914Fariborz Jahanian          EltTy = Result->isPointerType() ?
4212b5ff1a1471819192ae805b51b888030ecb52914Fariborz Jahanian                    Result->getAs<PointerType>()->getPointeeType() :
4222b5ff1a1471819192ae805b51b888030ecb52914Fariborz Jahanian                    Result->getAs<ReferenceType>()->getPointeeType();
4231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
424bad0e656c3732e3539a9cd6525de721d7e47408bDouglas Gregor        // If we have a pointer or reference, the pointee must have an object
425bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner        // incomplete type.
426bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner        if (!EltTy->isIncompleteOrObjectType()) {
4271564e3906cad604a42bd131e584751a75589a9c4Chris Lattner          TheSema.Diag(DS.getRestrictSpecLoc(),
428d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner               diag::err_typecheck_invalid_restrict_invalid_pointee)
429d162584991885ab004a02573a73ce06422b921fcChris Lattner            << EltTy << DS.getSourceRange();
4300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall          TypeQuals &= ~DeclSpec::TQ_restrict; // Remove the restrict qualifier.
431bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner        }
432bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner      } else {
4331564e3906cad604a42bd131e584751a75589a9c4Chris Lattner        TheSema.Diag(DS.getRestrictSpecLoc(),
434d3a94e24ddf3fb90de76b17bd176d9ed61e66f2cChris Lattner             diag::err_typecheck_invalid_restrict_not_pointer)
435d162584991885ab004a02573a73ce06422b921fcChris Lattner          << Result << DS.getSourceRange();
4360953e767ff7817f97b3ab20896b229891eeff45bJohn McCall        TypeQuals &= ~DeclSpec::TQ_restrict; // Remove the restrict qualifier.
43796b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner      }
43896b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    }
4391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44096b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    // Warn about CV qualifiers on functions: C99 6.7.3p8: "If the specification
44196b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    // of a function type includes any type qualifiers, the behavior is
44296b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    // undefined."
44396b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    if (Result->isFunctionType() && TypeQuals) {
44496b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner      // Get some location to point at, either the C or V location.
44596b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner      SourceLocation Loc;
4460953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      if (TypeQuals & DeclSpec::TQ_const)
44796b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner        Loc = DS.getConstSpecLoc();
4480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      else if (TypeQuals & DeclSpec::TQ_volatile)
44996b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner        Loc = DS.getVolatileSpecLoc();
4500953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      else {
4510953e767ff7817f97b3ab20896b229891eeff45bJohn McCall        assert((TypeQuals & DeclSpec::TQ_restrict) &&
4520953e767ff7817f97b3ab20896b229891eeff45bJohn McCall               "Has CVR quals but not C, V, or R?");
4530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall        Loc = DS.getRestrictSpecLoc();
45496b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner      }
4551564e3906cad604a42bd131e584751a75589a9c4Chris Lattner      TheSema.Diag(Loc, diag::warn_typecheck_function_qualifiers)
456d162584991885ab004a02573a73ce06422b921fcChris Lattner        << Result << DS.getSourceRange();
45796b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner    }
4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
459f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor    // C++ [dcl.ref]p1:
460f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor    //   Cv-qualified references are ill-formed except when the
461f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor    //   cv-qualifiers are introduced through the use of a typedef
462f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor    //   (7.1.3) or of a template type argument (14.3), in which
463f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor    //   case the cv-qualifiers are ignored.
4641a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor    // FIXME: Shouldn't we be checking SCS_typedef here?
4651a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor    if (DS.getTypeSpecType() == DeclSpec::TST_typename &&
466f1f9b4e5c7fd087e78f2e387c01098d49d41e784Douglas Gregor        TypeQuals && Result->isReferenceType()) {
4670953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      TypeQuals &= ~DeclSpec::TQ_const;
4680953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      TypeQuals &= ~DeclSpec::TQ_volatile;
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
4701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4710953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    Qualifiers Quals = Qualifiers::fromCVRMask(TypeQuals);
4720953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    Result = Context.getQualifiedType(Result, Quals);
47396b77fc05ed4a052a9e614f72b0e83572408ce48Chris Lattner  }
4740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
475f1d705c3e2276f7f5b97b8b3394b9b3068fdf25bChris Lattner  return Result;
476f1d705c3e2276f7f5b97b8b3394b9b3068fdf25bChris Lattner}
477f1d705c3e2276f7f5b97b8b3394b9b3068fdf25bChris Lattner
478cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregorstatic std::string getPrintableNameForEntity(DeclarationName Entity) {
479cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  if (Entity)
480cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    return Entity.getAsString();
4811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
482cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  return "type name";
483cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor}
484cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor
4852865474261a608c7873b87ba4af110d17907896dJohn McCallQualType Sema::BuildQualifiedType(QualType T, SourceLocation Loc,
4862865474261a608c7873b87ba4af110d17907896dJohn McCall                                  Qualifiers Qs) {
4872865474261a608c7873b87ba4af110d17907896dJohn McCall  // Enforce C99 6.7.3p2: "Types other than pointer types derived from
4882865474261a608c7873b87ba4af110d17907896dJohn McCall  // object or incomplete types shall not be restrict-qualified."
4892865474261a608c7873b87ba4af110d17907896dJohn McCall  if (Qs.hasRestrict()) {
4902865474261a608c7873b87ba4af110d17907896dJohn McCall    unsigned DiagID = 0;
4912865474261a608c7873b87ba4af110d17907896dJohn McCall    QualType ProblemTy;
4922865474261a608c7873b87ba4af110d17907896dJohn McCall
4932865474261a608c7873b87ba4af110d17907896dJohn McCall    const Type *Ty = T->getCanonicalTypeInternal().getTypePtr();
4942865474261a608c7873b87ba4af110d17907896dJohn McCall    if (const ReferenceType *RTy = dyn_cast<ReferenceType>(Ty)) {
4952865474261a608c7873b87ba4af110d17907896dJohn McCall      if (!RTy->getPointeeType()->isIncompleteOrObjectType()) {
4962865474261a608c7873b87ba4af110d17907896dJohn McCall        DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
4972865474261a608c7873b87ba4af110d17907896dJohn McCall        ProblemTy = T->getAs<ReferenceType>()->getPointeeType();
4982865474261a608c7873b87ba4af110d17907896dJohn McCall      }
4992865474261a608c7873b87ba4af110d17907896dJohn McCall    } else if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
5002865474261a608c7873b87ba4af110d17907896dJohn McCall      if (!PTy->getPointeeType()->isIncompleteOrObjectType()) {
5012865474261a608c7873b87ba4af110d17907896dJohn McCall        DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
5022865474261a608c7873b87ba4af110d17907896dJohn McCall        ProblemTy = T->getAs<PointerType>()->getPointeeType();
5032865474261a608c7873b87ba4af110d17907896dJohn McCall      }
5042865474261a608c7873b87ba4af110d17907896dJohn McCall    } else if (const MemberPointerType *PTy = dyn_cast<MemberPointerType>(Ty)) {
5052865474261a608c7873b87ba4af110d17907896dJohn McCall      if (!PTy->getPointeeType()->isIncompleteOrObjectType()) {
5062865474261a608c7873b87ba4af110d17907896dJohn McCall        DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
5072865474261a608c7873b87ba4af110d17907896dJohn McCall        ProblemTy = T->getAs<PointerType>()->getPointeeType();
5082865474261a608c7873b87ba4af110d17907896dJohn McCall      }
5092865474261a608c7873b87ba4af110d17907896dJohn McCall    } else if (!Ty->isDependentType()) {
5102865474261a608c7873b87ba4af110d17907896dJohn McCall      // FIXME: this deserves a proper diagnostic
5112865474261a608c7873b87ba4af110d17907896dJohn McCall      DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
5122865474261a608c7873b87ba4af110d17907896dJohn McCall      ProblemTy = T;
5132865474261a608c7873b87ba4af110d17907896dJohn McCall    }
5142865474261a608c7873b87ba4af110d17907896dJohn McCall
5152865474261a608c7873b87ba4af110d17907896dJohn McCall    if (DiagID) {
5162865474261a608c7873b87ba4af110d17907896dJohn McCall      Diag(Loc, DiagID) << ProblemTy;
5172865474261a608c7873b87ba4af110d17907896dJohn McCall      Qs.removeRestrict();
5182865474261a608c7873b87ba4af110d17907896dJohn McCall    }
5192865474261a608c7873b87ba4af110d17907896dJohn McCall  }
5202865474261a608c7873b87ba4af110d17907896dJohn McCall
5212865474261a608c7873b87ba4af110d17907896dJohn McCall  return Context.getQualifiedType(T, Qs);
5222865474261a608c7873b87ba4af110d17907896dJohn McCall}
5232865474261a608c7873b87ba4af110d17907896dJohn McCall
524cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \brief Build a pointer type.
525cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
526cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \param T The type to which we'll be building a pointer.
527cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
528cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \param Loc The location of the entity whose type involves this
529cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// pointer type or, if there is no such entity, the location of the
530cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// type that will have pointer type.
531cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
532cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \param Entity The name of the entity that involves the pointer
533cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// type, if known.
534cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
535cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \returns A suitable pointer type, if there are no
536cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// errors. Otherwise, returns a NULL type.
5372865474261a608c7873b87ba4af110d17907896dJohn McCallQualType Sema::BuildPointerType(QualType T,
538cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor                                SourceLocation Loc, DeclarationName Entity) {
539cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  if (T->isReferenceType()) {
540cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    // C++ 8.3.2p4: There shall be no ... pointers to references ...
541cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    Diag(Loc, diag::err_illegal_decl_pointer_to_reference)
542ac406052f7b980f8caa6b07b4a8d0867d53852c4John McCall      << getPrintableNameForEntity(Entity) << T;
543cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    return QualType();
544cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  }
545cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor
546c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(!T->isObjCObjectType() && "Should build ObjCObjectPointerType");
54792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
548cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  // Build the pointer type.
5492865474261a608c7873b87ba4af110d17907896dJohn McCall  return Context.getPointerType(T);
550cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor}
551cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor
552cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \brief Build a reference type.
553cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
554cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \param T The type to which we'll be building a reference.
555cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
556cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \param Loc The location of the entity whose type involves this
557cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// reference type or, if there is no such entity, the location of the
558cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// type that will have reference type.
559cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
560cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \param Entity The name of the entity that involves the reference
561cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// type, if known.
562cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
563cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \returns A suitable reference type, if there are no
564cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// errors. Otherwise, returns a NULL type.
56554e14c4db764c0636160d26c5bbf491637c83a76John McCallQualType Sema::BuildReferenceType(QualType T, bool SpelledAsLValue,
5662865474261a608c7873b87ba4af110d17907896dJohn McCall                                  SourceLocation Loc,
56754e14c4db764c0636160d26c5bbf491637c83a76John McCall                                  DeclarationName Entity) {
56854e14c4db764c0636160d26c5bbf491637c83a76John McCall  bool LValueRef = SpelledAsLValue || T->getAs<LValueReferenceType>();
56954e14c4db764c0636160d26c5bbf491637c83a76John McCall
57054e14c4db764c0636160d26c5bbf491637c83a76John McCall  // C++0x [dcl.typedef]p9: If a typedef TD names a type that is a
57154e14c4db764c0636160d26c5bbf491637c83a76John McCall  //   reference to a type T, and attempt to create the type "lvalue
57254e14c4db764c0636160d26c5bbf491637c83a76John McCall  //   reference to cv TD" creates the type "lvalue reference to T".
57354e14c4db764c0636160d26c5bbf491637c83a76John McCall  // We use the qualifiers (restrict or none) of the original reference,
57454e14c4db764c0636160d26c5bbf491637c83a76John McCall  // not the new ones. This is consistent with GCC.
57554e14c4db764c0636160d26c5bbf491637c83a76John McCall
57654e14c4db764c0636160d26c5bbf491637c83a76John McCall  // C++ [dcl.ref]p4: There shall be no references to references.
57754e14c4db764c0636160d26c5bbf491637c83a76John McCall  //
57854e14c4db764c0636160d26c5bbf491637c83a76John McCall  // According to C++ DR 106, references to references are only
57954e14c4db764c0636160d26c5bbf491637c83a76John McCall  // diagnosed when they are written directly (e.g., "int & &"),
58054e14c4db764c0636160d26c5bbf491637c83a76John McCall  // but not when they happen via a typedef:
58154e14c4db764c0636160d26c5bbf491637c83a76John McCall  //
58254e14c4db764c0636160d26c5bbf491637c83a76John McCall  //   typedef int& intref;
58354e14c4db764c0636160d26c5bbf491637c83a76John McCall  //   typedef intref& intref2;
58454e14c4db764c0636160d26c5bbf491637c83a76John McCall  //
58554e14c4db764c0636160d26c5bbf491637c83a76John McCall  // Parser::ParseDeclaratorInternal diagnoses the case where
58654e14c4db764c0636160d26c5bbf491637c83a76John McCall  // references are written directly; here, we handle the
58754e14c4db764c0636160d26c5bbf491637c83a76John McCall  // collapsing of references-to-references as described in C++
58854e14c4db764c0636160d26c5bbf491637c83a76John McCall  // DR 106 and amended by C++ DR 540.
589cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor
590cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  // C++ [dcl.ref]p1:
59133a3138a0862cafdd9ff1332b834454a79cd2cdcEli Friedman  //   A declarator that specifies the type "reference to cv void"
592cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  //   is ill-formed.
593cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  if (T->isVoidType()) {
594cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    Diag(Loc, diag::err_reference_to_void);
595cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    return QualType();
596cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  }
597cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor
598cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  // Handle restrict on references.
5997c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  if (LValueRef)
6002865474261a608c7873b87ba4af110d17907896dJohn McCall    return Context.getLValueReferenceType(T, SpelledAsLValue);
6012865474261a608c7873b87ba4af110d17907896dJohn McCall  return Context.getRValueReferenceType(T);
602cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor}
603cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor
604cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \brief Build an array type.
605cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
606cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \param T The type of each element in the array.
607cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
608cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \param ASM C99 array size modifier (e.g., '*', 'static').
6091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump///
6101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \param ArraySize Expression describing the size of the array.
611cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
612cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \param Loc The location of the entity whose type involves this
613cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// array type or, if there is no such entity, the location of the
614cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// type that will have array type.
615cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
616cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \param Entity The name of the entity that involves the array
617cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// type, if known.
618cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor///
619cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// \returns A suitable array type, if there are no errors. Otherwise,
620cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor/// returns a NULL type.
621cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas GregorQualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM,
622cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor                              Expr *ArraySize, unsigned Quals,
6237e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                              SourceRange Brackets, DeclarationName Entity) {
6240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
6257e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  SourceLocation Loc = Brackets.getBegin();
626923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  if (getLangOptions().CPlusPlus) {
627138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    // C++ [dcl.array]p1:
628138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    //   T is called the array element type; this type shall not be a reference
629138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    //   type, the (possibly cv-qualified) type void, a function type or an
630138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    //   abstract class type.
631138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    //
632138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    // Note: function types are handled in the common path with C.
633138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    if (T->isReferenceType()) {
634138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor      Diag(Loc, diag::err_illegal_decl_array_of_references)
635138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor      << getPrintableNameForEntity(Entity) << T;
636138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor      return QualType();
637138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    }
638138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor
639923d56d436f750bc1f29db50e641078725558a1bSebastian Redl    if (T->isVoidType()) {
640923d56d436f750bc1f29db50e641078725558a1bSebastian Redl      Diag(Loc, diag::err_illegal_decl_array_incomplete_type) << T;
641923d56d436f750bc1f29db50e641078725558a1bSebastian Redl      return QualType();
642923d56d436f750bc1f29db50e641078725558a1bSebastian Redl    }
643138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor
644138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    if (RequireNonAbstractType(Brackets.getBegin(), T,
645138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor                               diag::err_array_of_abstract_type))
646138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor      return QualType();
647138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor
648923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  } else {
649138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    // C99 6.7.5.2p1: If the element type is an incomplete or function type,
650138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregor    // reject it (e.g. void ary[7], struct foo ary[7], void ary[7]())
651923d56d436f750bc1f29db50e641078725558a1bSebastian Redl    if (RequireCompleteType(Loc, T,
652923d56d436f750bc1f29db50e641078725558a1bSebastian Redl                            diag::err_illegal_decl_array_incomplete_type))
653923d56d436f750bc1f29db50e641078725558a1bSebastian Redl      return QualType();
654923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  }
655cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor
656cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  if (T->isFunctionType()) {
657cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    Diag(Loc, diag::err_illegal_decl_array_of_functions)
658ac406052f7b980f8caa6b07b4a8d0867d53852c4John McCall      << getPrintableNameForEntity(Entity) << T;
659cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    return QualType();
660cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  }
6611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
662e7cf07d8df83e083505c7105c50b2797493008a6Anders Carlsson  if (Context.getCanonicalType(T) == Context.UndeducedAutoTy) {
6631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Diag(Loc,  diag::err_illegal_decl_array_of_auto)
664e7cf07d8df83e083505c7105c50b2797493008a6Anders Carlsson      << getPrintableNameForEntity(Entity);
665e7cf07d8df83e083505c7105c50b2797493008a6Anders Carlsson    return QualType();
666e7cf07d8df83e083505c7105c50b2797493008a6Anders Carlsson  }
6671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6686217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  if (const RecordType *EltTy = T->getAs<RecordType>()) {
669cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    // If the element type is a struct or union that contains a variadic
670cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    // array, accept it as a GNU extension: C99 6.7.2.1p2.
671cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    if (EltTy->getDecl()->hasFlexibleArrayMember())
672cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor      Diag(Loc, diag::ext_flexible_array_in_array) << T;
673c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  } else if (T->isObjCObjectType()) {
674c7c11b1ba6a110f2416889cc3576fe33277b2a33Chris Lattner    Diag(Loc, diag::err_objc_array_of_interfaces) << T;
675c7c11b1ba6a110f2416889cc3576fe33277b2a33Chris Lattner    return QualType();
676cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  }
6771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
678cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  // C99 6.7.5.2p1: The size expression shall have integer type.
679cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  if (ArraySize && !ArraySize->isTypeDependent() &&
6801274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor      !ArraySize->getType()->isIntegralOrUnscopedEnumerationType()) {
681cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    Diag(ArraySize->getLocStart(), diag::err_array_size_non_int)
682cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor      << ArraySize->getType() << ArraySize->getSourceRange();
683cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    return QualType();
684cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  }
6852767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor  llvm::APSInt ConstVal(Context.getTypeSize(Context.getSizeType()));
686cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  if (!ArraySize) {
687f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman    if (ASM == ArrayType::Star)
6887e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor      T = Context.getVariableArrayType(T, 0, ASM, Quals, Brackets);
689f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman    else
690f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman      T = Context.getIncompleteArrayType(T, ASM, Quals);
691ac06a0e1e3feb95c2ffd352c086882b492a65b99Douglas Gregor  } else if (ArraySize->isTypeDependent() || ArraySize->isValueDependent()) {
6927e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    T = Context.getDependentSizedArrayType(T, ArraySize, ASM, Quals, Brackets);
693cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  } else if (!ArraySize->isIntegerConstantExpr(ConstVal, Context) ||
694923d56d436f750bc1f29db50e641078725558a1bSebastian Redl             (!T->isDependentType() && !T->isIncompleteType() &&
695923d56d436f750bc1f29db50e641078725558a1bSebastian Redl              !T->isConstantSizeType())) {
696cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    // Per C99, a variable array is an array with either a non-constant
697cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    // size or an element type that has a non-constant-size
6987e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    T = Context.getVariableArrayType(T, ArraySize, ASM, Quals, Brackets);
699cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  } else {
700cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    // C99 6.7.5.2p1: If the expression is a constant expression, it shall
701cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    // have a value greater than zero.
702923d56d436f750bc1f29db50e641078725558a1bSebastian Redl    if (ConstVal.isSigned() && ConstVal.isNegative()) {
703923d56d436f750bc1f29db50e641078725558a1bSebastian Redl      Diag(ArraySize->getLocStart(),
704923d56d436f750bc1f29db50e641078725558a1bSebastian Redl           diag::err_typecheck_negative_array_size)
705923d56d436f750bc1f29db50e641078725558a1bSebastian Redl        << ArraySize->getSourceRange();
706923d56d436f750bc1f29db50e641078725558a1bSebastian Redl      return QualType();
707923d56d436f750bc1f29db50e641078725558a1bSebastian Redl    }
708923d56d436f750bc1f29db50e641078725558a1bSebastian Redl    if (ConstVal == 0) {
70902024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor      // GCC accepts zero sized static arrays. We allow them when
71002024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor      // we're not in a SFINAE context.
71102024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor      Diag(ArraySize->getLocStart(),
71202024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor           isSFINAEContext()? diag::err_typecheck_zero_array_size
71302024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor                            : diag::ext_typecheck_zero_array_size)
714923d56d436f750bc1f29db50e641078725558a1bSebastian Redl        << ArraySize->getSourceRange();
7152767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor    } else if (!T->isDependentType() && !T->isVariablyModifiedType() &&
7162767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor               !T->isIncompleteType()) {
7172767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor      // Is the array too large?
7182767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor      unsigned ActiveSizeBits
7192767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor        = ConstantArrayType::getNumAddressingBits(Context, T, ConstVal);
7202767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor      if (ActiveSizeBits > ConstantArrayType::getMaxSizeBits(Context))
7212767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor        Diag(ArraySize->getLocStart(), diag::err_array_too_large)
7222767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor          << ConstVal.toString(10)
7232767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor          << ArraySize->getSourceRange();
7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
7252767ce2e21d8bc17869b8436220bce719b3369e4Douglas Gregor
72646a617a792bfab0d9b1e057371ea3b9540802226John McCall    T = Context.getConstantArrayType(T, ConstVal, ASM, Quals);
727cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  }
728af40776922bc5c28e740adb0342faa09f35b0068David Chisnall  // If this is not C99, extwarn about VLA's and C99 array size modifiers.
729af40776922bc5c28e740adb0342faa09f35b0068David Chisnall  if (!getLangOptions().C99) {
7300fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor    if (T->isVariableArrayType()) {
7310fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor      // Prohibit the use of non-POD types in VLAs.
732204ce17e0cfd9bbe229627e1e5a20c3f2f587c8cDouglas Gregor      if (!T->isDependentType() &&
733204ce17e0cfd9bbe229627e1e5a20c3f2f587c8cDouglas Gregor          !Context.getBaseElementType(T)->isPODType()) {
7340fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor        Diag(Loc, diag::err_vla_non_pod)
7350fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor          << Context.getBaseElementType(T);
7360fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor        return QualType();
7370fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor      }
738a481ec4150ad203440852a2bfee0883dd26f7530Douglas Gregor      // Prohibit the use of VLAs during template argument deduction.
739a481ec4150ad203440852a2bfee0883dd26f7530Douglas Gregor      else if (isSFINAEContext()) {
740a481ec4150ad203440852a2bfee0883dd26f7530Douglas Gregor        Diag(Loc, diag::err_vla_in_sfinae);
741a481ec4150ad203440852a2bfee0883dd26f7530Douglas Gregor        return QualType();
742a481ec4150ad203440852a2bfee0883dd26f7530Douglas Gregor      }
7430fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor      // Just extwarn about VLAs.
7440fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor      else
7450fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor        Diag(Loc, diag::ext_vla);
7460fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor    } else if (ASM != ArrayType::Normal || Quals != 0)
747043cad21b78c6b02597cdc7b6ead32388e27ebc7Douglas Gregor      Diag(Loc,
748043cad21b78c6b02597cdc7b6ead32388e27ebc7Douglas Gregor           getLangOptions().CPlusPlus? diag::err_c99_array_usage_cxx
749043cad21b78c6b02597cdc7b6ead32388e27ebc7Douglas Gregor                                     : diag::ext_c99_array_usage);
750cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  }
751cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor
752cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  return T;
753cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor}
7549cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor
7559cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor/// \brief Build an ext-vector type.
7569cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor///
7579cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor/// Run the required checks for the extended vector type.
7589ae2f076ca5ab1feb3ba95629099ec2319833701John McCallQualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize,
7599cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor                                  SourceLocation AttrLoc) {
7609cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  // unlike gcc's vector_size attribute, we do not allow vectors to be defined
7619cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  // in conjunction with complex types (pointers, arrays, functions, etc.).
7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!T->isDependentType() &&
7639cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor      !T->isIntegerType() && !T->isRealFloatingType()) {
7649cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    Diag(AttrLoc, diag::err_attribute_invalid_vector_type) << T;
7659cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    return QualType();
7669cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  }
7679cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor
7689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!ArraySize->isTypeDependent() && !ArraySize->isValueDependent()) {
7699cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    llvm::APSInt vecSize(32);
7709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!ArraySize->isIntegerConstantExpr(vecSize, Context)) {
7719cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor      Diag(AttrLoc, diag::err_attribute_argument_not_int)
7729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        << "ext_vector_type" << ArraySize->getSourceRange();
7739cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor      return QualType();
7749cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    }
7751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // unlike gcc's vector_size attribute, the size is specified as the
7779cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    // number of elements, not the number of bytes.
7781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    unsigned vectorSize = static_cast<unsigned>(vecSize.getZExtValue());
7791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7809cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    if (vectorSize == 0) {
7819cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor      Diag(AttrLoc, diag::err_attribute_zero_size)
7829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      << ArraySize->getSourceRange();
7839cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor      return QualType();
7849cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    }
7851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7869cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    if (!T->isDependentType())
7879cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor      return Context.getExtVectorType(T, vectorSize);
7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
7891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return Context.getDependentSizedExtVectorType(T, ArraySize, AttrLoc);
7919cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor}
7921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
793724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// \brief Build a function type.
794724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor///
795724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// This routine checks the function type according to C++ rules and
796724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// under the assumption that the result type and parameter types have
797724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// just been instantiated from a template. It therefore duplicates
7982943aed177b33ae3f14273b11a7b398e5276ec62Douglas Gregor/// some of the behavior of GetTypeForDeclarator, but in a much
799724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// simpler form that is only suitable for this narrow use case.
800724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor///
801724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// \param T The return type of the function.
802724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor///
803724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// \param ParamTypes The parameter types of the function. This array
804724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// will be modified to account for adjustments to the types of the
805724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// function parameters.
806724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor///
807724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// \param NumParamTypes The number of parameter types in ParamTypes.
808724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor///
809724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// \param Variadic Whether this is a variadic function type.
810724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor///
811724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// \param Quals The cvr-qualifiers to be applied to the function type.
812724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor///
813724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// \param Loc The location of the entity whose type involves this
814724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// function type or, if there is no such entity, the location of the
815724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// type that will have function type.
816724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor///
817724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// \param Entity The name of the entity that involves the function
818724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// type, if known.
819724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor///
820724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// \returns A suitable function type, if there are no
821724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor/// errors. Otherwise, returns a NULL type.
822724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas GregorQualType Sema::BuildFunctionType(QualType T,
8231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 QualType *ParamTypes,
824724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor                                 unsigned NumParamTypes,
825724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor                                 bool Variadic, unsigned Quals,
826fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                 SourceLocation Loc, DeclarationName Entity,
827fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                 const FunctionType::ExtInfo &Info) {
828724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor  if (T->isArrayType() || T->isFunctionType()) {
82958408bc4ead86b08af56cd06fc966fd858b48b2dDouglas Gregor    Diag(Loc, diag::err_func_returning_array_function)
83058408bc4ead86b08af56cd06fc966fd858b48b2dDouglas Gregor      << T->isFunctionType() << T;
831724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor    return QualType();
832724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor  }
8335291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor
834724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor  bool Invalid = false;
835724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor  for (unsigned Idx = 0; Idx < NumParamTypes; ++Idx) {
8362dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor    QualType ParamType = adjustParameterType(ParamTypes[Idx]);
8372dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor    if (ParamType->isVoidType()) {
838724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor      Diag(Loc, diag::err_param_with_void_type);
839724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor      Invalid = true;
840724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor    }
841cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor
84254e14c4db764c0636160d26c5bbf491637c83a76John McCall    ParamTypes[Idx] = ParamType;
843724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor  }
844724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor
845724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor  if (Invalid)
846724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor    return QualType();
847724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor
8481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return Context.getFunctionType(T, ParamTypes, NumParamTypes, Variadic,
849fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                 Quals, false, false, 0, 0, Info);
850724651c3523e25fbf2f6cd0419bc3466e0afdb07Douglas Gregor}
8511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
852949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor/// \brief Build a member pointer type \c T Class::*.
853949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor///
854949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor/// \param T the type to which the member pointer refers.
855949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor/// \param Class the class type into which the member pointer points.
8560953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// \param CVR Qualifiers applied to the member pointer type
857949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor/// \param Loc the location where this type begins
858949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor/// \param Entity the name of the entity that will have this member pointer type
859949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor///
860949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor/// \returns a member pointer type, if successful, or a NULL type if there was
861949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor/// an error.
8621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType Sema::BuildMemberPointerType(QualType T, QualType Class,
8632865474261a608c7873b87ba4af110d17907896dJohn McCall                                      SourceLocation Loc,
864949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor                                      DeclarationName Entity) {
865949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  // Verify that we're not building a pointer to pointer to function with
866949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  // exception specification.
867949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  if (CheckDistantExceptionSpec(T)) {
868949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    Diag(Loc, diag::err_distant_exception_spec);
869949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor
870949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    // FIXME: If we're doing this as part of template instantiation,
871949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    // we should return immediately.
872949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor
873949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    // Build the type anyway, but use the canonical type so that the
874949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    // exception specifiers are stripped off.
875949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    T = Context.getCanonicalType(T);
876949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  }
877949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor
878737801257f795632175517ffce4a80c62fc7bff7Sebastian Redl  // C++ 8.3.3p3: A pointer to member shall not point to ... a member
879949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  //   with reference type, or "cv void."
880949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  if (T->isReferenceType()) {
8818d4655d3b966da02fe0588767160448594cddd61Anders Carlsson    Diag(Loc, diag::err_illegal_decl_mempointer_to_reference)
882ac406052f7b980f8caa6b07b4a8d0867d53852c4John McCall      << (Entity? Entity.getAsString() : "type name") << T;
883949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    return QualType();
884949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  }
885949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor
886949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  if (T->isVoidType()) {
887949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    Diag(Loc, diag::err_illegal_decl_mempointer_to_void)
888949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor      << (Entity? Entity.getAsString() : "type name");
889949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    return QualType();
890949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  }
891949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor
892949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  if (!Class->isDependentType() && !Class->isRecordType()) {
893949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    Diag(Loc, diag::err_mempointer_in_nonclass_type) << Class;
894949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor    return QualType();
895949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor  }
896949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor
897d18f9f965bcfe56edcdf9b0d8375ffaad9866b3fCharles Davis  // In the Microsoft ABI, the class is allowed to be an incomplete
898d18f9f965bcfe56edcdf9b0d8375ffaad9866b3fCharles Davis  // type. In such cases, the compiler makes a worst-case assumption.
899d18f9f965bcfe56edcdf9b0d8375ffaad9866b3fCharles Davis  // We make no such assumption right now, so emit an error if the
900d18f9f965bcfe56edcdf9b0d8375ffaad9866b3fCharles Davis  // class isn't a complete type.
90120cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis  if (Context.Target.getCXXABI() == CXXABI_Microsoft &&
902d18f9f965bcfe56edcdf9b0d8375ffaad9866b3fCharles Davis      RequireCompleteType(Loc, Class, diag::err_incomplete_type))
903d18f9f965bcfe56edcdf9b0d8375ffaad9866b3fCharles Davis    return QualType();
904d18f9f965bcfe56edcdf9b0d8375ffaad9866b3fCharles Davis
9052865474261a608c7873b87ba4af110d17907896dJohn McCall  return Context.getMemberPointerType(T, Class.getTypePtr());
906949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor}
9071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9089a917e4fac79aba20fbd25983c78396475078918Anders Carlsson/// \brief Build a block pointer type.
9099a917e4fac79aba20fbd25983c78396475078918Anders Carlsson///
9109a917e4fac79aba20fbd25983c78396475078918Anders Carlsson/// \param T The type to which we'll be building a block pointer.
9119a917e4fac79aba20fbd25983c78396475078918Anders Carlsson///
9120953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// \param CVR The cvr-qualifiers to be applied to the block pointer type.
9139a917e4fac79aba20fbd25983c78396475078918Anders Carlsson///
9149a917e4fac79aba20fbd25983c78396475078918Anders Carlsson/// \param Loc The location of the entity whose type involves this
9159a917e4fac79aba20fbd25983c78396475078918Anders Carlsson/// block pointer type or, if there is no such entity, the location of the
9169a917e4fac79aba20fbd25983c78396475078918Anders Carlsson/// type that will have block pointer type.
9179a917e4fac79aba20fbd25983c78396475078918Anders Carlsson///
9189a917e4fac79aba20fbd25983c78396475078918Anders Carlsson/// \param Entity The name of the entity that involves the block pointer
9199a917e4fac79aba20fbd25983c78396475078918Anders Carlsson/// type, if known.
9209a917e4fac79aba20fbd25983c78396475078918Anders Carlsson///
9219a917e4fac79aba20fbd25983c78396475078918Anders Carlsson/// \returns A suitable block pointer type, if there are no
9229a917e4fac79aba20fbd25983c78396475078918Anders Carlsson/// errors. Otherwise, returns a NULL type.
9232865474261a608c7873b87ba4af110d17907896dJohn McCallQualType Sema::BuildBlockPointerType(QualType T,
9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     SourceLocation Loc,
9259a917e4fac79aba20fbd25983c78396475078918Anders Carlsson                                     DeclarationName Entity) {
9260953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  if (!T->isFunctionType()) {
9279a917e4fac79aba20fbd25983c78396475078918Anders Carlsson    Diag(Loc, diag::err_nonfunction_block_type);
9289a917e4fac79aba20fbd25983c78396475078918Anders Carlsson    return QualType();
9299a917e4fac79aba20fbd25983c78396475078918Anders Carlsson  }
9301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9312865474261a608c7873b87ba4af110d17907896dJohn McCall  return Context.getBlockPointerType(T);
9329a917e4fac79aba20fbd25983c78396475078918Anders Carlsson}
9339a917e4fac79aba20fbd25983c78396475078918Anders Carlsson
934b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCallQualType Sema::GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo) {
935b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  QualType QT = Ty.get();
9363f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  if (QT.isNull()) {
937a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    if (TInfo) *TInfo = 0;
9383f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor    return QualType();
9393f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  }
9403f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor
941a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = 0;
942e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis  if (LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) {
943e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis    QT = LIT->getType();
944a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    DI = LIT->getTypeSourceInfo();
945e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis  }
9461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
947a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  if (TInfo) *TInfo = DI;
948e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis  return QT;
949e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis}
950e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis
95198eb8a7a702b95183ed015706b1f1c66f5cb27a4Mike Stump/// GetTypeForDeclarator - Convert the type for the specified
9528ce35b095e8fca45e04c1bda14ed0548ce7536adSebastian Redl/// declarator to Type instances.
953402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor///
954402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor/// If OwnedDecl is non-NULL, and this declarator's decl-specifier-seq
955402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor/// owns the declaration of a type (e.g., the definition of a struct
956402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor/// type), then *OwnedDecl will receive the owned declaration.
957bf1a028246d884a540aeafa38e89be59a269b072John McCall///
958bf1a028246d884a540aeafa38e89be59a269b072John McCall/// The result of this call will never be null, but the associated
959bf1a028246d884a540aeafa38e89be59a269b072John McCall/// type may be a null type if there's an unrecoverable error.
960bf1a028246d884a540aeafa38e89be59a269b072John McCallTypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
961bf1a028246d884a540aeafa38e89be59a269b072John McCall                                           TagDecl **OwnedDecl) {
962930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor  // Determine the type of the declarator. Not all forms of declarator
963930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor  // have a type.
964930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor  QualType T;
96505baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor  TypeSourceInfo *ReturnTypeInfo = 0;
96605baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor
96704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  llvm::SmallVector<DelayedAttribute,4> FnAttrsFromDeclSpec;
96804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
9693f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  switch (D.getName().getKind()) {
9703f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  case UnqualifiedId::IK_Identifier:
9713f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  case UnqualifiedId::IK_OperatorFunctionId:
9720486d746019f8310589b1f0d92edcc4bb3916b33Sean Hunt  case UnqualifiedId::IK_LiteralOperatorId:
9733f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  case UnqualifiedId::IK_TemplateId:
97404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    T = ConvertDeclSpecToType(*this, D, FnAttrsFromDeclSpec);
9755db2bb1cb0c040dcbca1b5000f091d6d225b4bfeChris Lattner
976591bd3cb605f1f0229b4b1d8a4b8183377064ec5Douglas Gregor    if (!D.isInvalidType() && D.getDeclSpec().isTypeSpecOwned()) {
977b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall      TagDecl* Owned = cast<TagDecl>(D.getDeclSpec().getRepAsDecl());
978b37b648b3f2bba4c557a1604ced19b526b25a372Douglas Gregor      // Owned is embedded if it was defined here, or if it is the
979b37b648b3f2bba4c557a1604ced19b526b25a372Douglas Gregor      // very first (i.e., canonical) declaration of this tag type.
980b37b648b3f2bba4c557a1604ced19b526b25a372Douglas Gregor      Owned->setEmbeddedInDeclarator(Owned->isDefinition() ||
981b37b648b3f2bba4c557a1604ced19b526b25a372Douglas Gregor                                     Owned->isCanonicalDecl());
982591bd3cb605f1f0229b4b1d8a4b8183377064ec5Douglas Gregor      if (OwnedDecl) *OwnedDecl = Owned;
983591bd3cb605f1f0229b4b1d8a4b8183377064ec5Douglas Gregor    }
984930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor    break;
985930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor
9863f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  case UnqualifiedId::IK_ConstructorName:
9870efc2c1716be4f1c5f1343cad3b047e74861f030Douglas Gregor  case UnqualifiedId::IK_ConstructorTemplateId:
9883f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  case UnqualifiedId::IK_DestructorName:
989930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor    // Constructors and destructors don't have return types. Use
99048026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor    // "void" instead.
991930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor    T = Context.VoidTy;
992930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor    break;
99348026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor
99448026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor  case UnqualifiedId::IK_ConversionFunctionId:
99548026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor    // The result type of a conversion function is the type that it
99648026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor    // converts to.
99705baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor    T = GetTypeFromParser(D.getName().ConversionFunctionId,
998bf1a028246d884a540aeafa38e89be59a269b072John McCall                          &ReturnTypeInfo);
99948026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor    break;
1000930d8b5ecc074cca01ecd9a522a55f55f3b72396Douglas Gregor  }
1001dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor
1002dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  // Check for auto functions and trailing return type and adjust the
1003dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  // return type accordingly.
1004dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  if (getLangOptions().CPlusPlus0x && D.isFunctionDeclarator()) {
1005dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    const DeclaratorChunk::FunctionTypeInfo &FTI = D.getTypeObject(0).Fun;
1006dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    if (T == Context.UndeducedAutoTy) {
1007dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      if (FTI.TrailingReturnType) {
1008dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor          T = GetTypeFromParser(ParsedType::getFromOpaquePtr(FTI.TrailingReturnType),
1009dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor                                &ReturnTypeInfo);
1010dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      }
1011dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      else {
1012dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor          Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
1013dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor               diag::err_auto_missing_trailing_return);
1014dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor          T = Context.IntTy;
1015dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor          D.setInvalidType(true);
1016dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      }
1017dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    }
1018dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    else if (FTI.TrailingReturnType) {
1019dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
1020dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor           diag::err_trailing_return_without_auto);
1021dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      D.setInvalidType(true);
1022dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    }
1023dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  }
1024dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor
10251f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor  if (T.isNull())
1026bf1a028246d884a540aeafa38e89be59a269b072John McCall    return Context.getNullTypeSourceInfo();
10271f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor
1028baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson  if (T == Context.UndeducedAutoTy) {
1029baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    int Error = -1;
10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1031baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    switch (D.getContext()) {
1032baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::KNRTypeListContext:
1033baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      assert(0 && "K&R type lists aren't allowed in C++");
1034baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      break;
1035baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::PrototypeContext:
1036baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      Error = 0; // Function prototype
1037baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      break;
1038baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::MemberContext:
1039baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      switch (cast<TagDecl>(CurContext)->getTagKind()) {
1040465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      case TTK_Enum: assert(0 && "unhandled tag kind"); break;
1041465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      case TTK_Struct: Error = 1; /* Struct member */ break;
1042465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      case TTK_Union:  Error = 2; /* Union member */ break;
1043465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      case TTK_Class:  Error = 3; /* Class member */ break;
10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
1045baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      break;
1046baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::CXXCatchContext:
1047baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      Error = 4; // Exception declaration
1048baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      break;
1049baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::TemplateParamContext:
1050baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      Error = 5; // Template parameter
1051baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      break;
1052baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::BlockLiteralContext:
1053baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      Error = 6;  // Block literal
1054baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      break;
1055baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::FileContext:
1056baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::BlockContext:
1057baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::ForContext:
1058baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::ConditionContext:
1059baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    case Declarator::TypeNameContext:
1060baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      break;
1061baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    }
1062baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson
1063baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    if (Error != -1) {
1064baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      Diag(D.getDeclSpec().getTypeSpecTypeLoc(), diag::err_auto_not_allowed)
1065baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson        << Error;
1066baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      T = Context.IntTy;
1067baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson      D.setInvalidType(true);
1068baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson    }
1069baf45d31f18e6d5b3d2a33695c2af6e6cbc4ee29Anders Carlsson  }
10701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1071cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  // The name we're declaring, if any.
1072cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  DeclarationName Name;
1073cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor  if (D.getIdentifier())
1074cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    Name = D.getIdentifier();
10751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
107604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  llvm::SmallVector<DelayedAttribute,4> FnAttrsFromPreviousChunk;
107704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
107898eb8a7a702b95183ed015706b1f1c66f5cb27a4Mike Stump  // Walk the DeclTypeInfo, building the recursive type as we go.
107998eb8a7a702b95183ed015706b1f1c66f5cb27a4Mike Stump  // DeclTypeInfos are ordered from the identifier out, which is
108098eb8a7a702b95183ed015706b1f1c66f5cb27a4Mike Stump  // opposite of what we want :).
10818ce35b095e8fca45e04c1bda14ed0548ce7536adSebastian Redl  for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
10828ce35b095e8fca45e04c1bda14ed0548ce7536adSebastian Redl    DeclaratorChunk &DeclType = D.getTypeObject(e-i-1);
10835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    switch (DeclType.Kind) {
10845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    default: assert(0 && "Unknown decltype!");
10855618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    case DeclaratorChunk::BlockPointer:
10869af5500f3f132f9a2f9abbe82113a7c7bb751472Chris Lattner      // If blocks are disabled, emit an error.
10879af5500f3f132f9a2f9abbe82113a7c7bb751472Chris Lattner      if (!LangOpts.Blocks)
10889af5500f3f132f9a2f9abbe82113a7c7bb751472Chris Lattner        Diag(DeclType.Loc, diag::err_blocks_disable);
10891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10902865474261a608c7873b87ba4af110d17907896dJohn McCall      T = BuildBlockPointerType(T, D.getIdentifierLoc(), Name);
10912865474261a608c7873b87ba4af110d17907896dJohn McCall      if (DeclType.Cls.TypeQuals)
10922865474261a608c7873b87ba4af110d17907896dJohn McCall        T = BuildQualifiedType(T, DeclType.Loc, DeclType.Cls.TypeQuals);
10935618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff      break;
10945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case DeclaratorChunk::Pointer:
10956a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      // Verify that we're not building a pointer to pointer to function with
10966a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      // exception specification.
10976a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
10986a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl        Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
10996a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl        D.setInvalidType(true);
11006a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl        // Build the type anyway.
11016a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      }
1102c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      if (getLangOptions().ObjC1 && T->getAs<ObjCObjectType>()) {
1103c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        T = Context.getObjCObjectPointerType(T);
11042865474261a608c7873b87ba4af110d17907896dJohn McCall        if (DeclType.Ptr.TypeQuals)
11052865474261a608c7873b87ba4af110d17907896dJohn McCall          T = BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
110614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        break;
110714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      }
11082865474261a608c7873b87ba4af110d17907896dJohn McCall      T = BuildPointerType(T, DeclType.Loc, Name);
11092865474261a608c7873b87ba4af110d17907896dJohn McCall      if (DeclType.Ptr.TypeQuals)
11102865474261a608c7873b87ba4af110d17907896dJohn McCall        T = BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
11115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      break;
11120953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    case DeclaratorChunk::Reference: {
11136a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      // Verify that we're not building a reference to pointer to function with
11146a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      // exception specification.
11156a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
11166a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl        Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
11176a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl        D.setInvalidType(true);
11186a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl        // Build the type anyway.
11196a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      }
11202865474261a608c7873b87ba4af110d17907896dJohn McCall      T = BuildReferenceType(T, DeclType.Ref.LValueRef, DeclType.Loc, Name);
11212865474261a608c7873b87ba4af110d17907896dJohn McCall
11222865474261a608c7873b87ba4af110d17907896dJohn McCall      Qualifiers Quals;
11232865474261a608c7873b87ba4af110d17907896dJohn McCall      if (DeclType.Ref.HasRestrict)
11242865474261a608c7873b87ba4af110d17907896dJohn McCall        T = BuildQualifiedType(T, DeclType.Loc, Qualifiers::Restrict);
11255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      break;
11260953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    }
11275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case DeclaratorChunk::Array: {
11286a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      // Verify that we're not building an array of pointers to function with
11296a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      // exception specification.
11306a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
11316a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl        Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
11326a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl        D.setInvalidType(true);
11336a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl        // Build the type anyway.
11346a7330c20cabf1cf1cd46f5dfc183ec3a72add66Sebastian Redl      }
1135fd89bc825026e44c68a68db72d4012fd6752e70fChris Lattner      DeclaratorChunk::ArrayTypeInfo &ATI = DeclType.Arr;
113694f81fd0b0f81a99d215b225c8c5616295b063f6Chris Lattner      Expr *ArraySize = static_cast<Expr*>(ATI.NumElts);
11375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ArrayType::ArraySizeModifier ASM;
11385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (ATI.isStar)
11395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        ASM = ArrayType::Star;
11405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      else if (ATI.hasStatic)
11415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        ASM = ArrayType::Static;
11425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      else
11435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        ASM = ArrayType::Normal;
1144f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman      if (ASM == ArrayType::Star &&
1145f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman          D.getContext() != Declarator::PrototypeContext) {
1146f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman        // FIXME: This check isn't quite right: it allows star in prototypes
1147f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman        // for function definitions, and disallows some edge cases detailed
1148f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman        // in http://gcc.gnu.org/ml/gcc-patches/2009-02/msg00133.html
1149f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman        Diag(DeclType.Loc, diag::err_array_star_outside_prototype);
1150f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman        ASM = ArrayType::Normal;
1151f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman        D.setInvalidType(true);
1152f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman      }
11530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      T = BuildArrayType(T, ASM, ArraySize,
11540953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                         Qualifiers::fromCVRMask(ATI.TypeQuals),
11557e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                         SourceRange(DeclType.Loc, DeclType.EndLoc), Name);
11565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      break;
11575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
1158f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    case DeclaratorChunk::Function: {
11595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      // If the function declarator has a prototype (i.e. it is not () and
11605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      // does not have a K&R-style identifier list), then the arguments are part
11615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      // of the type, otherwise the argument list is ().
11625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      const DeclaratorChunk::FunctionTypeInfo &FTI = DeclType.Fun;
11633cc9726a493d90bd8faf094986a59352fd3461cbSebastian Redl
1164cd8812948bc8a65dcf10c541c1775e5ba44def6cChris Lattner      // C99 6.7.5.3p1: The return type may not be a function or array type.
116558408bc4ead86b08af56cd06fc966fd858b48b2dDouglas Gregor      // For conversion functions, we'll diagnose this particular error later.
116648026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor      if ((T->isArrayType() || T->isFunctionType()) &&
116748026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor          (D.getName().getKind() != UnqualifiedId::IK_ConversionFunctionId)) {
116858408bc4ead86b08af56cd06fc966fd858b48b2dDouglas Gregor        Diag(DeclType.Loc, diag::err_func_returning_array_function)
116958408bc4ead86b08af56cd06fc966fd858b48b2dDouglas Gregor          << T->isFunctionType() << T;
1170cd8812948bc8a65dcf10c541c1775e5ba44def6cChris Lattner        T = Context.IntTy;
1171cd8812948bc8a65dcf10c541c1775e5ba44def6cChris Lattner        D.setInvalidType(true);
1172cd8812948bc8a65dcf10c541c1775e5ba44def6cChris Lattner      }
1173465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
11745291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor      // cv-qualifiers on return types are pointless except when the type is a
11755291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor      // class type in C++.
11765291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor      if (T.getCVRQualifiers() && D.getDeclSpec().getTypeQualifiers() &&
11775291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor          (!getLangOptions().CPlusPlus ||
11785291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor           (!T->isDependentType() && !T->isRecordType()))) {
11795291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor        unsigned Quals = D.getDeclSpec().getTypeQualifiers();
1180de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor        std::string QualStr;
1181de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor        unsigned NumQuals = 0;
11825291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor        SourceLocation Loc;
1183de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor        if (Quals & Qualifiers::Const) {
11845291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor          Loc = D.getDeclSpec().getConstSpecLoc();
1185de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor          ++NumQuals;
1186de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor          QualStr = "const";
1187de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor        }
1188de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor        if (Quals & Qualifiers::Volatile) {
1189de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor          if (NumQuals == 0) {
1190de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor            Loc = D.getDeclSpec().getVolatileSpecLoc();
1191de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor            QualStr = "volatile";
1192de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor          } else
1193de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor            QualStr += " volatile";
1194de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor          ++NumQuals;
1195de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor        }
1196de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor        if (Quals & Qualifiers::Restrict) {
1197de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor          if (NumQuals == 0) {
1198de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor            Loc = D.getDeclSpec().getRestrictSpecLoc();
1199de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor            QualStr = "restrict";
1200de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor          } else
1201de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor            QualStr += " restrict";
1202de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor          ++NumQuals;
12035291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor        }
1204de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor        assert(NumQuals > 0 && "No known qualifiers?");
1205de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor
12065291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor        SemaDiagnosticBuilder DB = Diag(Loc, diag::warn_qual_return_type);
1207de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor        DB << QualStr << NumQuals;
12085291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor        if (Quals & Qualifiers::Const)
12095291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor          DB << FixItHint::CreateRemoval(D.getDeclSpec().getConstSpecLoc());
12105291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor        if (Quals & Qualifiers::Volatile)
12115291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor          DB << FixItHint::CreateRemoval(D.getDeclSpec().getVolatileSpecLoc());
12125291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor        if (Quals & Qualifiers::Restrict)
12135291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor          DB << FixItHint::CreateRemoval(D.getDeclSpec().getRestrictSpecLoc());
12145291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor      }
12155291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor
1216402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor      if (getLangOptions().CPlusPlus && D.getDeclSpec().isTypeSpecOwned()) {
1217402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor        // C++ [dcl.fct]p6:
1218402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor        //   Types shall not be defined in return or parameter types.
1219b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall        TagDecl *Tag = cast<TagDecl>(D.getDeclSpec().getRepAsDecl());
1220402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor        if (Tag->isDefinition())
1221402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor          Diag(Tag->getLocation(), diag::err_type_defined_in_result_type)
1222402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor            << Context.getTypeDeclType(Tag);
1223402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor      }
1224402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor
12253cc9726a493d90bd8faf094986a59352fd3461cbSebastian Redl      // Exception specs are not allowed in typedefs. Complain, but add it
12263cc9726a493d90bd8faf094986a59352fd3461cbSebastian Redl      // anyway.
12273cc9726a493d90bd8faf094986a59352fd3461cbSebastian Redl      if (FTI.hasExceptionSpec &&
12283cc9726a493d90bd8faf094986a59352fd3461cbSebastian Redl          D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef)
12293cc9726a493d90bd8faf094986a59352fd3461cbSebastian Redl        Diag(FTI.getThrowLoc(), diag::err_exception_spec_in_typedef);
12303cc9726a493d90bd8faf094986a59352fd3461cbSebastian Redl
12312865474261a608c7873b87ba4af110d17907896dJohn McCall      if (!FTI.NumArgs && !FTI.isVariadic && !getLangOptions().CPlusPlus) {
12322865474261a608c7873b87ba4af110d17907896dJohn McCall        // Simple void foo(), where the incoming T is the result type.
12332865474261a608c7873b87ba4af110d17907896dJohn McCall        T = Context.getFunctionNoProtoType(T);
12342865474261a608c7873b87ba4af110d17907896dJohn McCall      } else {
12352865474261a608c7873b87ba4af110d17907896dJohn McCall        // We allow a zero-parameter variadic function in C if the
12362865474261a608c7873b87ba4af110d17907896dJohn McCall        // function is marked with the "overloadable" attribute. Scan
12372865474261a608c7873b87ba4af110d17907896dJohn McCall        // for this attribute now.
12382865474261a608c7873b87ba4af110d17907896dJohn McCall        if (!FTI.NumArgs && FTI.isVariadic && !getLangOptions().CPlusPlus) {
1239965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor          bool Overloadable = false;
1240965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor          for (const AttributeList *Attrs = D.getAttributes();
1241965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor               Attrs; Attrs = Attrs->getNext()) {
1242965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor            if (Attrs->getKind() == AttributeList::AT_overloadable) {
1243965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor              Overloadable = true;
1244965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor              break;
1245965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor            }
1246965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor          }
1247965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor
1248965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor          if (!Overloadable)
1249965acbb321e94e36aa5365126eee46b97745fdbbDouglas Gregor            Diag(FTI.getEllipsisLoc(), diag::err_ellipsis_first_arg);
1250c6f7345e44e079f373d6bdecaa06c7e06574dc27Argyrios Kyrtzidis        }
12512865474261a608c7873b87ba4af110d17907896dJohn McCall
12522865474261a608c7873b87ba4af110d17907896dJohn McCall        if (FTI.NumArgs && FTI.ArgInfo[0].Param == 0) {
1253788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner          // C99 6.7.5.3p3: Reject int(x,y,z) when it's not a function
1254788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner          // definition.
12552865474261a608c7873b87ba4af110d17907896dJohn McCall          Diag(FTI.ArgInfo[0].IdentLoc, diag::err_ident_list_in_fn_declaration);
12562865474261a608c7873b87ba4af110d17907896dJohn McCall          D.setInvalidType(true);
12572865474261a608c7873b87ba4af110d17907896dJohn McCall          break;
12582865474261a608c7873b87ba4af110d17907896dJohn McCall        }
12592865474261a608c7873b87ba4af110d17907896dJohn McCall
12605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // Otherwise, we have a function with an argument list that is
12615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // potentially variadic.
12625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        llvm::SmallVector<QualType, 16> ArgTys;
12632865474261a608c7873b87ba4af110d17907896dJohn McCall        ArgTys.reserve(FTI.NumArgs);
12641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) {
1266d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall          ParmVarDecl *Param = cast<ParmVarDecl>(FTI.ArgInfo[i].Param);
12678123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner          QualType ArgTy = Param->getType();
126878c75fb3d275079c5fab30eeb33077958f2b0265Chris Lattner          assert(!ArgTy.isNull() && "Couldn't parse type?");
12692dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor
12702dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor          // Adjust the parameter type.
1271beb58cb83bd53b79b80fc6f9952efd985934cbfcDouglas Gregor          assert((ArgTy == adjustParameterType(ArgTy)) && "Unadjusted type?");
12722dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor
12735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          // Look for 'void'.  void is allowed only as a single argument to a
12745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          // function with no other parameters (C99 6.7.5.3p10).  We record
127572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor          // int(void) as a FunctionProtoType with an empty argument list.
12762dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor          if (ArgTy->isVoidType()) {
12775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            // If this is something like 'float(int, void)', reject it.  'void'
12785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            // is an incomplete type (C99 6.2.5p19) and function decls cannot
12795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            // have arguments of incomplete type.
12805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            if (FTI.NumArgs != 1 || FTI.isVariadic) {
12815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer              Diag(DeclType.Loc, diag::err_void_only_param);
12822ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner              ArgTy = Context.IntTy;
12838123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner              Param->setType(ArgTy);
12842ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner            } else if (FTI.ArgInfo[i].Ident) {
12852ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner              // Reject, but continue to parse 'int(void abc)'.
12865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer              Diag(FTI.ArgInfo[i].IdentLoc,
12874565d4e83cec55356fe9c75929579eacced9da36Chris Lattner                   diag::err_param_with_void_type);
12882ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner              ArgTy = Context.IntTy;
12898123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner              Param->setType(ArgTy);
12902ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner            } else {
12912ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner              // Reject, but continue to parse 'float(const void)'.
12920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall              if (ArgTy.hasQualifiers())
12932ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner                Diag(DeclType.Loc, diag::err_void_param_qualified);
12941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12952ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner              // Do not add 'void' to the ArgTys list.
12962ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner              break;
12972ff5426cd83ae02378efacdfeb70d6785eb09a30Chris Lattner            }
1298eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman          } else if (!FTI.hasPrototype) {
1299eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman            if (ArgTy->isPromotableIntegerType()) {
1300a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman              ArgTy = Context.getPromotedIntegerType(ArgTy);
1301183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall            } else if (const BuiltinType* BTy = ArgTy->getAs<BuiltinType>()) {
1302eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman              if (BTy->getKind() == BuiltinType::Float)
1303eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman                ArgTy = Context.DoubleTy;
1304eb4b7051a596560ef4a1846e3714707f44e9dc30Eli Friedman            }
13055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          }
130656a965c0f77c9e6bffd65cc8f8796442a8527381Fariborz Jahanian
130754e14c4db764c0636160d26c5bbf491637c83a76John McCall          ArgTys.push_back(ArgTy);
13085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        }
1309465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
1310465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl        llvm::SmallVector<QualType, 4> Exceptions;
1311465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl        Exceptions.reserve(FTI.NumExceptions);
13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        for (unsigned ei = 0, ee = FTI.NumExceptions; ei != ee; ++ei) {
1313e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis          // FIXME: Preserve type source info.
1314e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis          QualType ET = GetTypeFromParser(FTI.Exceptions[ei].Ty);
1315ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl          // Check that the type is valid for an exception spec, and drop it if
1316ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl          // not.
1317ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl          if (!CheckSpecifiedExceptionType(ET, FTI.Exceptions[ei].Range))
1318ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl            Exceptions.push_back(ET);
1319ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl        }
1320465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
1321beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad        T = Context.getFunctionType(T, ArgTys.data(), ArgTys.size(),
1322465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl                                    FTI.isVariadic, FTI.TypeQuals,
1323465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl                                    FTI.hasExceptionSpec,
1324465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl                                    FTI.hasAnyExceptionSpec,
1325ce056bcaa1c97b89a4b2de2112c62d060863be2bDouglas Gregor                                    Exceptions.size(), Exceptions.data(),
1326264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                    FunctionType::ExtInfo());
13275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
132804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
132904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      // For GCC compatibility, we allow attributes that apply only to
133004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      // function types to be placed on a function's return type
133104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      // instead (as long as that type doesn't happen to be function
133204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      // or function-pointer itself).
133304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      ProcessDelayedFnAttrs(*this, T, FnAttrsFromPreviousChunk);
133404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
13355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      break;
13365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
1337f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    case DeclaratorChunk::MemberPointer:
1338f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      // The scope spec must refer to a class, or be dependent.
13397bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara      CXXScopeSpec &SS = DeclType.Mem.Scope();
1340f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      QualType ClsType;
13417bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara      if (SS.isInvalid()) {
1342edc287751a4b05e3b4d8ff2b38fa30c5b59a548bJeffrey Yasskin        // Avoid emitting extra errors if we already errored on the scope.
1343edc287751a4b05e3b4d8ff2b38fa30c5b59a548bJeffrey Yasskin        D.setInvalidType(true);
13447bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara      } else if (isDependentScopeSpecifier(SS) ||
13457bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara                 dyn_cast_or_null<CXXRecordDecl>(computeDeclContext(SS))) {
13461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        NestedNameSpecifier *NNS
13477bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara          = static_cast<NestedNameSpecifier*>(SS.getScopeRep());
134887c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor        NestedNameSpecifier *NNSPrefix = NNS->getPrefix();
134987c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor        switch (NNS->getKind()) {
135087c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor        case NestedNameSpecifier::Identifier:
13517bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara          ClsType = Context.getDependentNameType(ETK_None, NNSPrefix,
13524a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                                 NNS->getAsIdentifier());
135387c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor          break;
135487c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor
135587c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor        case NestedNameSpecifier::Namespace:
135687c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor        case NestedNameSpecifier::Global:
13579f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin          llvm_unreachable("Nested-name-specifier must name a type");
135887c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor          break;
13597bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara
136087c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor        case NestedNameSpecifier::TypeSpec:
136187c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor        case NestedNameSpecifier::TypeSpecWithTemplate:
136287c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor          ClsType = QualType(NNS->getAsType(), 0);
13637bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara          // Note: if NNS is dependent, then its prefix (if any) is already
13647bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara          // included in ClsType; this does not hold if the NNS is
13657bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara          // nondependent: in this case (if there is indeed a prefix)
13667bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara          // ClsType needs to be wrapped into an elaborated type.
13677bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara          if (NNSPrefix && !NNS->isDependent())
13687bd067635df79f6ce4b9ffee394ea6d9e86e4290Abramo Bagnara            ClsType = Context.getElaboratedType(ETK_None, NNSPrefix, ClsType);
136987c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor          break;
137087c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor        }
1371f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      } else {
1372949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor        Diag(DeclType.Mem.Scope().getBeginLoc(),
1373949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor             diag::err_illegal_decl_mempointer_in_nonclass)
1374949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor          << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name")
1375949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor          << DeclType.Mem.Scope().getRange();
1376f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl        D.setInvalidType(true);
1377f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      }
1378f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
1379949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor      if (!ClsType.isNull())
13802865474261a608c7873b87ba4af110d17907896dJohn McCall        T = BuildMemberPointerType(T, ClsType, DeclType.Loc, D.getIdentifier());
1381949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor      if (T.isNull()) {
1382f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl        T = Context.IntTy;
1383949bf69136e07fb7968d84bc21d9272ff343ffdbDouglas Gregor        D.setInvalidType(true);
13842865474261a608c7873b87ba4af110d17907896dJohn McCall      } else if (DeclType.Mem.TypeQuals) {
13852865474261a608c7873b87ba4af110d17907896dJohn McCall        T = BuildQualifiedType(T, DeclType.Loc, DeclType.Mem.TypeQuals);
1386f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      }
1387f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      break;
1388f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    }
1389f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
1390cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    if (T.isNull()) {
1391cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor      D.setInvalidType(true);
1392cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor      T = Context.IntTy;
1393cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor    }
1394cd281c3ded486ced5aad29dd7c3fa22b7514c3d8Douglas Gregor
139504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    DiagnoseDelayedFnAttrs(*this, FnAttrsFromPreviousChunk);
139604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
1397c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner    // See if there are any attributes on this declarator chunk.
1398c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner    if (const AttributeList *AL = DeclType.getAttrs())
1399328ce34c7d0c4e8696d352853b48b385dec1fef4Charles Davis      ProcessTypeAttributeList(*this, T, false, AL, FnAttrsFromPreviousChunk);
14005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1401971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis
1402971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis  if (getLangOptions().CPlusPlus && T->isFunctionType()) {
1403183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    const FunctionProtoType *FnTy = T->getAs<FunctionProtoType>();
1404778ed741de8ada0049b89608af0abdb5ae6e106eChris Lattner    assert(FnTy && "Why oh why is there not a FunctionProtoType here?");
1405971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis
1406971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis    // C++ 8.3.5p4: A cv-qualifier-seq shall only be part of the function type
1407971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis    // for a nonstatic member function, the function type to which a pointer
1408971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis    // to member refers, or the top-level function type of a function typedef
1409971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis    // declaration.
1410c61bb2056148891375bfa591fa2859b9b6ec2734Sebastian Redl    bool FreeFunction = (D.getContext() != Declarator::MemberContext &&
1411c61bb2056148891375bfa591fa2859b9b6ec2734Sebastian Redl        (!D.getCXXScopeSpec().isSet() ||
1412c61bb2056148891375bfa591fa2859b9b6ec2734Sebastian Redl         !computeDeclContext(D.getCXXScopeSpec(), /*FIXME:*/true)->isRecord()));
1413971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis    if (FnTy->getTypeQuals() != 0 &&
1414971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis        D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
1415c61bb2056148891375bfa591fa2859b9b6ec2734Sebastian Redl        (FreeFunction ||
1416971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis         D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static)) {
1417971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis      if (D.isFunctionDeclarator())
1418971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis        Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_function_type);
1419971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis      else
1420971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis        Diag(D.getIdentifierLoc(),
1421c61bb2056148891375bfa591fa2859b9b6ec2734Sebastian Redl             diag::err_invalid_qualified_typedef_function_type_use)
1422c61bb2056148891375bfa591fa2859b9b6ec2734Sebastian Redl          << FreeFunction;
1423971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis
1424971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis      // Strip the cv-quals from the type.
1425971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis      T = Context.getFunctionType(FnTy->getResultType(), FnTy->arg_type_begin(),
1426ce056bcaa1c97b89a4b2de2112c62d060863be2bDouglas Gregor                                  FnTy->getNumArgs(), FnTy->isVariadic(), 0,
1427264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                  false, false, 0, 0, FunctionType::ExtInfo());
1428971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis    }
1429971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis  }
14301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1431737801257f795632175517ffce4a80c62fc7bff7Sebastian Redl  // If there's a constexpr specifier, treat it as a top-level const.
1432737801257f795632175517ffce4a80c62fc7bff7Sebastian Redl  if (D.getDeclSpec().isConstexprSpecified()) {
1433737801257f795632175517ffce4a80c62fc7bff7Sebastian Redl    T.addConst();
1434737801257f795632175517ffce4a80c62fc7bff7Sebastian Redl  }
1435737801257f795632175517ffce4a80c62fc7bff7Sebastian Redl
143604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  // Process any function attributes we might have delayed from the
143704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  // declaration-specifiers.
143804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  ProcessDelayedFnAttrs(*this, T, FnAttrsFromDeclSpec);
143904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
144004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  // If there were any type attributes applied to the decl itself, not
144104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  // the type, apply them to the result type.  But don't do this for
144204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  // block-literal expressions, which are parsed wierdly.
144304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (D.getContext() != Declarator::BlockLiteralContext)
144404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    if (const AttributeList *Attrs = D.getAttributes())
1445328ce34c7d0c4e8696d352853b48b385dec1fef4Charles Davis      ProcessTypeAttributeList(*this, T, false, Attrs,
1446328ce34c7d0c4e8696d352853b48b385dec1fef4Charles Davis                               FnAttrsFromPreviousChunk);
144704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
144804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  DiagnoseDelayedFnAttrs(*this, FnAttrsFromPreviousChunk);
14494adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis
1450bf1a028246d884a540aeafa38e89be59a269b072John McCall  if (T.isNull())
1451bf1a028246d884a540aeafa38e89be59a269b072John McCall    return Context.getNullTypeSourceInfo();
1452bf1a028246d884a540aeafa38e89be59a269b072John McCall  else if (D.isInvalidType())
1453bf1a028246d884a540aeafa38e89be59a269b072John McCall    return Context.getTrivialTypeSourceInfo(T);
1454bf1a028246d884a540aeafa38e89be59a269b072John McCall  return GetTypeSourceInfoForDeclarator(D, T, ReturnTypeInfo);
14555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
14565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145751bd803fbdade51d674598ed45da3d54190a656cJohn McCallnamespace {
145851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  class TypeSpecLocFiller : public TypeLocVisitor<TypeSpecLocFiller> {
145951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    const DeclSpec &DS;
1460f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis
146151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  public:
146251bd803fbdade51d674598ed45da3d54190a656cJohn McCall    TypeSpecLocFiller(const DeclSpec &DS) : DS(DS) {}
1463f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis
146451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
146551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      Visit(TL.getUnqualifiedLoc());
146651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
146751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitTypedefTypeLoc(TypedefTypeLoc TL) {
146851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setNameLoc(DS.getTypeSpecTypeLoc());
146951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
147051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
147151bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setNameLoc(DS.getTypeSpecTypeLoc());
1472c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    }
1473c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    void VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
1474c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      // Handle the base type, which might not have been written explicitly.
1475c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      if (DS.getTypeSpecType() == DeclSpec::TST_unspecified) {
1476c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        TL.setHasBaseTypeAsWritten(false);
1477c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        TL.getBaseLoc().initialize(SourceLocation());
1478c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      } else {
1479c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        TL.setHasBaseTypeAsWritten(true);
1480c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        Visit(TL.getBaseLoc());
1481c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      }
148254e14c4db764c0636160d26c5bbf491637c83a76John McCall
1483c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      // Protocol qualifiers.
148454e14c4db764c0636160d26c5bbf491637c83a76John McCall      if (DS.getProtocolQualifiers()) {
148554e14c4db764c0636160d26c5bbf491637c83a76John McCall        assert(TL.getNumProtocols() > 0);
148654e14c4db764c0636160d26c5bbf491637c83a76John McCall        assert(TL.getNumProtocols() == DS.getNumProtocolQualifiers());
148754e14c4db764c0636160d26c5bbf491637c83a76John McCall        TL.setLAngleLoc(DS.getProtocolLAngleLoc());
148854e14c4db764c0636160d26c5bbf491637c83a76John McCall        TL.setRAngleLoc(DS.getSourceRange().getEnd());
148954e14c4db764c0636160d26c5bbf491637c83a76John McCall        for (unsigned i = 0, e = DS.getNumProtocolQualifiers(); i != e; ++i)
149054e14c4db764c0636160d26c5bbf491637c83a76John McCall          TL.setProtocolLoc(i, DS.getProtocolLocs()[i]);
149154e14c4db764c0636160d26c5bbf491637c83a76John McCall      } else {
149254e14c4db764c0636160d26c5bbf491637c83a76John McCall        assert(TL.getNumProtocols() == 0);
149354e14c4db764c0636160d26c5bbf491637c83a76John McCall        TL.setLAngleLoc(SourceLocation());
149454e14c4db764c0636160d26c5bbf491637c83a76John McCall        TL.setRAngleLoc(SourceLocation());
149554e14c4db764c0636160d26c5bbf491637c83a76John McCall      }
149651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
149754e14c4db764c0636160d26c5bbf491637c83a76John McCall    void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
149854e14c4db764c0636160d26c5bbf491637c83a76John McCall      TL.setStarLoc(SourceLocation());
1499c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Visit(TL.getPointeeLoc());
150051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
1501833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    void VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
1502a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      TypeSourceInfo *TInfo = 0;
1503b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall      Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
1504833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1505833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // If we got no declarator info from previous Sema routines,
1506833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // just fill with the typespec loc.
1507a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      if (!TInfo) {
1508833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        TL.initialize(DS.getTypeSpecTypeLoc());
1509833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return;
1510833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      }
1511833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1512e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      TypeLoc OldTL = TInfo->getTypeLoc();
1513e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      if (TInfo->getType()->getAs<ElaboratedType>()) {
1514e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        ElaboratedTypeLoc ElabTL = cast<ElaboratedTypeLoc>(OldTL);
1515e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        TemplateSpecializationTypeLoc NamedTL =
1516e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara          cast<TemplateSpecializationTypeLoc>(ElabTL.getNamedTypeLoc());
1517e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        TL.copy(NamedTL);
1518e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      }
1519e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      else
1520e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        TL.copy(cast<TemplateSpecializationTypeLoc>(OldTL));
1521833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    }
1522cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
1523cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      assert(DS.getTypeSpecType() == DeclSpec::TST_typeofExpr);
1524cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      TL.setTypeofLoc(DS.getTypeSpecTypeLoc());
1525cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      TL.setParensRange(DS.getTypeofParensRange());
1526cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    }
1527cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    void VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
1528cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      assert(DS.getTypeSpecType() == DeclSpec::TST_typeofType);
1529cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      TL.setTypeofLoc(DS.getTypeSpecTypeLoc());
1530cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      TL.setParensRange(DS.getTypeofParensRange());
1531b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall      assert(DS.getRepAsType());
1532cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      TypeSourceInfo *TInfo = 0;
1533b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall      Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
1534cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      TL.setUnderlyingTInfo(TInfo);
1535cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    }
1536ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    void VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
1537ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      // By default, use the source location of the type specifier.
1538ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      TL.setBuiltinLoc(DS.getTypeSpecTypeLoc());
1539ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      if (TL.needsExtraLocalData()) {
1540ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor        // Set info for the written builtin specifiers.
1541ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor        TL.getWrittenBuiltinSpecs() = DS.getWrittenBuiltinSpecs();
1542ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor        // Try to have a meaningful source location.
1543ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor        if (TL.getWrittenSignSpec() != TSS_unspecified)
1544ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor          // Sign spec loc overrides the others (e.g., 'unsigned long').
1545ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor          TL.setBuiltinLoc(DS.getTypeSpecSignLoc());
1546ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor        else if (TL.getWrittenWidthSpec() != TSW_unspecified)
1547ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor          // Width spec loc overrides type spec loc (e.g., 'short int').
1548ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor          TL.setBuiltinLoc(DS.getTypeSpecWidthLoc());
1549ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      }
1550ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    }
1551e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    void VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
1552e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      ElaboratedTypeKeyword Keyword
1553e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
1554e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      if (Keyword == ETK_Typename) {
1555e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        TypeSourceInfo *TInfo = 0;
1556b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall        Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
1557e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        if (TInfo) {
1558e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara          TL.copy(cast<ElaboratedTypeLoc>(TInfo->getTypeLoc()));
1559e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara          return;
1560e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        }
1561e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      }
1562e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      TL.setKeywordLoc(Keyword != ETK_None
1563e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                       ? DS.getTypeSpecTypeLoc()
1564e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                       : SourceLocation());
1565e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      const CXXScopeSpec& SS = DS.getTypeSpecScope();
1566e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      TL.setQualifierRange(SS.isEmpty() ? SourceRange(): SS.getRange());
1567e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      Visit(TL.getNextTypeLoc().getUnqualifiedLoc());
1568e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    }
1569e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    void VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
1570e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      ElaboratedTypeKeyword Keyword
1571e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
1572e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      if (Keyword == ETK_Typename) {
1573e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        TypeSourceInfo *TInfo = 0;
1574b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall        Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
1575e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        if (TInfo) {
1576e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara          TL.copy(cast<DependentNameTypeLoc>(TInfo->getTypeLoc()));
1577e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara          return;
1578e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara        }
1579e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      }
1580e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      TL.setKeywordLoc(Keyword != ETK_None
1581e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                       ? DS.getTypeSpecTypeLoc()
1582e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                       : SourceLocation());
1583e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      const CXXScopeSpec& SS = DS.getTypeSpecScope();
1584e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      TL.setQualifierRange(SS.isEmpty() ? SourceRange() : SS.getRange());
1585e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      // FIXME: load appropriate source location.
158633500955d731c73717af52088b7fc0e7a85681e7John McCall      TL.setNameLoc(DS.getTypeSpecTypeLoc());
158733500955d731c73717af52088b7fc0e7a85681e7John McCall    }
158833500955d731c73717af52088b7fc0e7a85681e7John McCall    void VisitDependentTemplateSpecializationTypeLoc(
158933500955d731c73717af52088b7fc0e7a85681e7John McCall                                 DependentTemplateSpecializationTypeLoc TL) {
159033500955d731c73717af52088b7fc0e7a85681e7John McCall      ElaboratedTypeKeyword Keyword
159133500955d731c73717af52088b7fc0e7a85681e7John McCall        = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
159233500955d731c73717af52088b7fc0e7a85681e7John McCall      if (Keyword == ETK_Typename) {
159333500955d731c73717af52088b7fc0e7a85681e7John McCall        TypeSourceInfo *TInfo = 0;
1594b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall        Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
159533500955d731c73717af52088b7fc0e7a85681e7John McCall        if (TInfo) {
159633500955d731c73717af52088b7fc0e7a85681e7John McCall          TL.copy(cast<DependentTemplateSpecializationTypeLoc>(
159733500955d731c73717af52088b7fc0e7a85681e7John McCall                    TInfo->getTypeLoc()));
159833500955d731c73717af52088b7fc0e7a85681e7John McCall          return;
159933500955d731c73717af52088b7fc0e7a85681e7John McCall        }
160033500955d731c73717af52088b7fc0e7a85681e7John McCall      }
160133500955d731c73717af52088b7fc0e7a85681e7John McCall      TL.initializeLocal(SourceLocation());
160233500955d731c73717af52088b7fc0e7a85681e7John McCall      TL.setKeywordLoc(Keyword != ETK_None
160333500955d731c73717af52088b7fc0e7a85681e7John McCall                       ? DS.getTypeSpecTypeLoc()
160433500955d731c73717af52088b7fc0e7a85681e7John McCall                       : SourceLocation());
160533500955d731c73717af52088b7fc0e7a85681e7John McCall      const CXXScopeSpec& SS = DS.getTypeSpecScope();
160633500955d731c73717af52088b7fc0e7a85681e7John McCall      TL.setQualifierRange(SS.isEmpty() ? SourceRange() : SS.getRange());
160733500955d731c73717af52088b7fc0e7a85681e7John McCall      // FIXME: load appropriate source location.
1608e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      TL.setNameLoc(DS.getTypeSpecTypeLoc());
1609e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    }
1610e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara
161151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitTypeLoc(TypeLoc TL) {
161251bd803fbdade51d674598ed45da3d54190a656cJohn McCall      // FIXME: add other typespec types and change this to an assert.
161351bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.initialize(DS.getTypeSpecTypeLoc());
161451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
161551bd803fbdade51d674598ed45da3d54190a656cJohn McCall  };
1616eb66759e9a1d7c041354d132a14674b2d948059bArgyrios Kyrtzidis
161751bd803fbdade51d674598ed45da3d54190a656cJohn McCall  class DeclaratorLocFiller : public TypeLocVisitor<DeclaratorLocFiller> {
161851bd803fbdade51d674598ed45da3d54190a656cJohn McCall    const DeclaratorChunk &Chunk;
1619f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis
162051bd803fbdade51d674598ed45da3d54190a656cJohn McCall  public:
162151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    DeclaratorLocFiller(const DeclaratorChunk &Chunk) : Chunk(Chunk) {}
16224adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis
162351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
16249f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin      llvm_unreachable("qualified type locs not expected here!");
162551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
16264adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis
162751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
162851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      assert(Chunk.Kind == DeclaratorChunk::BlockPointer);
162951bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setCaretLoc(Chunk.Loc);
16304adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis    }
163151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitPointerTypeLoc(PointerTypeLoc TL) {
163251bd803fbdade51d674598ed45da3d54190a656cJohn McCall      assert(Chunk.Kind == DeclaratorChunk::Pointer);
163351bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setStarLoc(Chunk.Loc);
16344adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis    }
163551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
163651bd803fbdade51d674598ed45da3d54190a656cJohn McCall      assert(Chunk.Kind == DeclaratorChunk::Pointer);
163751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setStarLoc(Chunk.Loc);
16384adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis    }
163951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
164051bd803fbdade51d674598ed45da3d54190a656cJohn McCall      assert(Chunk.Kind == DeclaratorChunk::MemberPointer);
164151bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setStarLoc(Chunk.Loc);
164251bd803fbdade51d674598ed45da3d54190a656cJohn McCall      // FIXME: nested name specifier
16434adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis    }
164451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
164551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      assert(Chunk.Kind == DeclaratorChunk::Reference);
164654e14c4db764c0636160d26c5bbf491637c83a76John McCall      // 'Amp' is misleading: this might have been originally
164754e14c4db764c0636160d26c5bbf491637c83a76John McCall      /// spelled with AmpAmp.
164851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setAmpLoc(Chunk.Loc);
164951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
165051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
165151bd803fbdade51d674598ed45da3d54190a656cJohn McCall      assert(Chunk.Kind == DeclaratorChunk::Reference);
165251bd803fbdade51d674598ed45da3d54190a656cJohn McCall      assert(!Chunk.Ref.LValueRef);
165351bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setAmpAmpLoc(Chunk.Loc);
165451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
165551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitArrayTypeLoc(ArrayTypeLoc TL) {
165651bd803fbdade51d674598ed45da3d54190a656cJohn McCall      assert(Chunk.Kind == DeclaratorChunk::Array);
165751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setLBracketLoc(Chunk.Loc);
165851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setRBracketLoc(Chunk.EndLoc);
165951bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setSizeExpr(static_cast<Expr*>(Chunk.Arr.NumElts));
166051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
166151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitFunctionTypeLoc(FunctionTypeLoc TL) {
166251bd803fbdade51d674598ed45da3d54190a656cJohn McCall      assert(Chunk.Kind == DeclaratorChunk::Function);
166351bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setLParenLoc(Chunk.Loc);
166451bd803fbdade51d674598ed45da3d54190a656cJohn McCall      TL.setRParenLoc(Chunk.EndLoc);
1665dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      TL.setTrailingReturn(!!Chunk.Fun.TrailingReturnType);
166651bd803fbdade51d674598ed45da3d54190a656cJohn McCall
166751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      const DeclaratorChunk::FunctionTypeInfo &FTI = Chunk.Fun;
166854e14c4db764c0636160d26c5bbf491637c83a76John McCall      for (unsigned i = 0, e = TL.getNumArgs(), tpi = 0; i != e; ++i) {
1669d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall        ParmVarDecl *Param = cast<ParmVarDecl>(FTI.ArgInfo[i].Param);
167054e14c4db764c0636160d26c5bbf491637c83a76John McCall        TL.setArg(tpi++, Param);
16714adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis      }
167251bd803fbdade51d674598ed45da3d54190a656cJohn McCall      // FIXME: exception specs
16734adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis    }
16741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
167551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    void VisitTypeLoc(TypeLoc TL) {
16769f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin      llvm_unreachable("unsupported TypeLoc kind in declarator!");
16774adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis    }
167851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  };
167951bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
16804adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis
1681a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall/// \brief Create and instantiate a TypeSourceInfo with type source information.
168251bd803fbdade51d674598ed45da3d54190a656cJohn McCall///
168351bd803fbdade51d674598ed45da3d54190a656cJohn McCall/// \param T QualType referring to the type as written in source code.
168405baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor///
168505baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor/// \param ReturnTypeInfo For declarators whose return type does not show
168605baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor/// up in the normal place in the declaration specifiers (such as a C++
168705baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor/// conversion function), this pointer will refer to a type source information
168805baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor/// for that return type.
1689a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *
169005baacbfd67017b2724f3e0503fd23609f5d32bcDouglas GregorSema::GetTypeSourceInfoForDeclarator(Declarator &D, QualType T,
169105baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor                                     TypeSourceInfo *ReturnTypeInfo) {
1692a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *TInfo = Context.CreateTypeSourceInfo(T);
1693a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  UnqualTypeLoc CurrTL = TInfo->getTypeLoc().getUnqualifiedLoc();
169451bd803fbdade51d674598ed45da3d54190a656cJohn McCall
16958ce35b095e8fca45e04c1bda14ed0548ce7536adSebastian Redl  for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
169651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    DeclaratorLocFiller(D.getTypeObject(i)).Visit(CurrTL);
169751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    CurrTL = CurrTL.getNextTypeLoc().getUnqualifiedLoc();
16984adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis  }
1699f352bddf015e537350416c296dd2963524f554f9Argyrios Kyrtzidis
1700b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  // If we have different source information for the return type, use
1701b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  // that.  This really only applies to C++ conversion functions.
1702b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  if (ReturnTypeInfo) {
170305baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor    TypeLoc TL = ReturnTypeInfo->getTypeLoc();
170405baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor    assert(TL.getFullDataSize() == CurrTL.getFullDataSize());
170505baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor    memcpy(CurrTL.getOpaqueData(), TL.getOpaqueData(), TL.getFullDataSize());
1706b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  } else {
1707b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    TypeSpecLocFiller(D.getDeclSpec()).Visit(CurrTL);
170805baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor  }
170905baacbfd67017b2724f3e0503fd23609f5d32bcDouglas Gregor
1710a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TInfo;
17114adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis}
17124adab7fcb4cb1e23622f4849f7ef7981ff169616Argyrios Kyrtzidis
1713a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall/// \brief Create a LocInfoType to hold the given QualType and TypeSourceInfo.
1714b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCallParsedType Sema::CreateParsedType(QualType T, TypeSourceInfo *TInfo) {
17151bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis  // FIXME: LocInfoTypes are "transient", only needed for passing to/from Parser
17161bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis  // and Sema during declaration parsing. Try deallocating/caching them when
17171bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis  // it's appropriate, instead of allocating them and keeping them around.
17181bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis  LocInfoType *LocT = (LocInfoType*)BumpAlloc.Allocate(sizeof(LocInfoType), 8);
1719a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  new (LocT) LocInfoType(T, TInfo);
17201bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis  assert(LocT->getTypeClass() != T->getTypeClass() &&
17211bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis         "LocInfoType's TypeClass conflicts with an existing Type class");
1722b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  return ParsedType::make(QualType(LocT, 0));
17231bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis}
17241bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
17251bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidisvoid LocInfoType::getAsStringInternal(std::string &Str,
17261bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis                                      const PrintingPolicy &Policy) const {
172735d44e5673e772d1cc7eab66818de8d9796b89caArgyrios Kyrtzidis  assert(false && "LocInfoType leaked into the type system; an opaque TypeTy*"
172835d44e5673e772d1cc7eab66818de8d9796b89caArgyrios Kyrtzidis         " was used directly instead of getting the QualType through"
172935d44e5673e772d1cc7eab66818de8d9796b89caArgyrios Kyrtzidis         " GetTypeFromParser");
17301bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis}
17311bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
1732f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallTypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) {
17335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.7.6: Type names have no identifier.  This is already validated by
17345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // the parser.
17355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(D.getIdentifier() == 0 && "Type name should have no identifier!");
17361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1737402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor  TagDecl *OwnedTag = 0;
1738bf1a028246d884a540aeafa38e89be59a269b072John McCall  TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedTag);
1739bf1a028246d884a540aeafa38e89be59a269b072John McCall  QualType T = TInfo->getType();
17405153ee66d6d4fb37b02f85df38e48dc8b46660dfChris Lattner  if (D.isInvalidType())
1741809070a886684cb5b92eb0e00a6581ab1fa6b17aDouglas Gregor    return true;
17425912a3544e438a92832b8c52c13f48d4f54795dcSteve Naroff
1743402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor  if (getLangOptions().CPlusPlus) {
1744402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor    // Check that there are no default arguments (C++ only).
17456d6eb57225b53fb627c565861d1d0e90645400d1Douglas Gregor    CheckExtraCXXDefaultArguments(D);
17466d6eb57225b53fb627c565861d1d0e90645400d1Douglas Gregor
1747402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor    // C++0x [dcl.type]p3:
1748402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor    //   A type-specifier-seq shall not define a class or enumeration
1749402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor    //   unless it appears in the type-id of an alias-declaration
1750402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor    //   (7.1.3).
1751402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor    if (OwnedTag && OwnedTag->isDefinition())
1752402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor      Diag(OwnedTag->getLocation(), diag::err_type_defined_in_type_specifier)
1753402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor        << Context.getTypeDeclType(OwnedTag);
1754402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor  }
1755402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor
1756b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  return CreateParsedType(T, TInfo);
17575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
17585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1759c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner
1760c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner
1761c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner//===----------------------------------------------------------------------===//
1762c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner// Type Attribute Processing
1763c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner//===----------------------------------------------------------------------===//
1764232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner
1765232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner/// HandleAddressSpaceTypeAttribute - Process an address_space attribute on the
1766c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner/// specified type.  The attribute contains 1 argument, the id of the address
1767c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner/// space for the type.
17681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic void HandleAddressSpaceTypeAttribute(QualType &Type,
1769c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner                                            const AttributeList &Attr, Sema &S){
17700953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
1771232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner  // If this type is already address space qualified, reject it.
1772232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner  // Clause 6.7.3 - Type qualifiers: "No type shall be qualified by qualifiers
1773232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner  // for two or more different address spaces."
1774232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner  if (Type.getAddressSpace()) {
1775c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner    S.Diag(Attr.getLoc(), diag::err_attribute_address_multiple_qualifiers);
1776e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
1777c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner    return;
1778232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner  }
17791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1780232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner  // Check the attribute arguments.
1781545dd3401e7f31c256d69cb948a45d5ca781064cChris Lattner  if (Attr.getNumArgs() != 1) {
1782f3a41af4d5c98a72a1d6720bbbfd658e57ef2541Chris Lattner    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
1783e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
1784c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner    return;
1785232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner  }
1786545dd3401e7f31c256d69cb948a45d5ca781064cChris Lattner  Expr *ASArgExpr = static_cast<Expr *>(Attr.getArg(0));
1787232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner  llvm::APSInt addrSpace(32);
1788ac06a0e1e3feb95c2ffd352c086882b492a65b99Douglas Gregor  if (ASArgExpr->isTypeDependent() || ASArgExpr->isValueDependent() ||
1789ac06a0e1e3feb95c2ffd352c086882b492a65b99Douglas Gregor      !ASArgExpr->isIntegerConstantExpr(addrSpace, S.Context)) {
1790dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner    S.Diag(Attr.getLoc(), diag::err_attribute_address_space_not_int)
1791dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner      << ASArgExpr->getSourceRange();
1792e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
1793c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner    return;
1794232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner  }
1795232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner
1796efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  // Bounds checking.
1797efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  if (addrSpace.isSigned()) {
1798efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall    if (addrSpace.isNegative()) {
1799efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall      S.Diag(Attr.getLoc(), diag::err_attribute_address_space_negative)
1800efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall        << ASArgExpr->getSourceRange();
1801e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara      Attr.setInvalid();
1802efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall      return;
1803efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall    }
1804efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall    addrSpace.setIsSigned(false);
1805efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  }
1806efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  llvm::APSInt max(addrSpace.getBitWidth());
18070953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  max = Qualifiers::MaxAddressSpace;
1808efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  if (addrSpace > max) {
1809efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall    S.Diag(Attr.getLoc(), diag::err_attribute_address_space_too_high)
18100953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      << Qualifiers::MaxAddressSpace << ASArgExpr->getSourceRange();
1811e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
1812efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall    return;
1813efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  }
1814efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall
18151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  unsigned ASIdx = static_cast<unsigned>(addrSpace.getZExtValue());
1816f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  Type = S.Context.getAddrSpaceQualType(Type, ASIdx);
1817c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner}
1818c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner
1819d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian/// HandleObjCGCTypeAttribute - Process an objc's gc attribute on the
1820d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian/// specified type.  The attribute contains 1 argument, weak or strong.
18211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic void HandleObjCGCTypeAttribute(QualType &Type,
18223b6b83b8311ecdfa43cbb37ccc38c107d3b8d88bChris Lattner                                      const AttributeList &Attr, Sema &S) {
18230953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  if (Type.getObjCGCAttr() != Qualifiers::GCNone) {
18245934e75d98d99374f72722a69c5eefe026f35c74Fariborz Jahanian    S.Diag(Attr.getLoc(), diag::err_attribute_multiple_objc_gc);
1825e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
1826d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian    return;
1827d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian  }
18281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1829d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian  // Check the attribute arguments.
18301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Attr.getParameterName()) {
1831ba372b85524f712e5b97a176f6ce0197d365835dFariborz Jahanian    S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
1832ba372b85524f712e5b97a176f6ce0197d365835dFariborz Jahanian      << "objc_gc" << 1;
1833e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
1834ba372b85524f712e5b97a176f6ce0197d365835dFariborz Jahanian    return;
1835ba372b85524f712e5b97a176f6ce0197d365835dFariborz Jahanian  }
18360953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  Qualifiers::GC GCAttr;
1837ba372b85524f712e5b97a176f6ce0197d365835dFariborz Jahanian  if (Attr.getNumArgs() != 0) {
1838d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
1839e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
1840d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian    return;
1841d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian  }
18421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Attr.getParameterName()->isStr("weak"))
18430953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    GCAttr = Qualifiers::Weak;
1844d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian  else if (Attr.getParameterName()->isStr("strong"))
18450953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    GCAttr = Qualifiers::Strong;
1846d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian  else {
1847d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian    S.Diag(Attr.getLoc(), diag::warn_attribute_type_not_supported)
1848d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian      << "objc_gc" << Attr.getParameterName();
1849e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
1850d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian    return;
1851d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian  }
18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18533b6b83b8311ecdfa43cbb37ccc38c107d3b8d88bChris Lattner  Type = S.Context.getObjCGCQualType(Type, GCAttr);
1854d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian}
1855d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian
185604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall/// Process an individual function attribute.  Returns true if the
185704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall/// attribute does not make sense to apply to this type.
185804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallbool ProcessFnAttr(Sema &S, QualType &Type, const AttributeList &Attr) {
185904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (Attr.getKind() == AttributeList::AT_noreturn) {
186004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    // Complain immediately if the arg count is wrong.
186104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    if (Attr.getNumArgs() != 0) {
186204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
1863e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara      Attr.setInvalid();
186404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      return false;
186504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    }
18662455636163fdd18581d7fdae816433f886d88213Mike Stump
186704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    // Delay if this is not a function or pointer to block.
186804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    if (!Type->isFunctionPointerType()
186904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall        && !Type->isBlockPointerType()
1870afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor        && !Type->isFunctionType()
1871afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor        && !Type->isMemberFunctionPointerType())
187204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      return true;
187358f281f7d54976f23ed4fa23a10ff1ab9c7037feTed Kremenek
187404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    // Otherwise we can process right away.
187504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    Type = S.Context.getNoReturnType(Type);
187604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    return false;
187704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  }
18782455636163fdd18581d7fdae816433f886d88213Mike Stump
1879425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola  if (Attr.getKind() == AttributeList::AT_regparm) {
1880425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    // The warning is emitted elsewhere
1881425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    if (Attr.getNumArgs() != 1) {
1882425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola      return false;
1883425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    }
1884425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola
1885425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    // Delay if this is not a function or pointer to block.
1886425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    if (!Type->isFunctionPointerType()
1887425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola        && !Type->isBlockPointerType()
1888afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor        && !Type->isFunctionType()
1889afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor        && !Type->isMemberFunctionPointerType())
1890425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola      return true;
1891425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola
1892425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    // Otherwise we can process right away.
1893425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    Expr *NumParamsExpr = static_cast<Expr *>(Attr.getArg(0));
1894425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    llvm::APSInt NumParams(32);
1895425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola
1896425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    // The warning is emitted elsewhere
1897ac06a0e1e3feb95c2ffd352c086882b492a65b99Douglas Gregor    if (NumParamsExpr->isTypeDependent() || NumParamsExpr->isValueDependent() ||
1898ac06a0e1e3feb95c2ffd352c086882b492a65b99Douglas Gregor        !NumParamsExpr->isIntegerConstantExpr(NumParams, S.Context))
1899425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola      return false;
1900425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola
19011e030eb1194763b42c1752723be23b1515f48981John McCall    if (S.Context.Target.getRegParmMax() == 0) {
19021e030eb1194763b42c1752723be23b1515f48981John McCall      S.Diag(Attr.getLoc(), diag::err_attribute_regparm_wrong_platform)
19031e030eb1194763b42c1752723be23b1515f48981John McCall        << NumParamsExpr->getSourceRange();
19041e030eb1194763b42c1752723be23b1515f48981John McCall      Attr.setInvalid();
19051e030eb1194763b42c1752723be23b1515f48981John McCall      return;
19061e030eb1194763b42c1752723be23b1515f48981John McCall    }
19071e030eb1194763b42c1752723be23b1515f48981John McCall
19081e030eb1194763b42c1752723be23b1515f48981John McCall    if (NumParams.getLimitedValue(255) > S.Context.Target.getRegParmMax()) {
19091e030eb1194763b42c1752723be23b1515f48981John McCall      S.Diag(Attr.getLoc(), diag::err_attribute_regparm_invalid_number)
19101e030eb1194763b42c1752723be23b1515f48981John McCall        << S.Context.Target.getRegParmMax() << NumParamsExpr->getSourceRange();
19111e030eb1194763b42c1752723be23b1515f48981John McCall      Attr.setInvalid();
19121e030eb1194763b42c1752723be23b1515f48981John McCall      return;
19131e030eb1194763b42c1752723be23b1515f48981John McCall    }
19141e030eb1194763b42c1752723be23b1515f48981John McCall
1915425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    Type = S.Context.getRegParmType(Type, NumParams.getZExtValue());
1916425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    return false;
1917425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola  }
1918425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola
191904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  // Otherwise, a calling convention.
192004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (Attr.getNumArgs() != 0) {
192104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
1922e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
192304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    return false;
192404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  }
1925f82b4e85b1219295cad4b5851b035575bc293010John McCall
192604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  QualType T = Type;
192704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (const PointerType *PT = Type->getAs<PointerType>())
192804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    T = PT->getPointeeType();
1929afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor  else if (const BlockPointerType *BPT = Type->getAs<BlockPointerType>())
1930afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor    T = BPT->getPointeeType();
1931afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor  else if (const MemberPointerType *MPT = Type->getAs<MemberPointerType>())
1932afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor    T = MPT->getPointeeType();
1933afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor  else if (const ReferenceType *RT = Type->getAs<ReferenceType>())
1934afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor    T = RT->getPointeeType();
193504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  const FunctionType *Fn = T->getAs<FunctionType>();
193604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
193704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  // Delay if the type didn't work out to a function.
193804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (!Fn) return true;
193904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
194004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  // TODO: diagnose uses of these conventions on the wrong target.
194104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  CallingConv CC;
194204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  switch (Attr.getKind()) {
194304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  case AttributeList::AT_cdecl: CC = CC_C; break;
194404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  case AttributeList::AT_fastcall: CC = CC_X86FastCall; break;
194504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  case AttributeList::AT_stdcall: CC = CC_X86StdCall; break;
1946f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor  case AttributeList::AT_thiscall: CC = CC_X86ThisCall; break;
194752fc314e1b5e1baee6305067cf831763d02bd243Dawn Perchik  case AttributeList::AT_pascal: CC = CC_X86Pascal; break;
194804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  default: llvm_unreachable("unexpected attribute kind"); return false;
194904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  }
195004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
195104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  CallingConv CCOld = Fn->getCallConv();
1952064f7db69def9299f5f4d9a32114afc10b6a6420Charles Davis  if (S.Context.getCanonicalCallConv(CC) ==
1953e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara      S.Context.getCanonicalCallConv(CCOld)) {
1954e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
1955e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    return false;
1956e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara  }
195704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
195804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (CCOld != CC_Default) {
195904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    // Should we diagnose reapplications of the same convention?
196004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    S.Diag(Attr.getLoc(), diag::err_attributes_are_not_compatible)
196104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      << FunctionType::getNameForCallConv(CC)
196204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      << FunctionType::getNameForCallConv(CCOld);
1963e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
196404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    return false;
196504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  }
196604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
196704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  // Diagnose the use of X86 fastcall on varargs or unprototyped functions.
196804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (CC == CC_X86FastCall) {
196904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    if (isa<FunctionNoProtoType>(Fn)) {
197004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      S.Diag(Attr.getLoc(), diag::err_cconv_knr)
197104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall        << FunctionType::getNameForCallConv(CC);
1972e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara      Attr.setInvalid();
197304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      return false;
197404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    }
197504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
197604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    const FunctionProtoType *FnP = cast<FunctionProtoType>(Fn);
197704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    if (FnP->isVariadic()) {
197804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      S.Diag(Attr.getLoc(), diag::err_cconv_varargs)
197904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall        << FunctionType::getNameForCallConv(CC);
1980e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara      Attr.setInvalid();
198104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      return false;
198204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    }
198304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  }
1984f82b4e85b1219295cad4b5851b035575bc293010John McCall
198504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  Type = S.Context.getCallConvType(Type, CC);
198604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  return false;
1987f82b4e85b1219295cad4b5851b035575bc293010John McCall}
1988f82b4e85b1219295cad4b5851b035575bc293010John McCall
19896e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson/// HandleVectorSizeAttribute - this attribute is only applicable to integral
19906e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson/// and float scalars, although arrays, pointers, and function return values are
19916e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson/// allowed in conjunction with this construct. Aggregates with this attribute
19926e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson/// are invalid, even if they are of the same size as a corresponding scalar.
19936e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson/// The raw attribute should contain precisely 1 argument, the vector size for
19946e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson/// the variable, measured in bytes. If curType and rawAttr are well formed,
19956e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson/// this routine will return a new vector type.
1996788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattnerstatic void HandleVectorSizeAttr(QualType& CurType, const AttributeList &Attr,
1997788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner                                 Sema &S) {
19986e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  // Check the attribute arugments.
19996e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  if (Attr.getNumArgs() != 1) {
20006e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
2001e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
20026e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson    return;
20036e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  }
20046e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  Expr *sizeExpr = static_cast<Expr *>(Attr.getArg(0));
20056e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  llvm::APSInt vecSize(32);
2006ac06a0e1e3feb95c2ffd352c086882b492a65b99Douglas Gregor  if (sizeExpr->isTypeDependent() || sizeExpr->isValueDependent() ||
2007ac06a0e1e3feb95c2ffd352c086882b492a65b99Douglas Gregor      !sizeExpr->isIntegerConstantExpr(vecSize, S.Context)) {
20086e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson    S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
20096e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson      << "vector_size" << sizeExpr->getSourceRange();
2010e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
20116e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson    return;
20126e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  }
20136e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  // the base type must be integer or float, and can't already be a vector.
2014f60946222721d9ba3c059563935c17b84703187aDouglas Gregor  if (!CurType->isIntegerType() && !CurType->isRealFloatingType()) {
20156e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson    S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
2016e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
20176e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson    return;
20186e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  }
20196e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  unsigned typeSize = static_cast<unsigned>(S.Context.getTypeSize(CurType));
20206e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  // vecSize is specified in bytes - convert to bits.
20216e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  unsigned vectorSize = static_cast<unsigned>(vecSize.getZExtValue() * 8);
20226e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson
20236e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  // the vector size needs to be an integral multiple of the type size.
20246e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  if (vectorSize % typeSize) {
20256e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson    S.Diag(Attr.getLoc(), diag::err_attribute_invalid_size)
20266e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson      << sizeExpr->getSourceRange();
2027e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
20286e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson    return;
20296e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  }
20306e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  if (vectorSize == 0) {
20316e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson    S.Diag(Attr.getLoc(), diag::err_attribute_zero_size)
20326e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson      << sizeExpr->getSourceRange();
2033e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    Attr.setInvalid();
20346e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson    return;
20356e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  }
20366e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson
20376e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  // Success! Instantiate the vector type, the number of elements is > 0, and
20386e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson  // not required to be a power of 2, unlike GCC.
2039788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  CurType = S.Context.getVectorType(CurType, vectorSize/typeSize,
2040788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner                                    VectorType::NotAltiVec);
20416e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson}
20426e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson
204304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallvoid ProcessTypeAttributeList(Sema &S, QualType &Result,
2044328ce34c7d0c4e8696d352853b48b385dec1fef4Charles Davis                              bool IsDeclSpec, const AttributeList *AL,
204504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall                              DelayedAttributeSet &FnAttrs) {
2046c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner  // Scan through and apply attributes to this type where it makes sense.  Some
2047c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner  // attributes (such as __address_space__, __vector_size__, etc) apply to the
2048c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner  // type, but others can be present in the type specifiers even though they
2049c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner  // apply to the decl.  Here we apply type attributes and ignore the rest.
2050c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner  for (; AL; AL = AL->getNext()) {
2051e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    // Skip attributes that were marked to be invalid.
2052e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara    if (AL->isInvalid())
2053e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara      continue;
2054e215f7232dd4aa65ebf2a1ecd07cd95fe1ce3481Abramo Bagnara
2055b1f1b267351be74013f966f4834cde1eddbe0233Abramo Bagnara    // If this is an attribute we can handle, do so now,
2056b1f1b267351be74013f966f4834cde1eddbe0233Abramo Bagnara    // otherwise, add it to the FnAttrs list for rechaining.
2057c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner    switch (AL->getKind()) {
2058c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner    default: break;
205904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
2060c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner    case AttributeList::AT_address_space:
206104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      HandleAddressSpaceTypeAttribute(Result, *AL, S);
2062c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner      break;
2063d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian    case AttributeList::AT_objc_gc:
206404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      HandleObjCGCTypeAttribute(Result, *AL, S);
2065d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian      break;
206604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    case AttributeList::AT_vector_size:
206704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      HandleVectorSizeAttr(Result, *AL, S);
2068f82b4e85b1219295cad4b5851b035575bc293010John McCall      break;
206904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall
207004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    case AttributeList::AT_noreturn:
207104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    case AttributeList::AT_cdecl:
207204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall    case AttributeList::AT_fastcall:
2073f82b4e85b1219295cad4b5851b035575bc293010John McCall    case AttributeList::AT_stdcall:
2074f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor    case AttributeList::AT_thiscall:
207552fc314e1b5e1baee6305067cf831763d02bd243Dawn Perchik    case AttributeList::AT_pascal:
2076425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola    case AttributeList::AT_regparm:
2077328ce34c7d0c4e8696d352853b48b385dec1fef4Charles Davis      // Don't process these on the DeclSpec.
2078328ce34c7d0c4e8696d352853b48b385dec1fef4Charles Davis      if (IsDeclSpec ||
2079328ce34c7d0c4e8696d352853b48b385dec1fef4Charles Davis          ProcessFnAttr(S, Result, *AL))
208004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall        FnAttrs.push_back(DelayedAttribute(AL, Result));
20816e132aab867c189b1c3ee7463ef9d2b1f03a294dJohn Thompson      break;
2082c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner    }
2083c9b346d7b3b24f8bf940735cc812893dfcef1d4bChris Lattner  }
2084232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner}
2085232e882226aa116807ee08a700dfc2350fbfabb1Chris Lattner
20861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// @brief Ensure that the type T is a complete type.
20874ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor///
20884ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor/// This routine checks whether the type @p T is complete in any
20894ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor/// context where a complete type is required. If @p T is a complete
209086447ec25fa34aa3c2f48ebc49ec09bc1f03f002Douglas Gregor/// type, returns false. If @p T is a class template specialization,
209186447ec25fa34aa3c2f48ebc49ec09bc1f03f002Douglas Gregor/// this routine then attempts to perform class template
209286447ec25fa34aa3c2f48ebc49ec09bc1f03f002Douglas Gregor/// instantiation. If instantiation fails, or if @p T is incomplete
209386447ec25fa34aa3c2f48ebc49ec09bc1f03f002Douglas Gregor/// and cannot be completed, issues the diagnostic @p diag (giving it
209486447ec25fa34aa3c2f48ebc49ec09bc1f03f002Douglas Gregor/// the type @p T) and returns true.
20954ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor///
20964ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor/// @param Loc  The location in the source that the incomplete type
20974ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor/// diagnostic should refer to.
20984ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor///
20994ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor/// @param T  The type that this routine is examining for completeness.
21004ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor///
21011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// @param PD The partial diagnostic that will be printed out if T is not a
2102b790661a15d93941d2c33a0ea328254277b3d7e3Anders Carlsson/// complete type.
21034ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor///
21044ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor/// @returns @c true if @p T is incomplete and a diagnostic was emitted,
21054ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor/// @c false otherwise.
210691a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlssonbool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
21078c8d91917c307dc3ba4f60661377c745f2a6bef2Anders Carlsson                               const PartialDiagnostic &PD,
21088c8d91917c307dc3ba4f60661377c745f2a6bef2Anders Carlsson                               std::pair<SourceLocation,
21098c8d91917c307dc3ba4f60661377c745f2a6bef2Anders Carlsson                                         PartialDiagnostic> Note) {
211091a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson  unsigned diag = PD.getDiagID();
21111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2112573d9c325279b6e156c7fde163ffe3629c62d596Douglas Gregor  // FIXME: Add this assertion to make sure we always get instantiation points.
2113573d9c325279b6e156c7fde163ffe3629c62d596Douglas Gregor  //  assert(!Loc.isInvalid() && "Invalid location in RequireCompleteType");
2114690dc7f4f2c0fe87409839b7560c19dee7832195Douglas Gregor  // FIXME: Add this assertion to help us flush out problems with
2115690dc7f4f2c0fe87409839b7560c19dee7832195Douglas Gregor  // checking for dependent types and type-dependent expressions.
2116690dc7f4f2c0fe87409839b7560c19dee7832195Douglas Gregor  //
21171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  //  assert(!T->isDependentType() &&
2118690dc7f4f2c0fe87409839b7560c19dee7832195Douglas Gregor  //         "Can't ask whether a dependent type is complete");
2119690dc7f4f2c0fe87409839b7560c19dee7832195Douglas Gregor
21204ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor  // If we have a complete type, we're done.
21214ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor  if (!T->isIncompleteType())
21224ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor    return false;
21234ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor
2124d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor  // If we have a class template specialization or a class member of a
2125923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  // class template specialization, or an array with known size of such,
2126923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  // try to instantiate it.
2127923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  QualType MaybeTemplate = T;
212889c49f09b0292dc7c03885f6c765d667a9837597Douglas Gregor  if (const ConstantArrayType *Array = Context.getAsConstantArrayType(T))
2129923d56d436f750bc1f29db50e641078725558a1bSebastian Redl    MaybeTemplate = Array->getElementType();
2130923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  if (const RecordType *Record = MaybeTemplate->getAs<RecordType>()) {
21312943aed177b33ae3f14273b11a7b398e5276ec62Douglas Gregor    if (ClassTemplateSpecializationDecl *ClassTemplateSpec
2132d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor          = dyn_cast<ClassTemplateSpecializationDecl>(Record->getDecl())) {
2133972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      if (ClassTemplateSpec->getSpecializationKind() == TSK_Undeclared)
2134972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor        return InstantiateClassTemplateSpecialization(Loc, ClassTemplateSpec,
2135d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor                                                      TSK_ImplicitInstantiation,
21365842ba9fd482bb2fe5198b32c2ae549cd5474e6dDouglas Gregor                                                      /*Complain=*/diag != 0);
21371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    } else if (CXXRecordDecl *Rec
2138d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor                 = dyn_cast<CXXRecordDecl>(Record->getDecl())) {
2139d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor      if (CXXRecordDecl *Pattern = Rec->getInstantiatedFromMemberClass()) {
2140b3ae4fcd4314a9c1c46d41b200883599c32025b4Douglas Gregor        MemberSpecializationInfo *MSInfo = Rec->getMemberSpecializationInfo();
2141b3ae4fcd4314a9c1c46d41b200883599c32025b4Douglas Gregor        assert(MSInfo && "Missing member specialization information?");
2142357bbd022c1d340c8e255aea7a684ddb34bc76e5Douglas Gregor        // This record was instantiated from a class within a template.
2143b3ae4fcd4314a9c1c46d41b200883599c32025b4Douglas Gregor        if (MSInfo->getTemplateSpecializationKind()
2144972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor                                               != TSK_ExplicitSpecialization)
2145f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor          return InstantiateClass(Loc, Rec, Pattern,
2146f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor                                  getTemplateInstantiationArgs(Rec),
2147f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor                                  TSK_ImplicitInstantiation,
2148f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor                                  /*Complain=*/diag != 0);
2149d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor      }
2150d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor    }
2151d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor  }
21522943aed177b33ae3f14273b11a7b398e5276ec62Douglas Gregor
21535842ba9fd482bb2fe5198b32c2ae549cd5474e6dDouglas Gregor  if (diag == 0)
21545842ba9fd482bb2fe5198b32c2ae549cd5474e6dDouglas Gregor    return true;
21551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
215601620704304f819b82ecef769ec114e541a364d7Rafael Espindola  const TagType *Tag = 0;
215701620704304f819b82ecef769ec114e541a364d7Rafael Espindola  if (const RecordType *Record = T->getAs<RecordType>())
215801620704304f819b82ecef769ec114e541a364d7Rafael Espindola    Tag = Record;
215901620704304f819b82ecef769ec114e541a364d7Rafael Espindola  else if (const EnumType *Enum = T->getAs<EnumType>())
216001620704304f819b82ecef769ec114e541a364d7Rafael Espindola    Tag = Enum;
216101620704304f819b82ecef769ec114e541a364d7Rafael Espindola
216201620704304f819b82ecef769ec114e541a364d7Rafael Espindola  // Avoid diagnosing invalid decls as incomplete.
216301620704304f819b82ecef769ec114e541a364d7Rafael Espindola  if (Tag && Tag->getDecl()->isInvalidDecl())
216401620704304f819b82ecef769ec114e541a364d7Rafael Espindola    return true;
216501620704304f819b82ecef769ec114e541a364d7Rafael Espindola
21664ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor  // We have an incomplete type. Produce a diagnostic.
216791a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson  Diag(Loc, PD) << T;
21683c0eb160ca1361a82b9f15b3b40a2425adc14d0fEli Friedman
21698c8d91917c307dc3ba4f60661377c745f2a6bef2Anders Carlsson  // If we have a note, produce it.
21708c8d91917c307dc3ba4f60661377c745f2a6bef2Anders Carlsson  if (!Note.first.isInvalid())
21718c8d91917c307dc3ba4f60661377c745f2a6bef2Anders Carlsson    Diag(Note.first, Note.second);
21728c8d91917c307dc3ba4f60661377c745f2a6bef2Anders Carlsson
21734ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor  // If the type was a forward declaration of a class/struct/union
217401620704304f819b82ecef769ec114e541a364d7Rafael Espindola  // type, produce a note.
21754ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor  if (Tag && !Tag->getDecl()->isInvalidDecl())
21761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Diag(Tag->getDecl()->getLocation(),
21774ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor         Tag->isBeingDefined() ? diag::note_type_being_defined
21784ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor                               : diag::note_forward_declaration)
21794ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor        << QualType(Tag, 0);
21804ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor
21814ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor  return true;
21824ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor}
2183e6258936178b4c52b43b3b9dbec13552961cd645Douglas Gregor
2184fe6b2d481d91140923f4541f273b253291884214Douglas Gregorbool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
2185fe6b2d481d91140923f4541f273b253291884214Douglas Gregor                               const PartialDiagnostic &PD) {
2186fe6b2d481d91140923f4541f273b253291884214Douglas Gregor  return RequireCompleteType(Loc, T, PD,
2187fe6b2d481d91140923f4541f273b253291884214Douglas Gregor                             std::make_pair(SourceLocation(), PDiag(0)));
2188fe6b2d481d91140923f4541f273b253291884214Douglas Gregor}
2189fe6b2d481d91140923f4541f273b253291884214Douglas Gregor
2190fe6b2d481d91140923f4541f273b253291884214Douglas Gregorbool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
2191fe6b2d481d91140923f4541f273b253291884214Douglas Gregor                               unsigned DiagID) {
2192fe6b2d481d91140923f4541f273b253291884214Douglas Gregor  return RequireCompleteType(Loc, T, PDiag(DiagID),
2193fe6b2d481d91140923f4541f273b253291884214Douglas Gregor                             std::make_pair(SourceLocation(), PDiag(0)));
2194fe6b2d481d91140923f4541f273b253291884214Douglas Gregor}
2195fe6b2d481d91140923f4541f273b253291884214Douglas Gregor
2196465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara/// \brief Retrieve a version of the type 'T' that is elaborated by Keyword
2197465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara/// and qualified by the nested-name-specifier contained in SS.
2198465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraQualType Sema::getElaboratedType(ElaboratedTypeKeyword Keyword,
2199465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                 const CXXScopeSpec &SS, QualType T) {
2200465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  if (T.isNull())
2201e6258936178b4c52b43b3b9dbec13552961cd645Douglas Gregor    return T;
2202465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  NestedNameSpecifier *NNS;
2203e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (SS.isValid())
2204465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    NNS = static_cast<NestedNameSpecifier *>(SS.getScopeRep());
2205465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  else {
2206465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (Keyword == ETK_None)
2207465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      return T;
2208465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    NNS = 0;
2209465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  }
2210465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  return Context.getElaboratedType(Keyword, NNS, T);
2211e6258936178b4c52b43b3b9dbec13552961cd645Douglas Gregor}
2212af017e682918f7a1a95ff08d9ab7ae3426436ca3Anders Carlsson
22132a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType Sema::BuildTypeofExprType(Expr *E, SourceLocation Loc) {
22142a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  ExprResult ER = CheckPlaceholderExpr(E, Loc);
22152a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  if (ER.isInvalid()) return QualType();
22162a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  E = ER.take();
22172a984cad5ac3fdceeff2bd99daa7b90979313475John McCall
22182b1d51bcf891f8887759aebb4b9e78dee8542e6dFariborz Jahanian  if (!E->isTypeDependent()) {
22192b1d51bcf891f8887759aebb4b9e78dee8542e6dFariborz Jahanian    QualType T = E->getType();
2220aca7f7bab0102341863a0d1bdb048d69213ae362Fariborz Jahanian    if (const TagType *TT = T->getAs<TagType>())
2221aca7f7bab0102341863a0d1bdb048d69213ae362Fariborz Jahanian      DiagnoseUseOfDecl(TT->getDecl(), E->getExprLoc());
22222b1d51bcf891f8887759aebb4b9e78dee8542e6dFariborz Jahanian  }
2223af017e682918f7a1a95ff08d9ab7ae3426436ca3Anders Carlsson  return Context.getTypeOfExprType(E);
2224af017e682918f7a1a95ff08d9ab7ae3426436ca3Anders Carlsson}
2225af017e682918f7a1a95ff08d9ab7ae3426436ca3Anders Carlsson
22262a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType Sema::BuildDecltypeType(Expr *E, SourceLocation Loc) {
22272a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  ExprResult ER = CheckPlaceholderExpr(E, Loc);
22282a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  if (ER.isInvalid()) return QualType();
22292a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  E = ER.take();
22304b52e25f3b05ab0f9d2492276a52323a50a84fb7Douglas Gregor
2231af017e682918f7a1a95ff08d9ab7ae3426436ca3Anders Carlsson  return Context.getDecltypeType(E);
2232af017e682918f7a1a95ff08d9ab7ae3426436ca3Anders Carlsson}
2233