blob: accd7e63ed866c285fc85cea0fb14ba19268d13e [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- SemaType.cpp - Semantic Analysis for Types -----------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements type-related semantic analysis.
11//
12//===----------------------------------------------------------------------===//
13
Douglas Gregore737f502010-08-12 20:07:10 +000014#include "clang/Sema/Sema.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/AST/ASTContext.h"
Douglas Gregora8f32e02009-10-06 17:59:45 +000016#include "clang/AST/CXXInheritance.h"
Steve Naroff980e5082007-10-01 19:00:59 +000017#include "clang/AST/DeclObjC.h"
Douglas Gregor2943aed2009-03-03 04:44:36 +000018#include "clang/AST/DeclTemplate.h"
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +000019#include "clang/AST/TypeLoc.h"
John McCall51bd8032009-10-18 01:05:36 +000020#include "clang/AST/TypeLocVisitor.h"
Daniel Dunbare91593e2008-08-11 04:54:23 +000021#include "clang/AST/Expr.h"
Anders Carlsson91a0cc92009-08-26 22:33:56 +000022#include "clang/Basic/PartialDiagnostic.h"
Charles Davisd18f9f92010-08-16 04:01:50 +000023#include "clang/Basic/TargetInfo.h"
Daniel Dunbare4858a62008-08-11 03:45:03 +000024#include "clang/Parse/DeclSpec.h"
Sebastian Redl4994d2d2009-07-04 11:39:00 +000025#include "llvm/ADT/SmallPtrSet.h"
Douglas Gregor87c12c42009-11-04 16:49:01 +000026#include "llvm/Support/ErrorHandling.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000027using namespace clang;
28
Douglas Gregor2dc0e642009-03-23 23:06:20 +000029/// \brief Perform adjustment on the parameter type of a function.
30///
31/// This routine adjusts the given parameter type @p T to the actual
Mike Stump1eb44332009-09-09 15:08:12 +000032/// parameter type used by semantic analysis (C99 6.7.5.3p[7,8],
33/// C++ [dcl.fct]p3). The adjusted parameter type is returned.
Douglas Gregor2dc0e642009-03-23 23:06:20 +000034QualType Sema::adjustParameterType(QualType T) {
35 // C99 6.7.5.3p7:
Chris Lattner778ed742009-10-25 17:36:50 +000036 // A declaration of a parameter as "array of type" shall be
37 // adjusted to "qualified pointer to type", where the type
38 // qualifiers (if any) are those specified within the [ and ] of
39 // the array type derivation.
40 if (T->isArrayType())
Douglas Gregor2dc0e642009-03-23 23:06:20 +000041 return Context.getArrayDecayedType(T);
Chris Lattner778ed742009-10-25 17:36:50 +000042
43 // C99 6.7.5.3p8:
44 // A declaration of a parameter as "function returning type"
45 // shall be adjusted to "pointer to function returning type", as
46 // in 6.3.2.1.
47 if (T->isFunctionType())
Douglas Gregor2dc0e642009-03-23 23:06:20 +000048 return Context.getPointerType(T);
49
50 return T;
51}
52
Chris Lattner5db2bb12009-10-25 18:21:37 +000053
54
55/// isOmittedBlockReturnType - Return true if this declarator is missing a
56/// return type because this is a omitted return type on a block literal.
Sebastian Redl8ce35b02009-10-25 21:45:37 +000057static bool isOmittedBlockReturnType(const Declarator &D) {
Chris Lattner5db2bb12009-10-25 18:21:37 +000058 if (D.getContext() != Declarator::BlockLiteralContext ||
Sebastian Redl8ce35b02009-10-25 21:45:37 +000059 D.getDeclSpec().hasTypeSpecifier())
Chris Lattner5db2bb12009-10-25 18:21:37 +000060 return false;
61
62 if (D.getNumTypeObjects() == 0)
Chris Lattnera64ef0a2009-10-25 22:09:09 +000063 return true; // ^{ ... }
Chris Lattner5db2bb12009-10-25 18:21:37 +000064
65 if (D.getNumTypeObjects() == 1 &&
66 D.getTypeObject(0).Kind == DeclaratorChunk::Function)
Chris Lattnera64ef0a2009-10-25 22:09:09 +000067 return true; // ^(int X, float Y) { ... }
Chris Lattner5db2bb12009-10-25 18:21:37 +000068
69 return false;
70}
71
John McCall04a67a62010-02-05 21:31:56 +000072typedef std::pair<const AttributeList*,QualType> DelayedAttribute;
73typedef llvm::SmallVectorImpl<DelayedAttribute> DelayedAttributeSet;
74
75static void ProcessTypeAttributeList(Sema &S, QualType &Type,
Charles Davis328ce342010-02-24 02:27:18 +000076 bool IsDeclSpec,
John McCall04a67a62010-02-05 21:31:56 +000077 const AttributeList *Attrs,
78 DelayedAttributeSet &DelayedFnAttrs);
79static bool ProcessFnAttr(Sema &S, QualType &Type, const AttributeList &Attr);
80
81static void ProcessDelayedFnAttrs(Sema &S, QualType &Type,
82 DelayedAttributeSet &Attrs) {
83 for (DelayedAttributeSet::iterator I = Attrs.begin(),
84 E = Attrs.end(); I != E; ++I)
Abramo Bagnarae215f722010-04-30 13:10:51 +000085 if (ProcessFnAttr(S, Type, *I->first)) {
John McCall04a67a62010-02-05 21:31:56 +000086 S.Diag(I->first->getLoc(), diag::warn_function_attribute_wrong_type)
87 << I->first->getName() << I->second;
Abramo Bagnarae215f722010-04-30 13:10:51 +000088 // Avoid any further processing of this attribute.
89 I->first->setInvalid();
90 }
John McCall04a67a62010-02-05 21:31:56 +000091 Attrs.clear();
92}
93
94static void DiagnoseDelayedFnAttrs(Sema &S, DelayedAttributeSet &Attrs) {
95 for (DelayedAttributeSet::iterator I = Attrs.begin(),
96 E = Attrs.end(); I != E; ++I) {
97 S.Diag(I->first->getLoc(), diag::warn_function_attribute_wrong_type)
98 << I->first->getName() << I->second;
Abramo Bagnarae215f722010-04-30 13:10:51 +000099 // Avoid any further processing of this attribute.
100 I->first->setInvalid();
John McCall04a67a62010-02-05 21:31:56 +0000101 }
102 Attrs.clear();
103}
104
Douglas Gregor930d8b52009-01-30 22:09:00 +0000105/// \brief Convert the specified declspec to the appropriate type
106/// object.
Chris Lattner5db2bb12009-10-25 18:21:37 +0000107/// \param D the declarator containing the declaration specifier.
Chris Lattner5153ee62009-04-25 08:47:54 +0000108/// \returns The type described by the declaration specifiers. This function
109/// never returns null.
John McCall04a67a62010-02-05 21:31:56 +0000110static QualType ConvertDeclSpecToType(Sema &TheSema,
111 Declarator &TheDeclarator,
112 DelayedAttributeSet &Delayed) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000113 // FIXME: Should move the logic from DeclSpec::Finish to here for validity
114 // checking.
Chris Lattner5db2bb12009-10-25 18:21:37 +0000115 const DeclSpec &DS = TheDeclarator.getDeclSpec();
116 SourceLocation DeclLoc = TheDeclarator.getIdentifierLoc();
117 if (DeclLoc.isInvalid())
118 DeclLoc = DS.getSourceRange().getBegin();
Chris Lattner1564e392009-10-25 18:07:27 +0000119
120 ASTContext &Context = TheSema.Context;
Mike Stump1eb44332009-09-09 15:08:12 +0000121
Chris Lattner5db2bb12009-10-25 18:21:37 +0000122 QualType Result;
Reid Spencer5f016e22007-07-11 17:01:13 +0000123 switch (DS.getTypeSpecType()) {
Chris Lattner96b77fc2008-04-02 06:50:17 +0000124 case DeclSpec::TST_void:
125 Result = Context.VoidTy;
126 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000127 case DeclSpec::TST_char:
128 if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified)
Chris Lattnerfab5b452008-02-20 23:53:49 +0000129 Result = Context.CharTy;
Reid Spencer5f016e22007-07-11 17:01:13 +0000130 else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed)
Chris Lattnerfab5b452008-02-20 23:53:49 +0000131 Result = Context.SignedCharTy;
Reid Spencer5f016e22007-07-11 17:01:13 +0000132 else {
133 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned &&
134 "Unknown TSS value");
Chris Lattnerfab5b452008-02-20 23:53:49 +0000135 Result = Context.UnsignedCharTy;
Reid Spencer5f016e22007-07-11 17:01:13 +0000136 }
Chris Lattner958858e2008-02-20 21:40:32 +0000137 break;
Argyrios Kyrtzidis64c438a2008-08-09 16:51:54 +0000138 case DeclSpec::TST_wchar:
139 if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified)
140 Result = Context.WCharTy;
141 else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed) {
Chris Lattner1564e392009-10-25 18:07:27 +0000142 TheSema.Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec)
Chris Lattnerf3a41af2008-11-20 06:38:18 +0000143 << DS.getSpecifierName(DS.getTypeSpecType());
Argyrios Kyrtzidis64c438a2008-08-09 16:51:54 +0000144 Result = Context.getSignedWCharType();
145 } else {
146 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned &&
147 "Unknown TSS value");
Chris Lattner1564e392009-10-25 18:07:27 +0000148 TheSema.Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec)
Chris Lattnerf3a41af2008-11-20 06:38:18 +0000149 << DS.getSpecifierName(DS.getTypeSpecType());
Argyrios Kyrtzidis64c438a2008-08-09 16:51:54 +0000150 Result = Context.getUnsignedWCharType();
151 }
152 break;
Alisdair Meredithf5c209d2009-07-14 06:30:34 +0000153 case DeclSpec::TST_char16:
154 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
155 "Unknown TSS value");
156 Result = Context.Char16Ty;
157 break;
158 case DeclSpec::TST_char32:
159 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
160 "Unknown TSS value");
161 Result = Context.Char32Ty;
162 break;
Chris Lattnerd658b562008-04-05 06:32:51 +0000163 case DeclSpec::TST_unspecified:
Chris Lattner62f5f7f2008-07-26 00:46:50 +0000164 // "<proto1,proto2>" is an objc qualified ID with a missing id.
Chris Lattner097e9162008-10-20 02:01:50 +0000165 if (DeclSpec::ProtocolQualifierListTy PQ = DS.getProtocolQualifiers()) {
John McCallc12c5bb2010-05-15 11:32:37 +0000166 Result = Context.getObjCObjectType(Context.ObjCBuiltinIdTy,
167 (ObjCProtocolDecl**)PQ,
168 DS.getNumProtocolQualifiers());
169 Result = Context.getObjCObjectPointerType(Result);
Chris Lattner62f5f7f2008-07-26 00:46:50 +0000170 break;
171 }
Chris Lattner5db2bb12009-10-25 18:21:37 +0000172
173 // If this is a missing declspec in a block literal return context, then it
174 // is inferred from the return statements inside the block.
Sebastian Redl8ce35b02009-10-25 21:45:37 +0000175 if (isOmittedBlockReturnType(TheDeclarator)) {
Chris Lattner5db2bb12009-10-25 18:21:37 +0000176 Result = Context.DependentTy;
177 break;
178 }
Mike Stump1eb44332009-09-09 15:08:12 +0000179
Chris Lattnerd658b562008-04-05 06:32:51 +0000180 // Unspecified typespec defaults to int in C90. However, the C90 grammar
181 // [C90 6.5] only allows a decl-spec if there was *some* type-specifier,
182 // type-qualifier, or storage-class-specifier. If not, emit an extwarn.
183 // Note that the one exception to this is function definitions, which are
184 // allowed to be completely missing a declspec. This is handled in the
185 // parser already though by it pretending to have seen an 'int' in this
186 // case.
Chris Lattner1564e392009-10-25 18:07:27 +0000187 if (TheSema.getLangOptions().ImplicitInt) {
Chris Lattner35d276f2009-02-27 18:53:28 +0000188 // In C89 mode, we only warn if there is a completely missing declspec
189 // when one is not allowed.
Chris Lattner3f84ad22009-04-22 05:27:59 +0000190 if (DS.isEmpty()) {
Chris Lattner1564e392009-10-25 18:07:27 +0000191 TheSema.Diag(DeclLoc, diag::ext_missing_declspec)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000192 << DS.getSourceRange()
Douglas Gregor849b2432010-03-31 17:46:05 +0000193 << FixItHint::CreateInsertion(DS.getSourceRange().getBegin(), "int");
Chris Lattner3f84ad22009-04-22 05:27:59 +0000194 }
Douglas Gregor4310f4e2009-02-16 22:38:20 +0000195 } else if (!DS.hasTypeSpecifier()) {
Chris Lattnerd658b562008-04-05 06:32:51 +0000196 // C99 and C++ require a type specifier. For example, C99 6.7.2p2 says:
197 // "At least one type specifier shall be given in the declaration
198 // specifiers in each declaration, and in the specifier-qualifier list in
199 // each struct declaration and type name."
Douglas Gregor4310f4e2009-02-16 22:38:20 +0000200 // FIXME: Does Microsoft really have the implicit int extension in C++?
Chris Lattner1564e392009-10-25 18:07:27 +0000201 if (TheSema.getLangOptions().CPlusPlus &&
202 !TheSema.getLangOptions().Microsoft) {
203 TheSema.Diag(DeclLoc, diag::err_missing_type_specifier)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000204 << DS.getSourceRange();
Mike Stump1eb44332009-09-09 15:08:12 +0000205
Chris Lattnerb78d8332009-06-26 04:45:06 +0000206 // When this occurs in C++ code, often something is very broken with the
207 // value being declared, poison it as invalid so we don't get chains of
208 // errors.
Chris Lattner5db2bb12009-10-25 18:21:37 +0000209 TheDeclarator.setInvalidType(true);
Chris Lattnerb78d8332009-06-26 04:45:06 +0000210 } else {
Chris Lattner1564e392009-10-25 18:07:27 +0000211 TheSema.Diag(DeclLoc, diag::ext_missing_type_specifier)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000212 << DS.getSourceRange();
Chris Lattnerb78d8332009-06-26 04:45:06 +0000213 }
Chris Lattnerd658b562008-04-05 06:32:51 +0000214 }
Mike Stump1eb44332009-09-09 15:08:12 +0000215
216 // FALL THROUGH.
Chris Lattner3cbc38b2007-08-21 17:02:28 +0000217 case DeclSpec::TST_int: {
Reid Spencer5f016e22007-07-11 17:01:13 +0000218 if (DS.getTypeSpecSign() != DeclSpec::TSS_unsigned) {
219 switch (DS.getTypeSpecWidth()) {
Chris Lattnerfab5b452008-02-20 23:53:49 +0000220 case DeclSpec::TSW_unspecified: Result = Context.IntTy; break;
221 case DeclSpec::TSW_short: Result = Context.ShortTy; break;
222 case DeclSpec::TSW_long: Result = Context.LongTy; break;
Chris Lattner311157f2009-10-25 18:25:04 +0000223 case DeclSpec::TSW_longlong:
224 Result = Context.LongLongTy;
225
226 // long long is a C99 feature.
227 if (!TheSema.getLangOptions().C99 &&
228 !TheSema.getLangOptions().CPlusPlus0x)
229 TheSema.Diag(DS.getTypeSpecWidthLoc(), diag::ext_longlong);
230 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000231 }
232 } else {
233 switch (DS.getTypeSpecWidth()) {
Chris Lattnerfab5b452008-02-20 23:53:49 +0000234 case DeclSpec::TSW_unspecified: Result = Context.UnsignedIntTy; break;
235 case DeclSpec::TSW_short: Result = Context.UnsignedShortTy; break;
236 case DeclSpec::TSW_long: Result = Context.UnsignedLongTy; break;
Chris Lattner311157f2009-10-25 18:25:04 +0000237 case DeclSpec::TSW_longlong:
238 Result = Context.UnsignedLongLongTy;
239
240 // long long is a C99 feature.
241 if (!TheSema.getLangOptions().C99 &&
242 !TheSema.getLangOptions().CPlusPlus0x)
243 TheSema.Diag(DS.getTypeSpecWidthLoc(), diag::ext_longlong);
244 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000245 }
246 }
Chris Lattner958858e2008-02-20 21:40:32 +0000247 break;
Chris Lattner3cbc38b2007-08-21 17:02:28 +0000248 }
Chris Lattnerfab5b452008-02-20 23:53:49 +0000249 case DeclSpec::TST_float: Result = Context.FloatTy; break;
Chris Lattner958858e2008-02-20 21:40:32 +0000250 case DeclSpec::TST_double:
251 if (DS.getTypeSpecWidth() == DeclSpec::TSW_long)
Chris Lattnerfab5b452008-02-20 23:53:49 +0000252 Result = Context.LongDoubleTy;
Chris Lattner958858e2008-02-20 21:40:32 +0000253 else
Chris Lattnerfab5b452008-02-20 23:53:49 +0000254 Result = Context.DoubleTy;
Chris Lattner958858e2008-02-20 21:40:32 +0000255 break;
Chris Lattnerfab5b452008-02-20 23:53:49 +0000256 case DeclSpec::TST_bool: Result = Context.BoolTy; break; // _Bool or bool
Reid Spencer5f016e22007-07-11 17:01:13 +0000257 case DeclSpec::TST_decimal32: // _Decimal32
258 case DeclSpec::TST_decimal64: // _Decimal64
259 case DeclSpec::TST_decimal128: // _Decimal128
Chris Lattner1564e392009-10-25 18:07:27 +0000260 TheSema.Diag(DS.getTypeSpecTypeLoc(), diag::err_decimal_unsupported);
Chris Lattner8f12f652009-05-13 05:02:08 +0000261 Result = Context.IntTy;
Chris Lattner5db2bb12009-10-25 18:21:37 +0000262 TheDeclarator.setInvalidType(true);
Chris Lattner8f12f652009-05-13 05:02:08 +0000263 break;
Chris Lattner99dc9142008-04-13 18:59:07 +0000264 case DeclSpec::TST_class:
Reid Spencer5f016e22007-07-11 17:01:13 +0000265 case DeclSpec::TST_enum:
266 case DeclSpec::TST_union:
267 case DeclSpec::TST_struct: {
Douglas Gregorc7621a62009-11-05 20:54:04 +0000268 TypeDecl *D
269 = dyn_cast_or_null<TypeDecl>(static_cast<Decl *>(DS.getTypeRep()));
John McCall6e247262009-10-10 05:48:19 +0000270 if (!D) {
271 // This can happen in C++ with ambiguous lookups.
272 Result = Context.IntTy;
Chris Lattner5db2bb12009-10-25 18:21:37 +0000273 TheDeclarator.setInvalidType(true);
John McCall6e247262009-10-10 05:48:19 +0000274 break;
275 }
276
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000277 // If the type is deprecated or unavailable, diagnose it.
John McCall54abf7d2009-11-04 02:18:39 +0000278 TheSema.DiagnoseUseOfDecl(D, DS.getTypeSpecTypeLoc());
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000279
Reid Spencer5f016e22007-07-11 17:01:13 +0000280 assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 &&
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000281 DS.getTypeSpecSign() == 0 && "No qualifiers on tag names!");
282
Reid Spencer5f016e22007-07-11 17:01:13 +0000283 // TypeQuals handled by caller.
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000284 Result = Context.getTypeDeclType(D);
John McCall2191b202009-09-05 06:31:47 +0000285
286 // In C++, make an ElaboratedType.
Chris Lattner1564e392009-10-25 18:07:27 +0000287 if (TheSema.getLangOptions().CPlusPlus) {
Abramo Bagnara465d41b2010-05-11 21:36:43 +0000288 ElaboratedTypeKeyword Keyword
289 = ElaboratedType::getKeywordForTypeSpec(DS.getTypeSpecType());
290 Result = TheSema.getElaboratedType(Keyword, DS.getTypeSpecScope(),
291 Result);
John McCall2191b202009-09-05 06:31:47 +0000292 }
Chris Lattner5153ee62009-04-25 08:47:54 +0000293 if (D->isInvalidDecl())
Chris Lattner5db2bb12009-10-25 18:21:37 +0000294 TheDeclarator.setInvalidType(true);
Chris Lattner958858e2008-02-20 21:40:32 +0000295 break;
Mike Stump1eb44332009-09-09 15:08:12 +0000296 }
Douglas Gregor1a51b4a2009-02-09 15:09:02 +0000297 case DeclSpec::TST_typename: {
Reid Spencer5f016e22007-07-11 17:01:13 +0000298 assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 &&
299 DS.getTypeSpecSign() == 0 &&
300 "Can't handle qualifiers on typedef names yet!");
Chris Lattner1564e392009-10-25 18:07:27 +0000301 Result = TheSema.GetTypeFromParser(DS.getTypeRep());
John McCall27940d22010-07-30 05:17:22 +0000302 if (Result.isNull())
303 TheDeclarator.setInvalidType(true);
304 else if (DeclSpec::ProtocolQualifierListTy PQ
305 = DS.getProtocolQualifiers()) {
John McCallc12c5bb2010-05-15 11:32:37 +0000306 if (const ObjCObjectType *ObjT = Result->getAs<ObjCObjectType>()) {
307 // Silently drop any existing protocol qualifiers.
308 // TODO: determine whether that's the right thing to do.
309 if (ObjT->getNumProtocols())
310 Result = ObjT->getBaseType();
311
312 if (DS.getNumProtocolQualifiers())
313 Result = Context.getObjCObjectType(Result,
314 (ObjCProtocolDecl**) PQ,
315 DS.getNumProtocolQualifiers());
316 } else if (Result->isObjCIdType()) {
Chris Lattnerae4da612008-07-26 01:53:50 +0000317 // id<protocol-list>
John McCallc12c5bb2010-05-15 11:32:37 +0000318 Result = Context.getObjCObjectType(Context.ObjCBuiltinIdTy,
319 (ObjCProtocolDecl**) PQ,
320 DS.getNumProtocolQualifiers());
321 Result = Context.getObjCObjectPointerType(Result);
322 } else if (Result->isObjCClassType()) {
Steve Naroff4262a072009-02-23 18:53:24 +0000323 // Class<protocol-list>
John McCallc12c5bb2010-05-15 11:32:37 +0000324 Result = Context.getObjCObjectType(Context.ObjCBuiltinClassTy,
325 (ObjCProtocolDecl**) PQ,
326 DS.getNumProtocolQualifiers());
327 Result = Context.getObjCObjectPointerType(Result);
Chris Lattner3f84ad22009-04-22 05:27:59 +0000328 } else {
Chris Lattner1564e392009-10-25 18:07:27 +0000329 TheSema.Diag(DeclLoc, diag::err_invalid_protocol_qualifiers)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000330 << DS.getSourceRange();
Chris Lattner5db2bb12009-10-25 18:21:37 +0000331 TheDeclarator.setInvalidType(true);
Chris Lattner3f84ad22009-04-22 05:27:59 +0000332 }
Fariborz Jahanianc5692492007-12-17 21:03:50 +0000333 }
Mike Stump1eb44332009-09-09 15:08:12 +0000334
Reid Spencer5f016e22007-07-11 17:01:13 +0000335 // TypeQuals handled by caller.
Chris Lattner958858e2008-02-20 21:40:32 +0000336 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000337 }
Chris Lattner958858e2008-02-20 21:40:32 +0000338 case DeclSpec::TST_typeofType:
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +0000339 // FIXME: Preserve type source info.
Chris Lattner1564e392009-10-25 18:07:27 +0000340 Result = TheSema.GetTypeFromParser(DS.getTypeRep());
Chris Lattner958858e2008-02-20 21:40:32 +0000341 assert(!Result.isNull() && "Didn't get a type for typeof?");
Steve Naroffd1861fd2007-07-31 12:34:36 +0000342 // TypeQuals handled by caller.
Chris Lattnerfab5b452008-02-20 23:53:49 +0000343 Result = Context.getTypeOfType(Result);
Chris Lattner958858e2008-02-20 21:40:32 +0000344 break;
Steve Naroffd1861fd2007-07-31 12:34:36 +0000345 case DeclSpec::TST_typeofExpr: {
346 Expr *E = static_cast<Expr *>(DS.getTypeRep());
347 assert(E && "Didn't get an expression for typeof?");
348 // TypeQuals handled by caller.
Douglas Gregor4b52e252009-12-21 23:17:24 +0000349 Result = TheSema.BuildTypeofExprType(E);
350 if (Result.isNull()) {
351 Result = Context.IntTy;
352 TheDeclarator.setInvalidType(true);
353 }
Chris Lattner958858e2008-02-20 21:40:32 +0000354 break;
Steve Naroffd1861fd2007-07-31 12:34:36 +0000355 }
Anders Carlsson6fd634f2009-06-24 17:47:40 +0000356 case DeclSpec::TST_decltype: {
357 Expr *E = static_cast<Expr *>(DS.getTypeRep());
358 assert(E && "Didn't get an expression for decltype?");
359 // TypeQuals handled by caller.
Chris Lattner1564e392009-10-25 18:07:27 +0000360 Result = TheSema.BuildDecltypeType(E);
Anders Carlssonaf017e62009-06-29 22:58:55 +0000361 if (Result.isNull()) {
362 Result = Context.IntTy;
Chris Lattner5db2bb12009-10-25 18:21:37 +0000363 TheDeclarator.setInvalidType(true);
Anders Carlssonaf017e62009-06-29 22:58:55 +0000364 }
Anders Carlsson6fd634f2009-06-24 17:47:40 +0000365 break;
366 }
Anders Carlssone89d1592009-06-26 18:41:36 +0000367 case DeclSpec::TST_auto: {
368 // TypeQuals handled by caller.
369 Result = Context.UndeducedAutoTy;
370 break;
371 }
Mike Stump1eb44332009-09-09 15:08:12 +0000372
Douglas Gregor809070a2009-02-18 17:45:20 +0000373 case DeclSpec::TST_error:
Chris Lattner5153ee62009-04-25 08:47:54 +0000374 Result = Context.IntTy;
Chris Lattner5db2bb12009-10-25 18:21:37 +0000375 TheDeclarator.setInvalidType(true);
Chris Lattner5153ee62009-04-25 08:47:54 +0000376 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000377 }
Mike Stump1eb44332009-09-09 15:08:12 +0000378
Chris Lattner958858e2008-02-20 21:40:32 +0000379 // Handle complex types.
Douglas Gregorf244cd72009-02-14 21:06:05 +0000380 if (DS.getTypeSpecComplex() == DeclSpec::TSC_complex) {
Chris Lattner1564e392009-10-25 18:07:27 +0000381 if (TheSema.getLangOptions().Freestanding)
382 TheSema.Diag(DS.getTypeSpecComplexLoc(), diag::ext_freestanding_complex);
Chris Lattnerfab5b452008-02-20 23:53:49 +0000383 Result = Context.getComplexType(Result);
John Thompson82287d12010-02-05 00:12:22 +0000384 } else if (DS.isTypeAltiVecVector()) {
385 unsigned typeSize = static_cast<unsigned>(Context.getTypeSize(Result));
386 assert(typeSize > 0 && "type size for vector must be greater than 0 bits");
Chris Lattner788b0fd2010-06-23 06:00:24 +0000387 VectorType::AltiVecSpecific AltiVecSpec = VectorType::AltiVec;
388 if (DS.isTypeAltiVecPixel())
389 AltiVecSpec = VectorType::Pixel;
390 else if (DS.isTypeAltiVecBool())
391 AltiVecSpec = VectorType::Bool;
392 Result = Context.getVectorType(Result, 128/typeSize, AltiVecSpec);
Douglas Gregorf244cd72009-02-14 21:06:05 +0000393 }
Mike Stump1eb44332009-09-09 15:08:12 +0000394
Chris Lattner958858e2008-02-20 21:40:32 +0000395 assert(DS.getTypeSpecComplex() != DeclSpec::TSC_imaginary &&
396 "FIXME: imaginary types not supported yet!");
Mike Stump1eb44332009-09-09 15:08:12 +0000397
Chris Lattner38d8b982008-02-20 22:04:11 +0000398 // See if there are any attributes on the declspec that apply to the type (as
399 // opposed to the decl).
Chris Lattnerfca0ddd2008-06-26 06:27:57 +0000400 if (const AttributeList *AL = DS.getAttributes())
Charles Davis328ce342010-02-24 02:27:18 +0000401 ProcessTypeAttributeList(TheSema, Result, true, AL, Delayed);
Mike Stump1eb44332009-09-09 15:08:12 +0000402
Chris Lattner96b77fc2008-04-02 06:50:17 +0000403 // Apply const/volatile/restrict qualifiers to T.
404 if (unsigned TypeQuals = DS.getTypeQualifiers()) {
405
406 // Enforce C99 6.7.3p2: "Types other than pointer types derived from object
407 // or incomplete types shall not be restrict-qualified." C++ also allows
408 // restrict-qualified references.
John McCall0953e762009-09-24 19:53:00 +0000409 if (TypeQuals & DeclSpec::TQ_restrict) {
Fariborz Jahanian2b5ff1a2009-12-07 18:08:58 +0000410 if (Result->isAnyPointerType() || Result->isReferenceType()) {
411 QualType EltTy;
412 if (Result->isObjCObjectPointerType())
413 EltTy = Result;
414 else
415 EltTy = Result->isPointerType() ?
416 Result->getAs<PointerType>()->getPointeeType() :
417 Result->getAs<ReferenceType>()->getPointeeType();
Mike Stump1eb44332009-09-09 15:08:12 +0000418
Douglas Gregorbad0e652009-03-24 20:32:41 +0000419 // If we have a pointer or reference, the pointee must have an object
Chris Lattnerbdcd6372008-04-02 17:35:06 +0000420 // incomplete type.
421 if (!EltTy->isIncompleteOrObjectType()) {
Chris Lattner1564e392009-10-25 18:07:27 +0000422 TheSema.Diag(DS.getRestrictSpecLoc(),
Chris Lattnerd3a94e22008-11-20 06:06:08 +0000423 diag::err_typecheck_invalid_restrict_invalid_pointee)
Chris Lattnerd1625842008-11-24 06:25:27 +0000424 << EltTy << DS.getSourceRange();
John McCall0953e762009-09-24 19:53:00 +0000425 TypeQuals &= ~DeclSpec::TQ_restrict; // Remove the restrict qualifier.
Chris Lattnerbdcd6372008-04-02 17:35:06 +0000426 }
427 } else {
Chris Lattner1564e392009-10-25 18:07:27 +0000428 TheSema.Diag(DS.getRestrictSpecLoc(),
Chris Lattnerd3a94e22008-11-20 06:06:08 +0000429 diag::err_typecheck_invalid_restrict_not_pointer)
Chris Lattnerd1625842008-11-24 06:25:27 +0000430 << Result << DS.getSourceRange();
John McCall0953e762009-09-24 19:53:00 +0000431 TypeQuals &= ~DeclSpec::TQ_restrict; // Remove the restrict qualifier.
Chris Lattner96b77fc2008-04-02 06:50:17 +0000432 }
Chris Lattner96b77fc2008-04-02 06:50:17 +0000433 }
Mike Stump1eb44332009-09-09 15:08:12 +0000434
Chris Lattner96b77fc2008-04-02 06:50:17 +0000435 // Warn about CV qualifiers on functions: C99 6.7.3p8: "If the specification
436 // of a function type includes any type qualifiers, the behavior is
437 // undefined."
438 if (Result->isFunctionType() && TypeQuals) {
439 // Get some location to point at, either the C or V location.
440 SourceLocation Loc;
John McCall0953e762009-09-24 19:53:00 +0000441 if (TypeQuals & DeclSpec::TQ_const)
Chris Lattner96b77fc2008-04-02 06:50:17 +0000442 Loc = DS.getConstSpecLoc();
John McCall0953e762009-09-24 19:53:00 +0000443 else if (TypeQuals & DeclSpec::TQ_volatile)
Chris Lattner96b77fc2008-04-02 06:50:17 +0000444 Loc = DS.getVolatileSpecLoc();
John McCall0953e762009-09-24 19:53:00 +0000445 else {
446 assert((TypeQuals & DeclSpec::TQ_restrict) &&
447 "Has CVR quals but not C, V, or R?");
448 Loc = DS.getRestrictSpecLoc();
Chris Lattner96b77fc2008-04-02 06:50:17 +0000449 }
Chris Lattner1564e392009-10-25 18:07:27 +0000450 TheSema.Diag(Loc, diag::warn_typecheck_function_qualifiers)
Chris Lattnerd1625842008-11-24 06:25:27 +0000451 << Result << DS.getSourceRange();
Chris Lattner96b77fc2008-04-02 06:50:17 +0000452 }
Mike Stump1eb44332009-09-09 15:08:12 +0000453
Douglas Gregorf1f9b4e2008-11-03 15:51:28 +0000454 // C++ [dcl.ref]p1:
455 // Cv-qualified references are ill-formed except when the
456 // cv-qualifiers are introduced through the use of a typedef
457 // (7.1.3) or of a template type argument (14.3), in which
458 // case the cv-qualifiers are ignored.
Douglas Gregor1a51b4a2009-02-09 15:09:02 +0000459 // FIXME: Shouldn't we be checking SCS_typedef here?
460 if (DS.getTypeSpecType() == DeclSpec::TST_typename &&
Douglas Gregorf1f9b4e2008-11-03 15:51:28 +0000461 TypeQuals && Result->isReferenceType()) {
John McCall0953e762009-09-24 19:53:00 +0000462 TypeQuals &= ~DeclSpec::TQ_const;
463 TypeQuals &= ~DeclSpec::TQ_volatile;
Mike Stump1eb44332009-09-09 15:08:12 +0000464 }
465
John McCall0953e762009-09-24 19:53:00 +0000466 Qualifiers Quals = Qualifiers::fromCVRMask(TypeQuals);
467 Result = Context.getQualifiedType(Result, Quals);
Chris Lattner96b77fc2008-04-02 06:50:17 +0000468 }
John McCall0953e762009-09-24 19:53:00 +0000469
Chris Lattnerf1d705c2008-02-21 01:07:18 +0000470 return Result;
471}
472
Douglas Gregorcd281c32009-02-28 00:25:32 +0000473static std::string getPrintableNameForEntity(DeclarationName Entity) {
474 if (Entity)
475 return Entity.getAsString();
Mike Stump1eb44332009-09-09 15:08:12 +0000476
Douglas Gregorcd281c32009-02-28 00:25:32 +0000477 return "type name";
478}
479
John McCall28654742010-06-05 06:41:15 +0000480QualType Sema::BuildQualifiedType(QualType T, SourceLocation Loc,
481 Qualifiers Qs) {
482 // Enforce C99 6.7.3p2: "Types other than pointer types derived from
483 // object or incomplete types shall not be restrict-qualified."
484 if (Qs.hasRestrict()) {
485 unsigned DiagID = 0;
486 QualType ProblemTy;
487
488 const Type *Ty = T->getCanonicalTypeInternal().getTypePtr();
489 if (const ReferenceType *RTy = dyn_cast<ReferenceType>(Ty)) {
490 if (!RTy->getPointeeType()->isIncompleteOrObjectType()) {
491 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
492 ProblemTy = T->getAs<ReferenceType>()->getPointeeType();
493 }
494 } else if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
495 if (!PTy->getPointeeType()->isIncompleteOrObjectType()) {
496 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
497 ProblemTy = T->getAs<PointerType>()->getPointeeType();
498 }
499 } else if (const MemberPointerType *PTy = dyn_cast<MemberPointerType>(Ty)) {
500 if (!PTy->getPointeeType()->isIncompleteOrObjectType()) {
501 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
502 ProblemTy = T->getAs<PointerType>()->getPointeeType();
503 }
504 } else if (!Ty->isDependentType()) {
505 // FIXME: this deserves a proper diagnostic
506 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
507 ProblemTy = T;
508 }
509
510 if (DiagID) {
511 Diag(Loc, DiagID) << ProblemTy;
512 Qs.removeRestrict();
513 }
514 }
515
516 return Context.getQualifiedType(T, Qs);
517}
518
Douglas Gregorcd281c32009-02-28 00:25:32 +0000519/// \brief Build a pointer type.
520///
521/// \param T The type to which we'll be building a pointer.
522///
Douglas Gregorcd281c32009-02-28 00:25:32 +0000523/// \param Loc The location of the entity whose type involves this
524/// pointer type or, if there is no such entity, the location of the
525/// type that will have pointer type.
526///
527/// \param Entity The name of the entity that involves the pointer
528/// type, if known.
529///
530/// \returns A suitable pointer type, if there are no
531/// errors. Otherwise, returns a NULL type.
John McCall28654742010-06-05 06:41:15 +0000532QualType Sema::BuildPointerType(QualType T,
Douglas Gregorcd281c32009-02-28 00:25:32 +0000533 SourceLocation Loc, DeclarationName Entity) {
534 if (T->isReferenceType()) {
535 // C++ 8.3.2p4: There shall be no ... pointers to references ...
536 Diag(Loc, diag::err_illegal_decl_pointer_to_reference)
John McCallac406052009-10-30 00:37:20 +0000537 << getPrintableNameForEntity(Entity) << T;
Douglas Gregorcd281c32009-02-28 00:25:32 +0000538 return QualType();
539 }
540
John McCallc12c5bb2010-05-15 11:32:37 +0000541 assert(!T->isObjCObjectType() && "Should build ObjCObjectPointerType");
Douglas Gregor92e986e2010-04-22 16:44:27 +0000542
Douglas Gregorcd281c32009-02-28 00:25:32 +0000543 // Build the pointer type.
John McCall28654742010-06-05 06:41:15 +0000544 return Context.getPointerType(T);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000545}
546
547/// \brief Build a reference type.
548///
549/// \param T The type to which we'll be building a reference.
550///
Douglas Gregorcd281c32009-02-28 00:25:32 +0000551/// \param Loc The location of the entity whose type involves this
552/// reference type or, if there is no such entity, the location of the
553/// type that will have reference type.
554///
555/// \param Entity The name of the entity that involves the reference
556/// type, if known.
557///
558/// \returns A suitable reference type, if there are no
559/// errors. Otherwise, returns a NULL type.
John McCall54e14c42009-10-22 22:37:11 +0000560QualType Sema::BuildReferenceType(QualType T, bool SpelledAsLValue,
John McCall28654742010-06-05 06:41:15 +0000561 SourceLocation Loc,
John McCall54e14c42009-10-22 22:37:11 +0000562 DeclarationName Entity) {
John McCall54e14c42009-10-22 22:37:11 +0000563 bool LValueRef = SpelledAsLValue || T->getAs<LValueReferenceType>();
564
565 // C++0x [dcl.typedef]p9: If a typedef TD names a type that is a
566 // reference to a type T, and attempt to create the type "lvalue
567 // reference to cv TD" creates the type "lvalue reference to T".
568 // We use the qualifiers (restrict or none) of the original reference,
569 // not the new ones. This is consistent with GCC.
570
571 // C++ [dcl.ref]p4: There shall be no references to references.
572 //
573 // According to C++ DR 106, references to references are only
574 // diagnosed when they are written directly (e.g., "int & &"),
575 // but not when they happen via a typedef:
576 //
577 // typedef int& intref;
578 // typedef intref& intref2;
579 //
580 // Parser::ParseDeclaratorInternal diagnoses the case where
581 // references are written directly; here, we handle the
582 // collapsing of references-to-references as described in C++
583 // DR 106 and amended by C++ DR 540.
Douglas Gregorcd281c32009-02-28 00:25:32 +0000584
585 // C++ [dcl.ref]p1:
Eli Friedman33a31382009-08-05 19:21:58 +0000586 // A declarator that specifies the type "reference to cv void"
Douglas Gregorcd281c32009-02-28 00:25:32 +0000587 // is ill-formed.
588 if (T->isVoidType()) {
589 Diag(Loc, diag::err_reference_to_void);
590 return QualType();
591 }
592
Douglas Gregorcd281c32009-02-28 00:25:32 +0000593 // Handle restrict on references.
Sebastian Redl7c80bd62009-03-16 23:22:08 +0000594 if (LValueRef)
John McCall28654742010-06-05 06:41:15 +0000595 return Context.getLValueReferenceType(T, SpelledAsLValue);
596 return Context.getRValueReferenceType(T);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000597}
598
599/// \brief Build an array type.
600///
601/// \param T The type of each element in the array.
602///
603/// \param ASM C99 array size modifier (e.g., '*', 'static').
Mike Stump1eb44332009-09-09 15:08:12 +0000604///
605/// \param ArraySize Expression describing the size of the array.
Douglas Gregorcd281c32009-02-28 00:25:32 +0000606///
Douglas Gregorcd281c32009-02-28 00:25:32 +0000607/// \param Loc The location of the entity whose type involves this
608/// array type or, if there is no such entity, the location of the
609/// type that will have array type.
610///
611/// \param Entity The name of the entity that involves the array
612/// type, if known.
613///
614/// \returns A suitable array type, if there are no errors. Otherwise,
615/// returns a NULL type.
616QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM,
617 Expr *ArraySize, unsigned Quals,
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +0000618 SourceRange Brackets, DeclarationName Entity) {
John McCall0953e762009-09-24 19:53:00 +0000619
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +0000620 SourceLocation Loc = Brackets.getBegin();
Sebastian Redl923d56d2009-11-05 15:52:31 +0000621 if (getLangOptions().CPlusPlus) {
Douglas Gregor138bb232010-04-27 19:38:14 +0000622 // C++ [dcl.array]p1:
623 // T is called the array element type; this type shall not be a reference
624 // type, the (possibly cv-qualified) type void, a function type or an
625 // abstract class type.
626 //
627 // Note: function types are handled in the common path with C.
628 if (T->isReferenceType()) {
629 Diag(Loc, diag::err_illegal_decl_array_of_references)
630 << getPrintableNameForEntity(Entity) << T;
631 return QualType();
632 }
633
Sebastian Redl923d56d2009-11-05 15:52:31 +0000634 if (T->isVoidType()) {
635 Diag(Loc, diag::err_illegal_decl_array_incomplete_type) << T;
636 return QualType();
637 }
Douglas Gregor138bb232010-04-27 19:38:14 +0000638
639 if (RequireNonAbstractType(Brackets.getBegin(), T,
640 diag::err_array_of_abstract_type))
641 return QualType();
642
Sebastian Redl923d56d2009-11-05 15:52:31 +0000643 } else {
Douglas Gregor138bb232010-04-27 19:38:14 +0000644 // C99 6.7.5.2p1: If the element type is an incomplete or function type,
645 // reject it (e.g. void ary[7], struct foo ary[7], void ary[7]())
Sebastian Redl923d56d2009-11-05 15:52:31 +0000646 if (RequireCompleteType(Loc, T,
647 diag::err_illegal_decl_array_incomplete_type))
648 return QualType();
649 }
Douglas Gregorcd281c32009-02-28 00:25:32 +0000650
651 if (T->isFunctionType()) {
652 Diag(Loc, diag::err_illegal_decl_array_of_functions)
John McCallac406052009-10-30 00:37:20 +0000653 << getPrintableNameForEntity(Entity) << T;
Douglas Gregorcd281c32009-02-28 00:25:32 +0000654 return QualType();
655 }
Mike Stump1eb44332009-09-09 15:08:12 +0000656
Anders Carlssone7cf07d2009-06-26 19:33:28 +0000657 if (Context.getCanonicalType(T) == Context.UndeducedAutoTy) {
Mike Stump1eb44332009-09-09 15:08:12 +0000658 Diag(Loc, diag::err_illegal_decl_array_of_auto)
Anders Carlssone7cf07d2009-06-26 19:33:28 +0000659 << getPrintableNameForEntity(Entity);
660 return QualType();
661 }
Mike Stump1eb44332009-09-09 15:08:12 +0000662
Ted Kremenek6217b802009-07-29 21:53:49 +0000663 if (const RecordType *EltTy = T->getAs<RecordType>()) {
Douglas Gregorcd281c32009-02-28 00:25:32 +0000664 // If the element type is a struct or union that contains a variadic
665 // array, accept it as a GNU extension: C99 6.7.2.1p2.
666 if (EltTy->getDecl()->hasFlexibleArrayMember())
667 Diag(Loc, diag::ext_flexible_array_in_array) << T;
John McCallc12c5bb2010-05-15 11:32:37 +0000668 } else if (T->isObjCObjectType()) {
Chris Lattnerc7c11b12009-04-27 01:55:56 +0000669 Diag(Loc, diag::err_objc_array_of_interfaces) << T;
670 return QualType();
Douglas Gregorcd281c32009-02-28 00:25:32 +0000671 }
Mike Stump1eb44332009-09-09 15:08:12 +0000672
Douglas Gregorcd281c32009-02-28 00:25:32 +0000673 // C99 6.7.5.2p1: The size expression shall have integer type.
674 if (ArraySize && !ArraySize->isTypeDependent() &&
675 !ArraySize->getType()->isIntegerType()) {
676 Diag(ArraySize->getLocStart(), diag::err_array_size_non_int)
677 << ArraySize->getType() << ArraySize->getSourceRange();
Douglas Gregorcd281c32009-02-28 00:25:32 +0000678 return QualType();
679 }
Douglas Gregor2767ce22010-08-18 00:39:00 +0000680 llvm::APSInt ConstVal(Context.getTypeSize(Context.getSizeType()));
Douglas Gregorcd281c32009-02-28 00:25:32 +0000681 if (!ArraySize) {
Eli Friedmanf91f5c82009-04-26 21:57:51 +0000682 if (ASM == ArrayType::Star)
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +0000683 T = Context.getVariableArrayType(T, 0, ASM, Quals, Brackets);
Eli Friedmanf91f5c82009-04-26 21:57:51 +0000684 else
685 T = Context.getIncompleteArrayType(T, ASM, Quals);
Douglas Gregorac06a0e2010-05-18 23:01:22 +0000686 } else if (ArraySize->isTypeDependent() || ArraySize->isValueDependent()) {
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +0000687 T = Context.getDependentSizedArrayType(T, ArraySize, ASM, Quals, Brackets);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000688 } else if (!ArraySize->isIntegerConstantExpr(ConstVal, Context) ||
Sebastian Redl923d56d2009-11-05 15:52:31 +0000689 (!T->isDependentType() && !T->isIncompleteType() &&
690 !T->isConstantSizeType())) {
Douglas Gregorcd281c32009-02-28 00:25:32 +0000691 // Per C99, a variable array is an array with either a non-constant
692 // size or an element type that has a non-constant-size
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +0000693 T = Context.getVariableArrayType(T, ArraySize, ASM, Quals, Brackets);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000694 } else {
695 // C99 6.7.5.2p1: If the expression is a constant expression, it shall
696 // have a value greater than zero.
Sebastian Redl923d56d2009-11-05 15:52:31 +0000697 if (ConstVal.isSigned() && ConstVal.isNegative()) {
698 Diag(ArraySize->getLocStart(),
699 diag::err_typecheck_negative_array_size)
700 << ArraySize->getSourceRange();
701 return QualType();
702 }
703 if (ConstVal == 0) {
Douglas Gregor02024a92010-03-28 02:42:43 +0000704 // GCC accepts zero sized static arrays. We allow them when
705 // we're not in a SFINAE context.
706 Diag(ArraySize->getLocStart(),
707 isSFINAEContext()? diag::err_typecheck_zero_array_size
708 : diag::ext_typecheck_zero_array_size)
Sebastian Redl923d56d2009-11-05 15:52:31 +0000709 << ArraySize->getSourceRange();
Douglas Gregor2767ce22010-08-18 00:39:00 +0000710 } else if (!T->isDependentType() && !T->isVariablyModifiedType() &&
711 !T->isIncompleteType()) {
712 // Is the array too large?
713 unsigned ActiveSizeBits
714 = ConstantArrayType::getNumAddressingBits(Context, T, ConstVal);
715 if (ActiveSizeBits > ConstantArrayType::getMaxSizeBits(Context))
716 Diag(ArraySize->getLocStart(), diag::err_array_too_large)
717 << ConstVal.toString(10)
718 << ArraySize->getSourceRange();
Mike Stump1eb44332009-09-09 15:08:12 +0000719 }
Douglas Gregor2767ce22010-08-18 00:39:00 +0000720
John McCall46a617a2009-10-16 00:14:28 +0000721 T = Context.getConstantArrayType(T, ConstVal, ASM, Quals);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000722 }
David Chisnallaf407762010-01-11 23:08:08 +0000723 // If this is not C99, extwarn about VLA's and C99 array size modifiers.
724 if (!getLangOptions().C99) {
Douglas Gregor0fddb972010-05-22 16:17:30 +0000725 if (T->isVariableArrayType()) {
726 // Prohibit the use of non-POD types in VLAs.
Douglas Gregor204ce172010-05-24 20:42:30 +0000727 if (!T->isDependentType() &&
728 !Context.getBaseElementType(T)->isPODType()) {
Douglas Gregor0fddb972010-05-22 16:17:30 +0000729 Diag(Loc, diag::err_vla_non_pod)
730 << Context.getBaseElementType(T);
731 return QualType();
732 }
Douglas Gregora481ec42010-05-23 19:57:01 +0000733 // Prohibit the use of VLAs during template argument deduction.
734 else if (isSFINAEContext()) {
735 Diag(Loc, diag::err_vla_in_sfinae);
736 return QualType();
737 }
Douglas Gregor0fddb972010-05-22 16:17:30 +0000738 // Just extwarn about VLAs.
739 else
740 Diag(Loc, diag::ext_vla);
741 } else if (ASM != ArrayType::Normal || Quals != 0)
Douglas Gregor043cad22009-09-11 00:18:58 +0000742 Diag(Loc,
743 getLangOptions().CPlusPlus? diag::err_c99_array_usage_cxx
744 : diag::ext_c99_array_usage);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000745 }
746
747 return T;
748}
Douglas Gregor9cdda0c2009-06-17 21:51:59 +0000749
750/// \brief Build an ext-vector type.
751///
752/// Run the required checks for the extended vector type.
Mike Stump1eb44332009-09-09 15:08:12 +0000753QualType Sema::BuildExtVectorType(QualType T, ExprArg ArraySize,
Douglas Gregor9cdda0c2009-06-17 21:51:59 +0000754 SourceLocation AttrLoc) {
755
756 Expr *Arg = (Expr *)ArraySize.get();
757
758 // unlike gcc's vector_size attribute, we do not allow vectors to be defined
759 // in conjunction with complex types (pointers, arrays, functions, etc.).
Mike Stump1eb44332009-09-09 15:08:12 +0000760 if (!T->isDependentType() &&
Douglas Gregor9cdda0c2009-06-17 21:51:59 +0000761 !T->isIntegerType() && !T->isRealFloatingType()) {
762 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) << T;
763 return QualType();
764 }
765
766 if (!Arg->isTypeDependent() && !Arg->isValueDependent()) {
767 llvm::APSInt vecSize(32);
768 if (!Arg->isIntegerConstantExpr(vecSize, Context)) {
769 Diag(AttrLoc, diag::err_attribute_argument_not_int)
770 << "ext_vector_type" << Arg->getSourceRange();
771 return QualType();
772 }
Mike Stump1eb44332009-09-09 15:08:12 +0000773
774 // unlike gcc's vector_size attribute, the size is specified as the
Douglas Gregor9cdda0c2009-06-17 21:51:59 +0000775 // number of elements, not the number of bytes.
Mike Stump1eb44332009-09-09 15:08:12 +0000776 unsigned vectorSize = static_cast<unsigned>(vecSize.getZExtValue());
777
Douglas Gregor9cdda0c2009-06-17 21:51:59 +0000778 if (vectorSize == 0) {
779 Diag(AttrLoc, diag::err_attribute_zero_size)
780 << Arg->getSourceRange();
781 return QualType();
782 }
Mike Stump1eb44332009-09-09 15:08:12 +0000783
Douglas Gregor9cdda0c2009-06-17 21:51:59 +0000784 if (!T->isDependentType())
785 return Context.getExtVectorType(T, vectorSize);
Mike Stump1eb44332009-09-09 15:08:12 +0000786 }
787
788 return Context.getDependentSizedExtVectorType(T, ArraySize.takeAs<Expr>(),
Douglas Gregor9cdda0c2009-06-17 21:51:59 +0000789 AttrLoc);
790}
Mike Stump1eb44332009-09-09 15:08:12 +0000791
Douglas Gregor724651c2009-02-28 01:04:19 +0000792/// \brief Build a function type.
793///
794/// This routine checks the function type according to C++ rules and
795/// under the assumption that the result type and parameter types have
796/// just been instantiated from a template. It therefore duplicates
Douglas Gregor2943aed2009-03-03 04:44:36 +0000797/// some of the behavior of GetTypeForDeclarator, but in a much
Douglas Gregor724651c2009-02-28 01:04:19 +0000798/// simpler form that is only suitable for this narrow use case.
799///
800/// \param T The return type of the function.
801///
802/// \param ParamTypes The parameter types of the function. This array
803/// will be modified to account for adjustments to the types of the
804/// function parameters.
805///
806/// \param NumParamTypes The number of parameter types in ParamTypes.
807///
808/// \param Variadic Whether this is a variadic function type.
809///
810/// \param Quals The cvr-qualifiers to be applied to the function type.
811///
812/// \param Loc The location of the entity whose type involves this
813/// function type or, if there is no such entity, the location of the
814/// type that will have function type.
815///
816/// \param Entity The name of the entity that involves the function
817/// type, if known.
818///
819/// \returns A suitable function type, if there are no
820/// errors. Otherwise, returns a NULL type.
821QualType Sema::BuildFunctionType(QualType T,
Mike Stump1eb44332009-09-09 15:08:12 +0000822 QualType *ParamTypes,
Douglas Gregor724651c2009-02-28 01:04:19 +0000823 unsigned NumParamTypes,
824 bool Variadic, unsigned Quals,
Eli Friedmanfa869542010-08-05 02:54:05 +0000825 SourceLocation Loc, DeclarationName Entity,
826 const FunctionType::ExtInfo &Info) {
Douglas Gregor724651c2009-02-28 01:04:19 +0000827 if (T->isArrayType() || T->isFunctionType()) {
Douglas Gregor58408bc2010-01-11 18:46:21 +0000828 Diag(Loc, diag::err_func_returning_array_function)
829 << T->isFunctionType() << T;
Douglas Gregor724651c2009-02-28 01:04:19 +0000830 return QualType();
831 }
Douglas Gregor5291c3c2010-07-13 08:18:22 +0000832
Douglas Gregor724651c2009-02-28 01:04:19 +0000833 bool Invalid = false;
834 for (unsigned Idx = 0; Idx < NumParamTypes; ++Idx) {
Douglas Gregor2dc0e642009-03-23 23:06:20 +0000835 QualType ParamType = adjustParameterType(ParamTypes[Idx]);
836 if (ParamType->isVoidType()) {
Douglas Gregor724651c2009-02-28 01:04:19 +0000837 Diag(Loc, diag::err_param_with_void_type);
838 Invalid = true;
839 }
Douglas Gregorcd281c32009-02-28 00:25:32 +0000840
John McCall54e14c42009-10-22 22:37:11 +0000841 ParamTypes[Idx] = ParamType;
Douglas Gregor724651c2009-02-28 01:04:19 +0000842 }
843
844 if (Invalid)
845 return QualType();
846
Mike Stump1eb44332009-09-09 15:08:12 +0000847 return Context.getFunctionType(T, ParamTypes, NumParamTypes, Variadic,
Eli Friedmanfa869542010-08-05 02:54:05 +0000848 Quals, false, false, 0, 0, Info);
Douglas Gregor724651c2009-02-28 01:04:19 +0000849}
Mike Stump1eb44332009-09-09 15:08:12 +0000850
Douglas Gregor949bf692009-06-09 22:17:39 +0000851/// \brief Build a member pointer type \c T Class::*.
852///
853/// \param T the type to which the member pointer refers.
854/// \param Class the class type into which the member pointer points.
John McCall0953e762009-09-24 19:53:00 +0000855/// \param CVR Qualifiers applied to the member pointer type
Douglas Gregor949bf692009-06-09 22:17:39 +0000856/// \param Loc the location where this type begins
857/// \param Entity the name of the entity that will have this member pointer type
858///
859/// \returns a member pointer type, if successful, or a NULL type if there was
860/// an error.
Mike Stump1eb44332009-09-09 15:08:12 +0000861QualType Sema::BuildMemberPointerType(QualType T, QualType Class,
John McCall28654742010-06-05 06:41:15 +0000862 SourceLocation Loc,
Douglas Gregor949bf692009-06-09 22:17:39 +0000863 DeclarationName Entity) {
864 // Verify that we're not building a pointer to pointer to function with
865 // exception specification.
866 if (CheckDistantExceptionSpec(T)) {
867 Diag(Loc, diag::err_distant_exception_spec);
868
869 // FIXME: If we're doing this as part of template instantiation,
870 // we should return immediately.
871
872 // Build the type anyway, but use the canonical type so that the
873 // exception specifiers are stripped off.
874 T = Context.getCanonicalType(T);
875 }
876
Sebastian Redl73780122010-06-09 21:19:43 +0000877 // C++ 8.3.3p3: A pointer to member shall not point to ... a member
Douglas Gregor949bf692009-06-09 22:17:39 +0000878 // with reference type, or "cv void."
879 if (T->isReferenceType()) {
Anders Carlsson8d4655d2009-06-30 00:06:57 +0000880 Diag(Loc, diag::err_illegal_decl_mempointer_to_reference)
John McCallac406052009-10-30 00:37:20 +0000881 << (Entity? Entity.getAsString() : "type name") << T;
Douglas Gregor949bf692009-06-09 22:17:39 +0000882 return QualType();
883 }
884
885 if (T->isVoidType()) {
886 Diag(Loc, diag::err_illegal_decl_mempointer_to_void)
887 << (Entity? Entity.getAsString() : "type name");
888 return QualType();
889 }
890
Douglas Gregor949bf692009-06-09 22:17:39 +0000891 if (!Class->isDependentType() && !Class->isRecordType()) {
892 Diag(Loc, diag::err_mempointer_in_nonclass_type) << Class;
893 return QualType();
894 }
895
Charles Davisd18f9f92010-08-16 04:01:50 +0000896 // In the Microsoft ABI, the class is allowed to be an incomplete
897 // type. In such cases, the compiler makes a worst-case assumption.
898 // We make no such assumption right now, so emit an error if the
899 // class isn't a complete type.
900 if (Context.Target.getCXXABI() == "microsoft" &&
901 RequireCompleteType(Loc, Class, diag::err_incomplete_type))
902 return QualType();
903
John McCall28654742010-06-05 06:41:15 +0000904 return Context.getMemberPointerType(T, Class.getTypePtr());
Douglas Gregor949bf692009-06-09 22:17:39 +0000905}
Mike Stump1eb44332009-09-09 15:08:12 +0000906
Anders Carlsson9a917e42009-06-12 22:56:54 +0000907/// \brief Build a block pointer type.
908///
909/// \param T The type to which we'll be building a block pointer.
910///
John McCall0953e762009-09-24 19:53:00 +0000911/// \param CVR The cvr-qualifiers to be applied to the block pointer type.
Anders Carlsson9a917e42009-06-12 22:56:54 +0000912///
913/// \param Loc The location of the entity whose type involves this
914/// block pointer type or, if there is no such entity, the location of the
915/// type that will have block pointer type.
916///
917/// \param Entity The name of the entity that involves the block pointer
918/// type, if known.
919///
920/// \returns A suitable block pointer type, if there are no
921/// errors. Otherwise, returns a NULL type.
John McCall28654742010-06-05 06:41:15 +0000922QualType Sema::BuildBlockPointerType(QualType T,
Mike Stump1eb44332009-09-09 15:08:12 +0000923 SourceLocation Loc,
Anders Carlsson9a917e42009-06-12 22:56:54 +0000924 DeclarationName Entity) {
John McCall0953e762009-09-24 19:53:00 +0000925 if (!T->isFunctionType()) {
Anders Carlsson9a917e42009-06-12 22:56:54 +0000926 Diag(Loc, diag::err_nonfunction_block_type);
927 return QualType();
928 }
Mike Stump1eb44332009-09-09 15:08:12 +0000929
John McCall28654742010-06-05 06:41:15 +0000930 return Context.getBlockPointerType(T);
Anders Carlsson9a917e42009-06-12 22:56:54 +0000931}
932
John McCalla93c9342009-12-07 02:54:59 +0000933QualType Sema::GetTypeFromParser(TypeTy *Ty, TypeSourceInfo **TInfo) {
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +0000934 QualType QT = QualType::getFromOpaquePtr(Ty);
Douglas Gregor3f9a0562009-11-03 01:35:08 +0000935 if (QT.isNull()) {
John McCalla93c9342009-12-07 02:54:59 +0000936 if (TInfo) *TInfo = 0;
Douglas Gregor3f9a0562009-11-03 01:35:08 +0000937 return QualType();
938 }
939
John McCalla93c9342009-12-07 02:54:59 +0000940 TypeSourceInfo *DI = 0;
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +0000941 if (LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) {
942 QT = LIT->getType();
John McCalla93c9342009-12-07 02:54:59 +0000943 DI = LIT->getTypeSourceInfo();
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +0000944 }
Mike Stump1eb44332009-09-09 15:08:12 +0000945
John McCalla93c9342009-12-07 02:54:59 +0000946 if (TInfo) *TInfo = DI;
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +0000947 return QT;
948}
949
Mike Stump98eb8a72009-02-04 22:31:32 +0000950/// GetTypeForDeclarator - Convert the type for the specified
Sebastian Redl8ce35b02009-10-25 21:45:37 +0000951/// declarator to Type instances.
Douglas Gregor402abb52009-05-28 23:31:59 +0000952///
953/// If OwnedDecl is non-NULL, and this declarator's decl-specifier-seq
954/// owns the declaration of a type (e.g., the definition of a struct
955/// type), then *OwnedDecl will receive the owned declaration.
John McCallbf1a0282010-06-04 23:28:52 +0000956///
957/// The result of this call will never be null, but the associated
958/// type may be a null type if there's an unrecoverable error.
959TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
960 TagDecl **OwnedDecl) {
Douglas Gregor930d8b52009-01-30 22:09:00 +0000961 // Determine the type of the declarator. Not all forms of declarator
962 // have a type.
963 QualType T;
Douglas Gregor05baacb2010-04-12 23:19:01 +0000964 TypeSourceInfo *ReturnTypeInfo = 0;
965
John McCall04a67a62010-02-05 21:31:56 +0000966 llvm::SmallVector<DelayedAttribute,4> FnAttrsFromDeclSpec;
967
Douglas Gregor3f9a0562009-11-03 01:35:08 +0000968 switch (D.getName().getKind()) {
969 case UnqualifiedId::IK_Identifier:
970 case UnqualifiedId::IK_OperatorFunctionId:
Sean Hunt0486d742009-11-28 04:44:28 +0000971 case UnqualifiedId::IK_LiteralOperatorId:
Douglas Gregor3f9a0562009-11-03 01:35:08 +0000972 case UnqualifiedId::IK_TemplateId:
John McCall04a67a62010-02-05 21:31:56 +0000973 T = ConvertDeclSpecToType(*this, D, FnAttrsFromDeclSpec);
Chris Lattner5db2bb12009-10-25 18:21:37 +0000974
Douglas Gregor591bd3c2010-02-08 22:07:33 +0000975 if (!D.isInvalidType() && D.getDeclSpec().isTypeSpecOwned()) {
976 TagDecl* Owned = cast<TagDecl>((Decl *)D.getDeclSpec().getTypeRep());
Douglas Gregorb37b6482010-02-12 17:40:34 +0000977 // Owned is embedded if it was defined here, or if it is the
978 // very first (i.e., canonical) declaration of this tag type.
979 Owned->setEmbeddedInDeclarator(Owned->isDefinition() ||
980 Owned->isCanonicalDecl());
Douglas Gregor591bd3c2010-02-08 22:07:33 +0000981 if (OwnedDecl) *OwnedDecl = Owned;
982 }
Douglas Gregor930d8b52009-01-30 22:09:00 +0000983 break;
984
Douglas Gregor3f9a0562009-11-03 01:35:08 +0000985 case UnqualifiedId::IK_ConstructorName:
Douglas Gregor0efc2c12010-01-13 17:31:36 +0000986 case UnqualifiedId::IK_ConstructorTemplateId:
Douglas Gregor3f9a0562009-11-03 01:35:08 +0000987 case UnqualifiedId::IK_DestructorName:
Douglas Gregor930d8b52009-01-30 22:09:00 +0000988 // Constructors and destructors don't have return types. Use
Douglas Gregor48026d22010-01-11 18:40:55 +0000989 // "void" instead.
Douglas Gregor930d8b52009-01-30 22:09:00 +0000990 T = Context.VoidTy;
991 break;
Douglas Gregor48026d22010-01-11 18:40:55 +0000992
993 case UnqualifiedId::IK_ConversionFunctionId:
994 // The result type of a conversion function is the type that it
995 // converts to.
Douglas Gregor05baacb2010-04-12 23:19:01 +0000996 T = GetTypeFromParser(D.getName().ConversionFunctionId,
John McCallbf1a0282010-06-04 23:28:52 +0000997 &ReturnTypeInfo);
Douglas Gregor48026d22010-01-11 18:40:55 +0000998 break;
Douglas Gregor930d8b52009-01-30 22:09:00 +0000999 }
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00001000
Douglas Gregor1f5f3a42009-12-03 17:10:37 +00001001 if (T.isNull())
John McCallbf1a0282010-06-04 23:28:52 +00001002 return Context.getNullTypeSourceInfo();
Douglas Gregor1f5f3a42009-12-03 17:10:37 +00001003
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001004 if (T == Context.UndeducedAutoTy) {
1005 int Error = -1;
Mike Stump1eb44332009-09-09 15:08:12 +00001006
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001007 switch (D.getContext()) {
1008 case Declarator::KNRTypeListContext:
1009 assert(0 && "K&R type lists aren't allowed in C++");
1010 break;
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001011 case Declarator::PrototypeContext:
1012 Error = 0; // Function prototype
1013 break;
1014 case Declarator::MemberContext:
1015 switch (cast<TagDecl>(CurContext)->getTagKind()) {
Abramo Bagnara465d41b2010-05-11 21:36:43 +00001016 case TTK_Enum: assert(0 && "unhandled tag kind"); break;
1017 case TTK_Struct: Error = 1; /* Struct member */ break;
1018 case TTK_Union: Error = 2; /* Union member */ break;
1019 case TTK_Class: Error = 3; /* Class member */ break;
Mike Stump1eb44332009-09-09 15:08:12 +00001020 }
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001021 break;
1022 case Declarator::CXXCatchContext:
1023 Error = 4; // Exception declaration
1024 break;
1025 case Declarator::TemplateParamContext:
1026 Error = 5; // Template parameter
1027 break;
1028 case Declarator::BlockLiteralContext:
1029 Error = 6; // Block literal
1030 break;
1031 case Declarator::FileContext:
1032 case Declarator::BlockContext:
1033 case Declarator::ForContext:
1034 case Declarator::ConditionContext:
1035 case Declarator::TypeNameContext:
1036 break;
1037 }
1038
1039 if (Error != -1) {
1040 Diag(D.getDeclSpec().getTypeSpecTypeLoc(), diag::err_auto_not_allowed)
1041 << Error;
1042 T = Context.IntTy;
1043 D.setInvalidType(true);
1044 }
1045 }
Mike Stump1eb44332009-09-09 15:08:12 +00001046
Douglas Gregorcd281c32009-02-28 00:25:32 +00001047 // The name we're declaring, if any.
1048 DeclarationName Name;
1049 if (D.getIdentifier())
1050 Name = D.getIdentifier();
Mike Stump1eb44332009-09-09 15:08:12 +00001051
John McCall04a67a62010-02-05 21:31:56 +00001052 llvm::SmallVector<DelayedAttribute,4> FnAttrsFromPreviousChunk;
1053
Mike Stump98eb8a72009-02-04 22:31:32 +00001054 // Walk the DeclTypeInfo, building the recursive type as we go.
1055 // DeclTypeInfos are ordered from the identifier out, which is
1056 // opposite of what we want :).
Sebastian Redl8ce35b02009-10-25 21:45:37 +00001057 for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
1058 DeclaratorChunk &DeclType = D.getTypeObject(e-i-1);
Reid Spencer5f016e22007-07-11 17:01:13 +00001059 switch (DeclType.Kind) {
1060 default: assert(0 && "Unknown decltype!");
Steve Naroff5618bd42008-08-27 16:04:49 +00001061 case DeclaratorChunk::BlockPointer:
Chris Lattner9af55002009-03-27 04:18:06 +00001062 // If blocks are disabled, emit an error.
1063 if (!LangOpts.Blocks)
1064 Diag(DeclType.Loc, diag::err_blocks_disable);
Mike Stump1eb44332009-09-09 15:08:12 +00001065
John McCall28654742010-06-05 06:41:15 +00001066 T = BuildBlockPointerType(T, D.getIdentifierLoc(), Name);
1067 if (DeclType.Cls.TypeQuals)
1068 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Cls.TypeQuals);
Steve Naroff5618bd42008-08-27 16:04:49 +00001069 break;
Reid Spencer5f016e22007-07-11 17:01:13 +00001070 case DeclaratorChunk::Pointer:
Sebastian Redl6a7330c2009-05-29 15:01:05 +00001071 // Verify that we're not building a pointer to pointer to function with
1072 // exception specification.
1073 if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
1074 Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
1075 D.setInvalidType(true);
1076 // Build the type anyway.
1077 }
John McCallc12c5bb2010-05-15 11:32:37 +00001078 if (getLangOptions().ObjC1 && T->getAs<ObjCObjectType>()) {
1079 T = Context.getObjCObjectPointerType(T);
John McCall28654742010-06-05 06:41:15 +00001080 if (DeclType.Ptr.TypeQuals)
1081 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
Steve Naroff14108da2009-07-10 23:34:53 +00001082 break;
1083 }
John McCall28654742010-06-05 06:41:15 +00001084 T = BuildPointerType(T, DeclType.Loc, Name);
1085 if (DeclType.Ptr.TypeQuals)
1086 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
Reid Spencer5f016e22007-07-11 17:01:13 +00001087 break;
John McCall0953e762009-09-24 19:53:00 +00001088 case DeclaratorChunk::Reference: {
Sebastian Redl6a7330c2009-05-29 15:01:05 +00001089 // Verify that we're not building a reference to pointer to function with
1090 // exception specification.
1091 if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
1092 Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
1093 D.setInvalidType(true);
1094 // Build the type anyway.
1095 }
John McCall28654742010-06-05 06:41:15 +00001096 T = BuildReferenceType(T, DeclType.Ref.LValueRef, DeclType.Loc, Name);
1097
1098 Qualifiers Quals;
1099 if (DeclType.Ref.HasRestrict)
1100 T = BuildQualifiedType(T, DeclType.Loc, Qualifiers::Restrict);
Reid Spencer5f016e22007-07-11 17:01:13 +00001101 break;
John McCall0953e762009-09-24 19:53:00 +00001102 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001103 case DeclaratorChunk::Array: {
Sebastian Redl6a7330c2009-05-29 15:01:05 +00001104 // Verify that we're not building an array of pointers to function with
1105 // exception specification.
1106 if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
1107 Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
1108 D.setInvalidType(true);
1109 // Build the type anyway.
1110 }
Chris Lattnerfd89bc82008-04-02 01:05:10 +00001111 DeclaratorChunk::ArrayTypeInfo &ATI = DeclType.Arr;
Chris Lattner94f81fd2007-08-28 16:54:00 +00001112 Expr *ArraySize = static_cast<Expr*>(ATI.NumElts);
Reid Spencer5f016e22007-07-11 17:01:13 +00001113 ArrayType::ArraySizeModifier ASM;
1114 if (ATI.isStar)
1115 ASM = ArrayType::Star;
1116 else if (ATI.hasStatic)
1117 ASM = ArrayType::Static;
1118 else
1119 ASM = ArrayType::Normal;
Eli Friedmanf91f5c82009-04-26 21:57:51 +00001120 if (ASM == ArrayType::Star &&
1121 D.getContext() != Declarator::PrototypeContext) {
1122 // FIXME: This check isn't quite right: it allows star in prototypes
1123 // for function definitions, and disallows some edge cases detailed
1124 // in http://gcc.gnu.org/ml/gcc-patches/2009-02/msg00133.html
1125 Diag(DeclType.Loc, diag::err_array_star_outside_prototype);
1126 ASM = ArrayType::Normal;
1127 D.setInvalidType(true);
1128 }
John McCall0953e762009-09-24 19:53:00 +00001129 T = BuildArrayType(T, ASM, ArraySize,
1130 Qualifiers::fromCVRMask(ATI.TypeQuals),
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001131 SourceRange(DeclType.Loc, DeclType.EndLoc), Name);
Reid Spencer5f016e22007-07-11 17:01:13 +00001132 break;
1133 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001134 case DeclaratorChunk::Function: {
Reid Spencer5f016e22007-07-11 17:01:13 +00001135 // If the function declarator has a prototype (i.e. it is not () and
1136 // does not have a K&R-style identifier list), then the arguments are part
1137 // of the type, otherwise the argument list is ().
1138 const DeclaratorChunk::FunctionTypeInfo &FTI = DeclType.Fun;
Sebastian Redl3cc97262009-05-31 11:47:27 +00001139
Chris Lattnercd881292007-12-19 05:31:29 +00001140 // C99 6.7.5.3p1: The return type may not be a function or array type.
Douglas Gregor58408bc2010-01-11 18:46:21 +00001141 // For conversion functions, we'll diagnose this particular error later.
Douglas Gregor48026d22010-01-11 18:40:55 +00001142 if ((T->isArrayType() || T->isFunctionType()) &&
1143 (D.getName().getKind() != UnqualifiedId::IK_ConversionFunctionId)) {
Douglas Gregor58408bc2010-01-11 18:46:21 +00001144 Diag(DeclType.Loc, diag::err_func_returning_array_function)
1145 << T->isFunctionType() << T;
Chris Lattnercd881292007-12-19 05:31:29 +00001146 T = Context.IntTy;
1147 D.setInvalidType(true);
1148 }
Sebastian Redl465226e2009-05-27 22:11:52 +00001149
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001150 // cv-qualifiers on return types are pointless except when the type is a
1151 // class type in C++.
1152 if (T.getCVRQualifiers() && D.getDeclSpec().getTypeQualifiers() &&
1153 (!getLangOptions().CPlusPlus ||
1154 (!T->isDependentType() && !T->isRecordType()))) {
1155 unsigned Quals = D.getDeclSpec().getTypeQualifiers();
Douglas Gregorde80ec12010-07-13 08:50:30 +00001156 std::string QualStr;
1157 unsigned NumQuals = 0;
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001158 SourceLocation Loc;
Douglas Gregorde80ec12010-07-13 08:50:30 +00001159 if (Quals & Qualifiers::Const) {
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001160 Loc = D.getDeclSpec().getConstSpecLoc();
Douglas Gregorde80ec12010-07-13 08:50:30 +00001161 ++NumQuals;
1162 QualStr = "const";
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001163 }
Douglas Gregorde80ec12010-07-13 08:50:30 +00001164 if (Quals & Qualifiers::Volatile) {
1165 if (NumQuals == 0) {
1166 Loc = D.getDeclSpec().getVolatileSpecLoc();
1167 QualStr = "volatile";
1168 } else
1169 QualStr += " volatile";
1170 ++NumQuals;
1171 }
1172 if (Quals & Qualifiers::Restrict) {
1173 if (NumQuals == 0) {
1174 Loc = D.getDeclSpec().getRestrictSpecLoc();
1175 QualStr = "restrict";
1176 } else
1177 QualStr += " restrict";
1178 ++NumQuals;
1179 }
1180 assert(NumQuals > 0 && "No known qualifiers?");
1181
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001182 SemaDiagnosticBuilder DB = Diag(Loc, diag::warn_qual_return_type);
Douglas Gregorde80ec12010-07-13 08:50:30 +00001183 DB << QualStr << NumQuals;
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001184 if (Quals & Qualifiers::Const)
1185 DB << FixItHint::CreateRemoval(D.getDeclSpec().getConstSpecLoc());
1186 if (Quals & Qualifiers::Volatile)
1187 DB << FixItHint::CreateRemoval(D.getDeclSpec().getVolatileSpecLoc());
1188 if (Quals & Qualifiers::Restrict)
1189 DB << FixItHint::CreateRemoval(D.getDeclSpec().getRestrictSpecLoc());
1190 }
1191
Douglas Gregor402abb52009-05-28 23:31:59 +00001192 if (getLangOptions().CPlusPlus && D.getDeclSpec().isTypeSpecOwned()) {
1193 // C++ [dcl.fct]p6:
1194 // Types shall not be defined in return or parameter types.
1195 TagDecl *Tag = cast<TagDecl>((Decl *)D.getDeclSpec().getTypeRep());
1196 if (Tag->isDefinition())
1197 Diag(Tag->getLocation(), diag::err_type_defined_in_result_type)
1198 << Context.getTypeDeclType(Tag);
1199 }
1200
Sebastian Redl3cc97262009-05-31 11:47:27 +00001201 // Exception specs are not allowed in typedefs. Complain, but add it
1202 // anyway.
1203 if (FTI.hasExceptionSpec &&
1204 D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef)
1205 Diag(FTI.getThrowLoc(), diag::err_exception_spec_in_typedef);
1206
John McCall28654742010-06-05 06:41:15 +00001207 if (!FTI.NumArgs && !FTI.isVariadic && !getLangOptions().CPlusPlus) {
1208 // Simple void foo(), where the incoming T is the result type.
1209 T = Context.getFunctionNoProtoType(T);
1210 } else {
1211 // We allow a zero-parameter variadic function in C if the
1212 // function is marked with the "overloadable" attribute. Scan
1213 // for this attribute now.
1214 if (!FTI.NumArgs && FTI.isVariadic && !getLangOptions().CPlusPlus) {
Douglas Gregor965acbb2009-02-18 07:07:28 +00001215 bool Overloadable = false;
1216 for (const AttributeList *Attrs = D.getAttributes();
1217 Attrs; Attrs = Attrs->getNext()) {
1218 if (Attrs->getKind() == AttributeList::AT_overloadable) {
1219 Overloadable = true;
1220 break;
1221 }
1222 }
1223
1224 if (!Overloadable)
1225 Diag(FTI.getEllipsisLoc(), diag::err_ellipsis_first_arg);
Argyrios Kyrtzidisc6f73452008-10-16 17:31:08 +00001226 }
John McCall28654742010-06-05 06:41:15 +00001227
1228 if (FTI.NumArgs && FTI.ArgInfo[0].Param == 0) {
Chris Lattner788b0fd2010-06-23 06:00:24 +00001229 // C99 6.7.5.3p3: Reject int(x,y,z) when it's not a function
1230 // definition.
John McCall28654742010-06-05 06:41:15 +00001231 Diag(FTI.ArgInfo[0].IdentLoc, diag::err_ident_list_in_fn_declaration);
1232 D.setInvalidType(true);
1233 break;
1234 }
1235
Reid Spencer5f016e22007-07-11 17:01:13 +00001236 // Otherwise, we have a function with an argument list that is
1237 // potentially variadic.
1238 llvm::SmallVector<QualType, 16> ArgTys;
John McCall28654742010-06-05 06:41:15 +00001239 ArgTys.reserve(FTI.NumArgs);
Mike Stump1eb44332009-09-09 15:08:12 +00001240
Reid Spencer5f016e22007-07-11 17:01:13 +00001241 for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) {
Chris Lattnerb28317a2009-03-28 19:18:32 +00001242 ParmVarDecl *Param =
1243 cast<ParmVarDecl>(FTI.ArgInfo[i].Param.getAs<Decl>());
Chris Lattner8123a952008-04-10 02:22:51 +00001244 QualType ArgTy = Param->getType();
Chris Lattner78c75fb2007-07-21 05:30:18 +00001245 assert(!ArgTy.isNull() && "Couldn't parse type?");
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001246
1247 // Adjust the parameter type.
Douglas Gregorbeb58cb2009-03-23 23:17:00 +00001248 assert((ArgTy == adjustParameterType(ArgTy)) && "Unadjusted type?");
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001249
Reid Spencer5f016e22007-07-11 17:01:13 +00001250 // Look for 'void'. void is allowed only as a single argument to a
1251 // function with no other parameters (C99 6.7.5.3p10). We record
Douglas Gregor72564e72009-02-26 23:50:07 +00001252 // int(void) as a FunctionProtoType with an empty argument list.
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001253 if (ArgTy->isVoidType()) {
Reid Spencer5f016e22007-07-11 17:01:13 +00001254 // If this is something like 'float(int, void)', reject it. 'void'
1255 // is an incomplete type (C99 6.2.5p19) and function decls cannot
1256 // have arguments of incomplete type.
1257 if (FTI.NumArgs != 1 || FTI.isVariadic) {
1258 Diag(DeclType.Loc, diag::err_void_only_param);
Chris Lattner2ff54262007-07-21 05:18:12 +00001259 ArgTy = Context.IntTy;
Chris Lattner8123a952008-04-10 02:22:51 +00001260 Param->setType(ArgTy);
Chris Lattner2ff54262007-07-21 05:18:12 +00001261 } else if (FTI.ArgInfo[i].Ident) {
1262 // Reject, but continue to parse 'int(void abc)'.
Reid Spencer5f016e22007-07-11 17:01:13 +00001263 Diag(FTI.ArgInfo[i].IdentLoc,
Chris Lattner4565d4e2007-07-21 05:26:43 +00001264 diag::err_param_with_void_type);
Chris Lattner2ff54262007-07-21 05:18:12 +00001265 ArgTy = Context.IntTy;
Chris Lattner8123a952008-04-10 02:22:51 +00001266 Param->setType(ArgTy);
Chris Lattner2ff54262007-07-21 05:18:12 +00001267 } else {
1268 // Reject, but continue to parse 'float(const void)'.
John McCall0953e762009-09-24 19:53:00 +00001269 if (ArgTy.hasQualifiers())
Chris Lattner2ff54262007-07-21 05:18:12 +00001270 Diag(DeclType.Loc, diag::err_void_param_qualified);
Mike Stump1eb44332009-09-09 15:08:12 +00001271
Chris Lattner2ff54262007-07-21 05:18:12 +00001272 // Do not add 'void' to the ArgTys list.
1273 break;
1274 }
Eli Friedmaneb4b7052008-08-25 21:31:01 +00001275 } else if (!FTI.hasPrototype) {
1276 if (ArgTy->isPromotableIntegerType()) {
Eli Friedmana95d7572009-08-19 07:44:53 +00001277 ArgTy = Context.getPromotedIntegerType(ArgTy);
John McCall183700f2009-09-21 23:43:11 +00001278 } else if (const BuiltinType* BTy = ArgTy->getAs<BuiltinType>()) {
Eli Friedmaneb4b7052008-08-25 21:31:01 +00001279 if (BTy->getKind() == BuiltinType::Float)
1280 ArgTy = Context.DoubleTy;
1281 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001282 }
Mike Stump1eb44332009-09-09 15:08:12 +00001283
John McCall54e14c42009-10-22 22:37:11 +00001284 ArgTys.push_back(ArgTy);
Reid Spencer5f016e22007-07-11 17:01:13 +00001285 }
Sebastian Redl465226e2009-05-27 22:11:52 +00001286
1287 llvm::SmallVector<QualType, 4> Exceptions;
1288 Exceptions.reserve(FTI.NumExceptions);
Mike Stump1eb44332009-09-09 15:08:12 +00001289 for (unsigned ei = 0, ee = FTI.NumExceptions; ei != ee; ++ei) {
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +00001290 // FIXME: Preserve type source info.
1291 QualType ET = GetTypeFromParser(FTI.Exceptions[ei].Ty);
Sebastian Redlef65f062009-05-29 18:02:33 +00001292 // Check that the type is valid for an exception spec, and drop it if
1293 // not.
1294 if (!CheckSpecifiedExceptionType(ET, FTI.Exceptions[ei].Range))
1295 Exceptions.push_back(ET);
1296 }
Sebastian Redl465226e2009-05-27 22:11:52 +00001297
Jay Foadbeaaccd2009-05-21 09:52:38 +00001298 T = Context.getFunctionType(T, ArgTys.data(), ArgTys.size(),
Sebastian Redl465226e2009-05-27 22:11:52 +00001299 FTI.isVariadic, FTI.TypeQuals,
1300 FTI.hasExceptionSpec,
1301 FTI.hasAnyExceptionSpec,
Douglas Gregorce056bc2010-02-21 22:15:06 +00001302 Exceptions.size(), Exceptions.data(),
Rafael Espindola264ba482010-03-30 20:24:48 +00001303 FunctionType::ExtInfo());
Reid Spencer5f016e22007-07-11 17:01:13 +00001304 }
John McCall04a67a62010-02-05 21:31:56 +00001305
1306 // For GCC compatibility, we allow attributes that apply only to
1307 // function types to be placed on a function's return type
1308 // instead (as long as that type doesn't happen to be function
1309 // or function-pointer itself).
1310 ProcessDelayedFnAttrs(*this, T, FnAttrsFromPreviousChunk);
1311
Reid Spencer5f016e22007-07-11 17:01:13 +00001312 break;
1313 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001314 case DeclaratorChunk::MemberPointer:
1315 // The scope spec must refer to a class, or be dependent.
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001316 CXXScopeSpec &SS = DeclType.Mem.Scope();
Sebastian Redlf30208a2009-01-24 21:16:55 +00001317 QualType ClsType;
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001318 if (SS.isInvalid()) {
Jeffrey Yasskinedc28772010-04-07 23:29:58 +00001319 // Avoid emitting extra errors if we already errored on the scope.
1320 D.setInvalidType(true);
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001321 } else if (isDependentScopeSpecifier(SS) ||
1322 dyn_cast_or_null<CXXRecordDecl>(computeDeclContext(SS))) {
Mike Stump1eb44332009-09-09 15:08:12 +00001323 NestedNameSpecifier *NNS
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001324 = static_cast<NestedNameSpecifier*>(SS.getScopeRep());
Douglas Gregor87c12c42009-11-04 16:49:01 +00001325 NestedNameSpecifier *NNSPrefix = NNS->getPrefix();
1326 switch (NNS->getKind()) {
1327 case NestedNameSpecifier::Identifier:
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001328 ClsType = Context.getDependentNameType(ETK_None, NNSPrefix,
Douglas Gregor4a2023f2010-03-31 20:19:30 +00001329 NNS->getAsIdentifier());
Douglas Gregor87c12c42009-11-04 16:49:01 +00001330 break;
1331
1332 case NestedNameSpecifier::Namespace:
1333 case NestedNameSpecifier::Global:
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +00001334 llvm_unreachable("Nested-name-specifier must name a type");
Douglas Gregor87c12c42009-11-04 16:49:01 +00001335 break;
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001336
Douglas Gregor87c12c42009-11-04 16:49:01 +00001337 case NestedNameSpecifier::TypeSpec:
1338 case NestedNameSpecifier::TypeSpecWithTemplate:
1339 ClsType = QualType(NNS->getAsType(), 0);
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001340 // Note: if NNS is dependent, then its prefix (if any) is already
1341 // included in ClsType; this does not hold if the NNS is
1342 // nondependent: in this case (if there is indeed a prefix)
1343 // ClsType needs to be wrapped into an elaborated type.
1344 if (NNSPrefix && !NNS->isDependent())
1345 ClsType = Context.getElaboratedType(ETK_None, NNSPrefix, ClsType);
Douglas Gregor87c12c42009-11-04 16:49:01 +00001346 break;
1347 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001348 } else {
Douglas Gregor949bf692009-06-09 22:17:39 +00001349 Diag(DeclType.Mem.Scope().getBeginLoc(),
1350 diag::err_illegal_decl_mempointer_in_nonclass)
1351 << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name")
1352 << DeclType.Mem.Scope().getRange();
Sebastian Redlf30208a2009-01-24 21:16:55 +00001353 D.setInvalidType(true);
Sebastian Redlf30208a2009-01-24 21:16:55 +00001354 }
1355
Douglas Gregor949bf692009-06-09 22:17:39 +00001356 if (!ClsType.isNull())
John McCall28654742010-06-05 06:41:15 +00001357 T = BuildMemberPointerType(T, ClsType, DeclType.Loc, D.getIdentifier());
Douglas Gregor949bf692009-06-09 22:17:39 +00001358 if (T.isNull()) {
1359 T = Context.IntTy;
Sebastian Redlf30208a2009-01-24 21:16:55 +00001360 D.setInvalidType(true);
John McCall28654742010-06-05 06:41:15 +00001361 } else if (DeclType.Mem.TypeQuals) {
1362 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Mem.TypeQuals);
Sebastian Redlf30208a2009-01-24 21:16:55 +00001363 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001364 break;
1365 }
1366
Douglas Gregorcd281c32009-02-28 00:25:32 +00001367 if (T.isNull()) {
1368 D.setInvalidType(true);
1369 T = Context.IntTy;
1370 }
1371
John McCall04a67a62010-02-05 21:31:56 +00001372 DiagnoseDelayedFnAttrs(*this, FnAttrsFromPreviousChunk);
1373
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001374 // See if there are any attributes on this declarator chunk.
1375 if (const AttributeList *AL = DeclType.getAttrs())
Charles Davis328ce342010-02-24 02:27:18 +00001376 ProcessTypeAttributeList(*this, T, false, AL, FnAttrsFromPreviousChunk);
Reid Spencer5f016e22007-07-11 17:01:13 +00001377 }
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001378
1379 if (getLangOptions().CPlusPlus && T->isFunctionType()) {
John McCall183700f2009-09-21 23:43:11 +00001380 const FunctionProtoType *FnTy = T->getAs<FunctionProtoType>();
Chris Lattner778ed742009-10-25 17:36:50 +00001381 assert(FnTy && "Why oh why is there not a FunctionProtoType here?");
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001382
1383 // C++ 8.3.5p4: A cv-qualifier-seq shall only be part of the function type
1384 // for a nonstatic member function, the function type to which a pointer
1385 // to member refers, or the top-level function type of a function typedef
1386 // declaration.
Sebastian Redlc61bb202010-07-09 21:26:08 +00001387 bool FreeFunction = (D.getContext() != Declarator::MemberContext &&
1388 (!D.getCXXScopeSpec().isSet() ||
1389 !computeDeclContext(D.getCXXScopeSpec(), /*FIXME:*/true)->isRecord()));
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001390 if (FnTy->getTypeQuals() != 0 &&
1391 D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
Sebastian Redlc61bb202010-07-09 21:26:08 +00001392 (FreeFunction ||
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001393 D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static)) {
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001394 if (D.isFunctionDeclarator())
1395 Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_function_type);
1396 else
1397 Diag(D.getIdentifierLoc(),
Sebastian Redlc61bb202010-07-09 21:26:08 +00001398 diag::err_invalid_qualified_typedef_function_type_use)
1399 << FreeFunction;
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001400
1401 // Strip the cv-quals from the type.
1402 T = Context.getFunctionType(FnTy->getResultType(), FnTy->arg_type_begin(),
Douglas Gregorce056bc2010-02-21 22:15:06 +00001403 FnTy->getNumArgs(), FnTy->isVariadic(), 0,
Rafael Espindola264ba482010-03-30 20:24:48 +00001404 false, false, 0, 0, FunctionType::ExtInfo());
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001405 }
1406 }
Mike Stump1eb44332009-09-09 15:08:12 +00001407
Sebastian Redl73780122010-06-09 21:19:43 +00001408 // If there's a constexpr specifier, treat it as a top-level const.
1409 if (D.getDeclSpec().isConstexprSpecified()) {
1410 T.addConst();
1411 }
1412
John McCall04a67a62010-02-05 21:31:56 +00001413 // Process any function attributes we might have delayed from the
1414 // declaration-specifiers.
1415 ProcessDelayedFnAttrs(*this, T, FnAttrsFromDeclSpec);
1416
1417 // If there were any type attributes applied to the decl itself, not
1418 // the type, apply them to the result type. But don't do this for
1419 // block-literal expressions, which are parsed wierdly.
1420 if (D.getContext() != Declarator::BlockLiteralContext)
1421 if (const AttributeList *Attrs = D.getAttributes())
Charles Davis328ce342010-02-24 02:27:18 +00001422 ProcessTypeAttributeList(*this, T, false, Attrs,
1423 FnAttrsFromPreviousChunk);
John McCall04a67a62010-02-05 21:31:56 +00001424
1425 DiagnoseDelayedFnAttrs(*this, FnAttrsFromPreviousChunk);
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00001426
John McCallbf1a0282010-06-04 23:28:52 +00001427 if (T.isNull())
1428 return Context.getNullTypeSourceInfo();
1429 else if (D.isInvalidType())
1430 return Context.getTrivialTypeSourceInfo(T);
1431 return GetTypeSourceInfoForDeclarator(D, T, ReturnTypeInfo);
Reid Spencer5f016e22007-07-11 17:01:13 +00001432}
1433
John McCall51bd8032009-10-18 01:05:36 +00001434namespace {
1435 class TypeSpecLocFiller : public TypeLocVisitor<TypeSpecLocFiller> {
1436 const DeclSpec &DS;
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00001437
John McCall51bd8032009-10-18 01:05:36 +00001438 public:
1439 TypeSpecLocFiller(const DeclSpec &DS) : DS(DS) {}
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00001440
John McCall51bd8032009-10-18 01:05:36 +00001441 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
1442 Visit(TL.getUnqualifiedLoc());
1443 }
1444 void VisitTypedefTypeLoc(TypedefTypeLoc TL) {
1445 TL.setNameLoc(DS.getTypeSpecTypeLoc());
1446 }
1447 void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
1448 TL.setNameLoc(DS.getTypeSpecTypeLoc());
John McCallc12c5bb2010-05-15 11:32:37 +00001449 }
1450 void VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
1451 // Handle the base type, which might not have been written explicitly.
1452 if (DS.getTypeSpecType() == DeclSpec::TST_unspecified) {
1453 TL.setHasBaseTypeAsWritten(false);
1454 TL.getBaseLoc().initialize(SourceLocation());
1455 } else {
1456 TL.setHasBaseTypeAsWritten(true);
1457 Visit(TL.getBaseLoc());
1458 }
Argyrios Kyrtzidiseb667592009-09-29 19:45:22 +00001459
John McCallc12c5bb2010-05-15 11:32:37 +00001460 // Protocol qualifiers.
John McCall54e14c42009-10-22 22:37:11 +00001461 if (DS.getProtocolQualifiers()) {
1462 assert(TL.getNumProtocols() > 0);
1463 assert(TL.getNumProtocols() == DS.getNumProtocolQualifiers());
1464 TL.setLAngleLoc(DS.getProtocolLAngleLoc());
1465 TL.setRAngleLoc(DS.getSourceRange().getEnd());
1466 for (unsigned i = 0, e = DS.getNumProtocolQualifiers(); i != e; ++i)
1467 TL.setProtocolLoc(i, DS.getProtocolLocs()[i]);
1468 } else {
1469 assert(TL.getNumProtocols() == 0);
1470 TL.setLAngleLoc(SourceLocation());
1471 TL.setRAngleLoc(SourceLocation());
1472 }
1473 }
1474 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
John McCall54e14c42009-10-22 22:37:11 +00001475 TL.setStarLoc(SourceLocation());
John McCallc12c5bb2010-05-15 11:32:37 +00001476 Visit(TL.getPointeeLoc());
John McCall51bd8032009-10-18 01:05:36 +00001477 }
John McCall833ca992009-10-29 08:12:44 +00001478 void VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
John McCalla93c9342009-12-07 02:54:59 +00001479 TypeSourceInfo *TInfo = 0;
1480 Sema::GetTypeFromParser(DS.getTypeRep(), &TInfo);
John McCall833ca992009-10-29 08:12:44 +00001481
1482 // If we got no declarator info from previous Sema routines,
1483 // just fill with the typespec loc.
John McCalla93c9342009-12-07 02:54:59 +00001484 if (!TInfo) {
John McCall833ca992009-10-29 08:12:44 +00001485 TL.initialize(DS.getTypeSpecTypeLoc());
1486 return;
1487 }
1488
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00001489 TypeLoc OldTL = TInfo->getTypeLoc();
1490 if (TInfo->getType()->getAs<ElaboratedType>()) {
1491 ElaboratedTypeLoc ElabTL = cast<ElaboratedTypeLoc>(OldTL);
1492 TemplateSpecializationTypeLoc NamedTL =
1493 cast<TemplateSpecializationTypeLoc>(ElabTL.getNamedTypeLoc());
1494 TL.copy(NamedTL);
1495 }
1496 else
1497 TL.copy(cast<TemplateSpecializationTypeLoc>(OldTL));
John McCall833ca992009-10-29 08:12:44 +00001498 }
John McCallcfb708c2010-01-13 20:03:27 +00001499 void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
1500 assert(DS.getTypeSpecType() == DeclSpec::TST_typeofExpr);
1501 TL.setTypeofLoc(DS.getTypeSpecTypeLoc());
1502 TL.setParensRange(DS.getTypeofParensRange());
1503 }
1504 void VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
1505 assert(DS.getTypeSpecType() == DeclSpec::TST_typeofType);
1506 TL.setTypeofLoc(DS.getTypeSpecTypeLoc());
1507 TL.setParensRange(DS.getTypeofParensRange());
1508 assert(DS.getTypeRep());
1509 TypeSourceInfo *TInfo = 0;
1510 Sema::GetTypeFromParser(DS.getTypeRep(), &TInfo);
1511 TL.setUnderlyingTInfo(TInfo);
1512 }
Douglas Gregorddf889a2010-01-18 18:04:31 +00001513 void VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
1514 // By default, use the source location of the type specifier.
1515 TL.setBuiltinLoc(DS.getTypeSpecTypeLoc());
1516 if (TL.needsExtraLocalData()) {
1517 // Set info for the written builtin specifiers.
1518 TL.getWrittenBuiltinSpecs() = DS.getWrittenBuiltinSpecs();
1519 // Try to have a meaningful source location.
1520 if (TL.getWrittenSignSpec() != TSS_unspecified)
1521 // Sign spec loc overrides the others (e.g., 'unsigned long').
1522 TL.setBuiltinLoc(DS.getTypeSpecSignLoc());
1523 else if (TL.getWrittenWidthSpec() != TSW_unspecified)
1524 // Width spec loc overrides type spec loc (e.g., 'short int').
1525 TL.setBuiltinLoc(DS.getTypeSpecWidthLoc());
1526 }
1527 }
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00001528 void VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
1529 ElaboratedTypeKeyword Keyword
1530 = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
1531 if (Keyword == ETK_Typename) {
1532 TypeSourceInfo *TInfo = 0;
1533 Sema::GetTypeFromParser(DS.getTypeRep(), &TInfo);
1534 if (TInfo) {
1535 TL.copy(cast<ElaboratedTypeLoc>(TInfo->getTypeLoc()));
1536 return;
1537 }
1538 }
1539 TL.setKeywordLoc(Keyword != ETK_None
1540 ? DS.getTypeSpecTypeLoc()
1541 : SourceLocation());
1542 const CXXScopeSpec& SS = DS.getTypeSpecScope();
1543 TL.setQualifierRange(SS.isEmpty() ? SourceRange(): SS.getRange());
1544 Visit(TL.getNextTypeLoc().getUnqualifiedLoc());
1545 }
1546 void VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
1547 ElaboratedTypeKeyword Keyword
1548 = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
1549 if (Keyword == ETK_Typename) {
1550 TypeSourceInfo *TInfo = 0;
1551 Sema::GetTypeFromParser(DS.getTypeRep(), &TInfo);
1552 if (TInfo) {
1553 TL.copy(cast<DependentNameTypeLoc>(TInfo->getTypeLoc()));
1554 return;
1555 }
1556 }
1557 TL.setKeywordLoc(Keyword != ETK_None
1558 ? DS.getTypeSpecTypeLoc()
1559 : SourceLocation());
1560 const CXXScopeSpec& SS = DS.getTypeSpecScope();
1561 TL.setQualifierRange(SS.isEmpty() ? SourceRange() : SS.getRange());
1562 // FIXME: load appropriate source location.
1563 TL.setNameLoc(DS.getTypeSpecTypeLoc());
1564 }
John McCall33500952010-06-11 00:33:02 +00001565 void VisitDependentTemplateSpecializationTypeLoc(
1566 DependentTemplateSpecializationTypeLoc TL) {
1567 ElaboratedTypeKeyword Keyword
1568 = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
1569 if (Keyword == ETK_Typename) {
1570 TypeSourceInfo *TInfo = 0;
1571 Sema::GetTypeFromParser(DS.getTypeRep(), &TInfo);
1572 if (TInfo) {
1573 TL.copy(cast<DependentTemplateSpecializationTypeLoc>(
1574 TInfo->getTypeLoc()));
1575 return;
1576 }
1577 }
1578 TL.initializeLocal(SourceLocation());
1579 TL.setKeywordLoc(Keyword != ETK_None
1580 ? DS.getTypeSpecTypeLoc()
1581 : SourceLocation());
1582 const CXXScopeSpec& SS = DS.getTypeSpecScope();
1583 TL.setQualifierRange(SS.isEmpty() ? SourceRange() : SS.getRange());
1584 // FIXME: load appropriate source location.
1585 TL.setNameLoc(DS.getTypeSpecTypeLoc());
1586 }
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00001587
John McCall51bd8032009-10-18 01:05:36 +00001588 void VisitTypeLoc(TypeLoc TL) {
1589 // FIXME: add other typespec types and change this to an assert.
1590 TL.initialize(DS.getTypeSpecTypeLoc());
1591 }
1592 };
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00001593
John McCall51bd8032009-10-18 01:05:36 +00001594 class DeclaratorLocFiller : public TypeLocVisitor<DeclaratorLocFiller> {
1595 const DeclaratorChunk &Chunk;
1596
1597 public:
1598 DeclaratorLocFiller(const DeclaratorChunk &Chunk) : Chunk(Chunk) {}
1599
1600 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +00001601 llvm_unreachable("qualified type locs not expected here!");
John McCall51bd8032009-10-18 01:05:36 +00001602 }
1603
1604 void VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
1605 assert(Chunk.Kind == DeclaratorChunk::BlockPointer);
1606 TL.setCaretLoc(Chunk.Loc);
1607 }
1608 void VisitPointerTypeLoc(PointerTypeLoc TL) {
1609 assert(Chunk.Kind == DeclaratorChunk::Pointer);
1610 TL.setStarLoc(Chunk.Loc);
1611 }
1612 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
1613 assert(Chunk.Kind == DeclaratorChunk::Pointer);
1614 TL.setStarLoc(Chunk.Loc);
1615 }
1616 void VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
1617 assert(Chunk.Kind == DeclaratorChunk::MemberPointer);
1618 TL.setStarLoc(Chunk.Loc);
1619 // FIXME: nested name specifier
1620 }
1621 void VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
1622 assert(Chunk.Kind == DeclaratorChunk::Reference);
John McCall54e14c42009-10-22 22:37:11 +00001623 // 'Amp' is misleading: this might have been originally
1624 /// spelled with AmpAmp.
John McCall51bd8032009-10-18 01:05:36 +00001625 TL.setAmpLoc(Chunk.Loc);
1626 }
1627 void VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
1628 assert(Chunk.Kind == DeclaratorChunk::Reference);
1629 assert(!Chunk.Ref.LValueRef);
1630 TL.setAmpAmpLoc(Chunk.Loc);
1631 }
1632 void VisitArrayTypeLoc(ArrayTypeLoc TL) {
1633 assert(Chunk.Kind == DeclaratorChunk::Array);
1634 TL.setLBracketLoc(Chunk.Loc);
1635 TL.setRBracketLoc(Chunk.EndLoc);
1636 TL.setSizeExpr(static_cast<Expr*>(Chunk.Arr.NumElts));
1637 }
1638 void VisitFunctionTypeLoc(FunctionTypeLoc TL) {
1639 assert(Chunk.Kind == DeclaratorChunk::Function);
1640 TL.setLParenLoc(Chunk.Loc);
1641 TL.setRParenLoc(Chunk.EndLoc);
1642
1643 const DeclaratorChunk::FunctionTypeInfo &FTI = Chunk.Fun;
John McCall54e14c42009-10-22 22:37:11 +00001644 for (unsigned i = 0, e = TL.getNumArgs(), tpi = 0; i != e; ++i) {
John McCall51bd8032009-10-18 01:05:36 +00001645 ParmVarDecl *Param = FTI.ArgInfo[i].Param.getAs<ParmVarDecl>();
John McCall54e14c42009-10-22 22:37:11 +00001646 TL.setArg(tpi++, Param);
John McCall51bd8032009-10-18 01:05:36 +00001647 }
1648 // FIXME: exception specs
1649 }
1650
1651 void VisitTypeLoc(TypeLoc TL) {
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +00001652 llvm_unreachable("unsupported TypeLoc kind in declarator!");
John McCall51bd8032009-10-18 01:05:36 +00001653 }
1654 };
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00001655}
1656
John McCalla93c9342009-12-07 02:54:59 +00001657/// \brief Create and instantiate a TypeSourceInfo with type source information.
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00001658///
1659/// \param T QualType referring to the type as written in source code.
Douglas Gregor05baacb2010-04-12 23:19:01 +00001660///
1661/// \param ReturnTypeInfo For declarators whose return type does not show
1662/// up in the normal place in the declaration specifiers (such as a C++
1663/// conversion function), this pointer will refer to a type source information
1664/// for that return type.
John McCalla93c9342009-12-07 02:54:59 +00001665TypeSourceInfo *
Douglas Gregor05baacb2010-04-12 23:19:01 +00001666Sema::GetTypeSourceInfoForDeclarator(Declarator &D, QualType T,
1667 TypeSourceInfo *ReturnTypeInfo) {
John McCalla93c9342009-12-07 02:54:59 +00001668 TypeSourceInfo *TInfo = Context.CreateTypeSourceInfo(T);
1669 UnqualTypeLoc CurrTL = TInfo->getTypeLoc().getUnqualifiedLoc();
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00001670
Sebastian Redl8ce35b02009-10-25 21:45:37 +00001671 for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
John McCall51bd8032009-10-18 01:05:36 +00001672 DeclaratorLocFiller(D.getTypeObject(i)).Visit(CurrTL);
1673 CurrTL = CurrTL.getNextTypeLoc().getUnqualifiedLoc();
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00001674 }
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00001675
John McCall51bd8032009-10-18 01:05:36 +00001676 TypeSpecLocFiller(D.getDeclSpec()).Visit(CurrTL);
Douglas Gregor05baacb2010-04-12 23:19:01 +00001677
1678 // We have source information for the return type that was not in the
1679 // declaration specifiers; copy that information into the current type
1680 // location so that it will be retained. This occurs, for example, with
1681 // a C++ conversion function, where the return type occurs within the
1682 // declarator-id rather than in the declaration specifiers.
1683 if (ReturnTypeInfo && D.getDeclSpec().getTypeSpecType() == TST_unspecified) {
1684 TypeLoc TL = ReturnTypeInfo->getTypeLoc();
1685 assert(TL.getFullDataSize() == CurrTL.getFullDataSize());
1686 memcpy(CurrTL.getOpaqueData(), TL.getOpaqueData(), TL.getFullDataSize());
1687 }
1688
John McCalla93c9342009-12-07 02:54:59 +00001689 return TInfo;
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00001690}
1691
John McCalla93c9342009-12-07 02:54:59 +00001692/// \brief Create a LocInfoType to hold the given QualType and TypeSourceInfo.
1693QualType Sema::CreateLocInfoType(QualType T, TypeSourceInfo *TInfo) {
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00001694 // FIXME: LocInfoTypes are "transient", only needed for passing to/from Parser
1695 // and Sema during declaration parsing. Try deallocating/caching them when
1696 // it's appropriate, instead of allocating them and keeping them around.
1697 LocInfoType *LocT = (LocInfoType*)BumpAlloc.Allocate(sizeof(LocInfoType), 8);
John McCalla93c9342009-12-07 02:54:59 +00001698 new (LocT) LocInfoType(T, TInfo);
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00001699 assert(LocT->getTypeClass() != T->getTypeClass() &&
1700 "LocInfoType's TypeClass conflicts with an existing Type class");
1701 return QualType(LocT, 0);
1702}
1703
1704void LocInfoType::getAsStringInternal(std::string &Str,
1705 const PrintingPolicy &Policy) const {
Argyrios Kyrtzidis35d44e52009-08-19 01:46:06 +00001706 assert(false && "LocInfoType leaked into the type system; an opaque TypeTy*"
1707 " was used directly instead of getting the QualType through"
1708 " GetTypeFromParser");
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00001709}
1710
Sebastian Redlcee63fb2008-12-02 14:43:59 +00001711Sema::TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) {
Reid Spencer5f016e22007-07-11 17:01:13 +00001712 // C99 6.7.6: Type names have no identifier. This is already validated by
1713 // the parser.
1714 assert(D.getIdentifier() == 0 && "Type name should have no identifier!");
Mike Stump1eb44332009-09-09 15:08:12 +00001715
Douglas Gregor402abb52009-05-28 23:31:59 +00001716 TagDecl *OwnedTag = 0;
John McCallbf1a0282010-06-04 23:28:52 +00001717 TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedTag);
1718 QualType T = TInfo->getType();
Chris Lattner5153ee62009-04-25 08:47:54 +00001719 if (D.isInvalidType())
Douglas Gregor809070a2009-02-18 17:45:20 +00001720 return true;
Steve Naroff5912a352007-08-28 20:14:24 +00001721
Douglas Gregor402abb52009-05-28 23:31:59 +00001722 if (getLangOptions().CPlusPlus) {
1723 // Check that there are no default arguments (C++ only).
Douglas Gregor6d6eb572008-05-07 04:49:29 +00001724 CheckExtraCXXDefaultArguments(D);
1725
Douglas Gregor402abb52009-05-28 23:31:59 +00001726 // C++0x [dcl.type]p3:
1727 // A type-specifier-seq shall not define a class or enumeration
1728 // unless it appears in the type-id of an alias-declaration
1729 // (7.1.3).
1730 if (OwnedTag && OwnedTag->isDefinition())
1731 Diag(OwnedTag->getLocation(), diag::err_type_defined_in_type_specifier)
1732 << Context.getTypeDeclType(OwnedTag);
1733 }
1734
John McCallbf1a0282010-06-04 23:28:52 +00001735 T = CreateLocInfoType(T, TInfo);
Reid Spencer5f016e22007-07-11 17:01:13 +00001736 return T.getAsOpaquePtr();
1737}
1738
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001739
1740
1741//===----------------------------------------------------------------------===//
1742// Type Attribute Processing
1743//===----------------------------------------------------------------------===//
1744
1745/// HandleAddressSpaceTypeAttribute - Process an address_space attribute on the
1746/// specified type. The attribute contains 1 argument, the id of the address
1747/// space for the type.
Mike Stump1eb44332009-09-09 15:08:12 +00001748static void HandleAddressSpaceTypeAttribute(QualType &Type,
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001749 const AttributeList &Attr, Sema &S){
John McCall0953e762009-09-24 19:53:00 +00001750
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001751 // If this type is already address space qualified, reject it.
1752 // Clause 6.7.3 - Type qualifiers: "No type shall be qualified by qualifiers
1753 // for two or more different address spaces."
1754 if (Type.getAddressSpace()) {
1755 S.Diag(Attr.getLoc(), diag::err_attribute_address_multiple_qualifiers);
Abramo Bagnarae215f722010-04-30 13:10:51 +00001756 Attr.setInvalid();
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001757 return;
1758 }
Mike Stump1eb44332009-09-09 15:08:12 +00001759
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001760 // Check the attribute arguments.
1761 if (Attr.getNumArgs() != 1) {
Chris Lattnerf3a41af2008-11-20 06:38:18 +00001762 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
Abramo Bagnarae215f722010-04-30 13:10:51 +00001763 Attr.setInvalid();
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001764 return;
1765 }
1766 Expr *ASArgExpr = static_cast<Expr *>(Attr.getArg(0));
1767 llvm::APSInt addrSpace(32);
Douglas Gregorac06a0e2010-05-18 23:01:22 +00001768 if (ASArgExpr->isTypeDependent() || ASArgExpr->isValueDependent() ||
1769 !ASArgExpr->isIntegerConstantExpr(addrSpace, S.Context)) {
Chris Lattnerdcd5ef12008-11-19 05:27:50 +00001770 S.Diag(Attr.getLoc(), diag::err_attribute_address_space_not_int)
1771 << ASArgExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00001772 Attr.setInvalid();
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001773 return;
1774 }
1775
John McCallefadb772009-07-28 06:52:18 +00001776 // Bounds checking.
1777 if (addrSpace.isSigned()) {
1778 if (addrSpace.isNegative()) {
1779 S.Diag(Attr.getLoc(), diag::err_attribute_address_space_negative)
1780 << ASArgExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00001781 Attr.setInvalid();
John McCallefadb772009-07-28 06:52:18 +00001782 return;
1783 }
1784 addrSpace.setIsSigned(false);
1785 }
1786 llvm::APSInt max(addrSpace.getBitWidth());
John McCall0953e762009-09-24 19:53:00 +00001787 max = Qualifiers::MaxAddressSpace;
John McCallefadb772009-07-28 06:52:18 +00001788 if (addrSpace > max) {
1789 S.Diag(Attr.getLoc(), diag::err_attribute_address_space_too_high)
John McCall0953e762009-09-24 19:53:00 +00001790 << Qualifiers::MaxAddressSpace << ASArgExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00001791 Attr.setInvalid();
John McCallefadb772009-07-28 06:52:18 +00001792 return;
1793 }
1794
Mike Stump1eb44332009-09-09 15:08:12 +00001795 unsigned ASIdx = static_cast<unsigned>(addrSpace.getZExtValue());
Fariborz Jahanianf11284a2009-02-17 18:27:45 +00001796 Type = S.Context.getAddrSpaceQualType(Type, ASIdx);
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001797}
1798
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00001799/// HandleObjCGCTypeAttribute - Process an objc's gc attribute on the
1800/// specified type. The attribute contains 1 argument, weak or strong.
Mike Stump1eb44332009-09-09 15:08:12 +00001801static void HandleObjCGCTypeAttribute(QualType &Type,
Chris Lattner3b6b83b2009-02-18 22:58:38 +00001802 const AttributeList &Attr, Sema &S) {
John McCall0953e762009-09-24 19:53:00 +00001803 if (Type.getObjCGCAttr() != Qualifiers::GCNone) {
Fariborz Jahanian5934e752009-02-18 18:52:41 +00001804 S.Diag(Attr.getLoc(), diag::err_attribute_multiple_objc_gc);
Abramo Bagnarae215f722010-04-30 13:10:51 +00001805 Attr.setInvalid();
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00001806 return;
1807 }
Mike Stump1eb44332009-09-09 15:08:12 +00001808
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00001809 // Check the attribute arguments.
Mike Stump1eb44332009-09-09 15:08:12 +00001810 if (!Attr.getParameterName()) {
Fariborz Jahanianba372b82009-02-18 17:52:36 +00001811 S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
1812 << "objc_gc" << 1;
Abramo Bagnarae215f722010-04-30 13:10:51 +00001813 Attr.setInvalid();
Fariborz Jahanianba372b82009-02-18 17:52:36 +00001814 return;
1815 }
John McCall0953e762009-09-24 19:53:00 +00001816 Qualifiers::GC GCAttr;
Fariborz Jahanianba372b82009-02-18 17:52:36 +00001817 if (Attr.getNumArgs() != 0) {
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00001818 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
Abramo Bagnarae215f722010-04-30 13:10:51 +00001819 Attr.setInvalid();
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00001820 return;
1821 }
Mike Stump1eb44332009-09-09 15:08:12 +00001822 if (Attr.getParameterName()->isStr("weak"))
John McCall0953e762009-09-24 19:53:00 +00001823 GCAttr = Qualifiers::Weak;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00001824 else if (Attr.getParameterName()->isStr("strong"))
John McCall0953e762009-09-24 19:53:00 +00001825 GCAttr = Qualifiers::Strong;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00001826 else {
1827 S.Diag(Attr.getLoc(), diag::warn_attribute_type_not_supported)
1828 << "objc_gc" << Attr.getParameterName();
Abramo Bagnarae215f722010-04-30 13:10:51 +00001829 Attr.setInvalid();
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00001830 return;
1831 }
Mike Stump1eb44332009-09-09 15:08:12 +00001832
Chris Lattner3b6b83b2009-02-18 22:58:38 +00001833 Type = S.Context.getObjCGCQualType(Type, GCAttr);
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00001834}
1835
John McCall04a67a62010-02-05 21:31:56 +00001836/// Process an individual function attribute. Returns true if the
1837/// attribute does not make sense to apply to this type.
1838bool ProcessFnAttr(Sema &S, QualType &Type, const AttributeList &Attr) {
1839 if (Attr.getKind() == AttributeList::AT_noreturn) {
1840 // Complain immediately if the arg count is wrong.
1841 if (Attr.getNumArgs() != 0) {
1842 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
Abramo Bagnarae215f722010-04-30 13:10:51 +00001843 Attr.setInvalid();
John McCall04a67a62010-02-05 21:31:56 +00001844 return false;
1845 }
Mike Stump24556362009-07-25 21:26:53 +00001846
John McCall04a67a62010-02-05 21:31:56 +00001847 // Delay if this is not a function or pointer to block.
1848 if (!Type->isFunctionPointerType()
1849 && !Type->isBlockPointerType()
1850 && !Type->isFunctionType())
1851 return true;
Mike Stump24556362009-07-25 21:26:53 +00001852
John McCall04a67a62010-02-05 21:31:56 +00001853 // Otherwise we can process right away.
1854 Type = S.Context.getNoReturnType(Type);
1855 return false;
1856 }
Mike Stump24556362009-07-25 21:26:53 +00001857
Rafael Espindola425ef722010-03-30 22:15:11 +00001858 if (Attr.getKind() == AttributeList::AT_regparm) {
1859 // The warning is emitted elsewhere
1860 if (Attr.getNumArgs() != 1) {
1861 return false;
1862 }
1863
1864 // Delay if this is not a function or pointer to block.
1865 if (!Type->isFunctionPointerType()
1866 && !Type->isBlockPointerType()
1867 && !Type->isFunctionType())
1868 return true;
1869
1870 // Otherwise we can process right away.
1871 Expr *NumParamsExpr = static_cast<Expr *>(Attr.getArg(0));
1872 llvm::APSInt NumParams(32);
1873
1874 // The warning is emitted elsewhere
Douglas Gregorac06a0e2010-05-18 23:01:22 +00001875 if (NumParamsExpr->isTypeDependent() || NumParamsExpr->isValueDependent() ||
1876 !NumParamsExpr->isIntegerConstantExpr(NumParams, S.Context))
Rafael Espindola425ef722010-03-30 22:15:11 +00001877 return false;
1878
1879 Type = S.Context.getRegParmType(Type, NumParams.getZExtValue());
1880 return false;
1881 }
1882
John McCall04a67a62010-02-05 21:31:56 +00001883 // Otherwise, a calling convention.
1884 if (Attr.getNumArgs() != 0) {
1885 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
Abramo Bagnarae215f722010-04-30 13:10:51 +00001886 Attr.setInvalid();
John McCall04a67a62010-02-05 21:31:56 +00001887 return false;
1888 }
John McCallf82b4e82010-02-04 05:44:44 +00001889
John McCall04a67a62010-02-05 21:31:56 +00001890 QualType T = Type;
1891 if (const PointerType *PT = Type->getAs<PointerType>())
1892 T = PT->getPointeeType();
1893 const FunctionType *Fn = T->getAs<FunctionType>();
John McCallf82b4e82010-02-04 05:44:44 +00001894
John McCall04a67a62010-02-05 21:31:56 +00001895 // Delay if the type didn't work out to a function.
1896 if (!Fn) return true;
1897
1898 // TODO: diagnose uses of these conventions on the wrong target.
1899 CallingConv CC;
1900 switch (Attr.getKind()) {
1901 case AttributeList::AT_cdecl: CC = CC_C; break;
1902 case AttributeList::AT_fastcall: CC = CC_X86FastCall; break;
1903 case AttributeList::AT_stdcall: CC = CC_X86StdCall; break;
Douglas Gregorf813a2c2010-05-18 16:57:00 +00001904 case AttributeList::AT_thiscall: CC = CC_X86ThisCall; break;
John McCall04a67a62010-02-05 21:31:56 +00001905 default: llvm_unreachable("unexpected attribute kind"); return false;
1906 }
1907
1908 CallingConv CCOld = Fn->getCallConv();
Charles Davis064f7db2010-02-23 06:13:55 +00001909 if (S.Context.getCanonicalCallConv(CC) ==
Abramo Bagnarae215f722010-04-30 13:10:51 +00001910 S.Context.getCanonicalCallConv(CCOld)) {
1911 Attr.setInvalid();
1912 return false;
1913 }
John McCall04a67a62010-02-05 21:31:56 +00001914
1915 if (CCOld != CC_Default) {
1916 // Should we diagnose reapplications of the same convention?
1917 S.Diag(Attr.getLoc(), diag::err_attributes_are_not_compatible)
1918 << FunctionType::getNameForCallConv(CC)
1919 << FunctionType::getNameForCallConv(CCOld);
Abramo Bagnarae215f722010-04-30 13:10:51 +00001920 Attr.setInvalid();
John McCall04a67a62010-02-05 21:31:56 +00001921 return false;
1922 }
1923
1924 // Diagnose the use of X86 fastcall on varargs or unprototyped functions.
1925 if (CC == CC_X86FastCall) {
1926 if (isa<FunctionNoProtoType>(Fn)) {
1927 S.Diag(Attr.getLoc(), diag::err_cconv_knr)
1928 << FunctionType::getNameForCallConv(CC);
Abramo Bagnarae215f722010-04-30 13:10:51 +00001929 Attr.setInvalid();
John McCall04a67a62010-02-05 21:31:56 +00001930 return false;
1931 }
1932
1933 const FunctionProtoType *FnP = cast<FunctionProtoType>(Fn);
1934 if (FnP->isVariadic()) {
1935 S.Diag(Attr.getLoc(), diag::err_cconv_varargs)
1936 << FunctionType::getNameForCallConv(CC);
Abramo Bagnarae215f722010-04-30 13:10:51 +00001937 Attr.setInvalid();
John McCall04a67a62010-02-05 21:31:56 +00001938 return false;
1939 }
1940 }
1941
1942 Type = S.Context.getCallConvType(Type, CC);
1943 return false;
John McCallf82b4e82010-02-04 05:44:44 +00001944}
1945
John Thompson6e132aa2009-12-04 21:51:28 +00001946/// HandleVectorSizeAttribute - this attribute is only applicable to integral
1947/// and float scalars, although arrays, pointers, and function return values are
1948/// allowed in conjunction with this construct. Aggregates with this attribute
1949/// are invalid, even if they are of the same size as a corresponding scalar.
1950/// The raw attribute should contain precisely 1 argument, the vector size for
1951/// the variable, measured in bytes. If curType and rawAttr are well formed,
1952/// this routine will return a new vector type.
Chris Lattner788b0fd2010-06-23 06:00:24 +00001953static void HandleVectorSizeAttr(QualType& CurType, const AttributeList &Attr,
1954 Sema &S) {
John Thompson6e132aa2009-12-04 21:51:28 +00001955 // Check the attribute arugments.
1956 if (Attr.getNumArgs() != 1) {
1957 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
Abramo Bagnarae215f722010-04-30 13:10:51 +00001958 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00001959 return;
1960 }
1961 Expr *sizeExpr = static_cast<Expr *>(Attr.getArg(0));
1962 llvm::APSInt vecSize(32);
Douglas Gregorac06a0e2010-05-18 23:01:22 +00001963 if (sizeExpr->isTypeDependent() || sizeExpr->isValueDependent() ||
1964 !sizeExpr->isIntegerConstantExpr(vecSize, S.Context)) {
John Thompson6e132aa2009-12-04 21:51:28 +00001965 S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
1966 << "vector_size" << sizeExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00001967 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00001968 return;
1969 }
1970 // the base type must be integer or float, and can't already be a vector.
Douglas Gregorf6094622010-07-23 15:58:24 +00001971 if (!CurType->isIntegerType() && !CurType->isRealFloatingType()) {
John Thompson6e132aa2009-12-04 21:51:28 +00001972 S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
Abramo Bagnarae215f722010-04-30 13:10:51 +00001973 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00001974 return;
1975 }
1976 unsigned typeSize = static_cast<unsigned>(S.Context.getTypeSize(CurType));
1977 // vecSize is specified in bytes - convert to bits.
1978 unsigned vectorSize = static_cast<unsigned>(vecSize.getZExtValue() * 8);
1979
1980 // the vector size needs to be an integral multiple of the type size.
1981 if (vectorSize % typeSize) {
1982 S.Diag(Attr.getLoc(), diag::err_attribute_invalid_size)
1983 << sizeExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00001984 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00001985 return;
1986 }
1987 if (vectorSize == 0) {
1988 S.Diag(Attr.getLoc(), diag::err_attribute_zero_size)
1989 << sizeExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00001990 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00001991 return;
1992 }
1993
1994 // Success! Instantiate the vector type, the number of elements is > 0, and
1995 // not required to be a power of 2, unlike GCC.
Chris Lattner788b0fd2010-06-23 06:00:24 +00001996 CurType = S.Context.getVectorType(CurType, vectorSize/typeSize,
1997 VectorType::NotAltiVec);
John Thompson6e132aa2009-12-04 21:51:28 +00001998}
1999
John McCall04a67a62010-02-05 21:31:56 +00002000void ProcessTypeAttributeList(Sema &S, QualType &Result,
Charles Davis328ce342010-02-24 02:27:18 +00002001 bool IsDeclSpec, const AttributeList *AL,
John McCall04a67a62010-02-05 21:31:56 +00002002 DelayedAttributeSet &FnAttrs) {
Chris Lattner232e8822008-02-21 01:08:11 +00002003 // Scan through and apply attributes to this type where it makes sense. Some
2004 // attributes (such as __address_space__, __vector_size__, etc) apply to the
2005 // type, but others can be present in the type specifiers even though they
Chris Lattnerfca0ddd2008-06-26 06:27:57 +00002006 // apply to the decl. Here we apply type attributes and ignore the rest.
2007 for (; AL; AL = AL->getNext()) {
Abramo Bagnarae215f722010-04-30 13:10:51 +00002008 // Skip attributes that were marked to be invalid.
2009 if (AL->isInvalid())
2010 continue;
2011
Abramo Bagnarab1f1b262010-04-30 09:13:03 +00002012 // If this is an attribute we can handle, do so now,
2013 // otherwise, add it to the FnAttrs list for rechaining.
Chris Lattnerfca0ddd2008-06-26 06:27:57 +00002014 switch (AL->getKind()) {
Chris Lattner232e8822008-02-21 01:08:11 +00002015 default: break;
John McCall04a67a62010-02-05 21:31:56 +00002016
Chris Lattner232e8822008-02-21 01:08:11 +00002017 case AttributeList::AT_address_space:
John McCall04a67a62010-02-05 21:31:56 +00002018 HandleAddressSpaceTypeAttribute(Result, *AL, S);
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002019 break;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002020 case AttributeList::AT_objc_gc:
John McCall04a67a62010-02-05 21:31:56 +00002021 HandleObjCGCTypeAttribute(Result, *AL, S);
Mike Stump24556362009-07-25 21:26:53 +00002022 break;
John Thompson6e132aa2009-12-04 21:51:28 +00002023 case AttributeList::AT_vector_size:
John McCall04a67a62010-02-05 21:31:56 +00002024 HandleVectorSizeAttr(Result, *AL, S);
2025 break;
2026
2027 case AttributeList::AT_noreturn:
2028 case AttributeList::AT_cdecl:
2029 case AttributeList::AT_fastcall:
2030 case AttributeList::AT_stdcall:
Douglas Gregorf813a2c2010-05-18 16:57:00 +00002031 case AttributeList::AT_thiscall:
Rafael Espindola425ef722010-03-30 22:15:11 +00002032 case AttributeList::AT_regparm:
Charles Davis328ce342010-02-24 02:27:18 +00002033 // Don't process these on the DeclSpec.
2034 if (IsDeclSpec ||
2035 ProcessFnAttr(S, Result, *AL))
John McCall04a67a62010-02-05 21:31:56 +00002036 FnAttrs.push_back(DelayedAttribute(AL, Result));
John Thompson6e132aa2009-12-04 21:51:28 +00002037 break;
Chris Lattner232e8822008-02-21 01:08:11 +00002038 }
Chris Lattner232e8822008-02-21 01:08:11 +00002039 }
Chris Lattner232e8822008-02-21 01:08:11 +00002040}
2041
Mike Stump1eb44332009-09-09 15:08:12 +00002042/// @brief Ensure that the type T is a complete type.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002043///
2044/// This routine checks whether the type @p T is complete in any
2045/// context where a complete type is required. If @p T is a complete
Douglas Gregor86447ec2009-03-09 16:13:40 +00002046/// type, returns false. If @p T is a class template specialization,
2047/// this routine then attempts to perform class template
2048/// instantiation. If instantiation fails, or if @p T is incomplete
2049/// and cannot be completed, issues the diagnostic @p diag (giving it
2050/// the type @p T) and returns true.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002051///
2052/// @param Loc The location in the source that the incomplete type
2053/// diagnostic should refer to.
2054///
2055/// @param T The type that this routine is examining for completeness.
2056///
Mike Stump1eb44332009-09-09 15:08:12 +00002057/// @param PD The partial diagnostic that will be printed out if T is not a
Anders Carlssonb7906612009-08-26 23:45:07 +00002058/// complete type.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002059///
2060/// @returns @c true if @p T is incomplete and a diagnostic was emitted,
2061/// @c false otherwise.
Anders Carlsson91a0cc92009-08-26 22:33:56 +00002062bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
Anders Carlsson8c8d9192009-10-09 23:51:55 +00002063 const PartialDiagnostic &PD,
2064 std::pair<SourceLocation,
2065 PartialDiagnostic> Note) {
Anders Carlsson91a0cc92009-08-26 22:33:56 +00002066 unsigned diag = PD.getDiagID();
Mike Stump1eb44332009-09-09 15:08:12 +00002067
Douglas Gregor573d9c32009-10-21 23:19:44 +00002068 // FIXME: Add this assertion to make sure we always get instantiation points.
2069 // assert(!Loc.isInvalid() && "Invalid location in RequireCompleteType");
Douglas Gregor690dc7f2009-05-21 23:48:18 +00002070 // FIXME: Add this assertion to help us flush out problems with
2071 // checking for dependent types and type-dependent expressions.
2072 //
Mike Stump1eb44332009-09-09 15:08:12 +00002073 // assert(!T->isDependentType() &&
Douglas Gregor690dc7f2009-05-21 23:48:18 +00002074 // "Can't ask whether a dependent type is complete");
2075
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002076 // If we have a complete type, we're done.
2077 if (!T->isIncompleteType())
2078 return false;
Eli Friedman3c0eb162008-05-27 03:33:27 +00002079
Douglas Gregord475b8d2009-03-25 21:17:03 +00002080 // If we have a class template specialization or a class member of a
Sebastian Redl923d56d2009-11-05 15:52:31 +00002081 // class template specialization, or an array with known size of such,
2082 // try to instantiate it.
2083 QualType MaybeTemplate = T;
Douglas Gregor89c49f02009-11-09 22:08:55 +00002084 if (const ConstantArrayType *Array = Context.getAsConstantArrayType(T))
Sebastian Redl923d56d2009-11-05 15:52:31 +00002085 MaybeTemplate = Array->getElementType();
2086 if (const RecordType *Record = MaybeTemplate->getAs<RecordType>()) {
Douglas Gregor2943aed2009-03-03 04:44:36 +00002087 if (ClassTemplateSpecializationDecl *ClassTemplateSpec
Douglas Gregord475b8d2009-03-25 21:17:03 +00002088 = dyn_cast<ClassTemplateSpecializationDecl>(Record->getDecl())) {
Douglas Gregor972e6ce2009-10-27 06:26:26 +00002089 if (ClassTemplateSpec->getSpecializationKind() == TSK_Undeclared)
2090 return InstantiateClassTemplateSpecialization(Loc, ClassTemplateSpec,
Douglas Gregord0e3daf2009-09-04 22:48:11 +00002091 TSK_ImplicitInstantiation,
Douglas Gregor5842ba92009-08-24 15:23:48 +00002092 /*Complain=*/diag != 0);
Mike Stump1eb44332009-09-09 15:08:12 +00002093 } else if (CXXRecordDecl *Rec
Douglas Gregord475b8d2009-03-25 21:17:03 +00002094 = dyn_cast<CXXRecordDecl>(Record->getDecl())) {
2095 if (CXXRecordDecl *Pattern = Rec->getInstantiatedFromMemberClass()) {
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00002096 MemberSpecializationInfo *MSInfo = Rec->getMemberSpecializationInfo();
2097 assert(MSInfo && "Missing member specialization information?");
Douglas Gregor357bbd02009-08-28 20:50:45 +00002098 // This record was instantiated from a class within a template.
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00002099 if (MSInfo->getTemplateSpecializationKind()
Douglas Gregor972e6ce2009-10-27 06:26:26 +00002100 != TSK_ExplicitSpecialization)
Douglas Gregorf6b11852009-10-08 15:14:33 +00002101 return InstantiateClass(Loc, Rec, Pattern,
2102 getTemplateInstantiationArgs(Rec),
2103 TSK_ImplicitInstantiation,
2104 /*Complain=*/diag != 0);
Douglas Gregord475b8d2009-03-25 21:17:03 +00002105 }
2106 }
2107 }
Douglas Gregor2943aed2009-03-03 04:44:36 +00002108
Douglas Gregor5842ba92009-08-24 15:23:48 +00002109 if (diag == 0)
2110 return true;
Mike Stump1eb44332009-09-09 15:08:12 +00002111
Rafael Espindola01620702010-03-21 22:56:43 +00002112 const TagType *Tag = 0;
2113 if (const RecordType *Record = T->getAs<RecordType>())
2114 Tag = Record;
2115 else if (const EnumType *Enum = T->getAs<EnumType>())
2116 Tag = Enum;
2117
2118 // Avoid diagnosing invalid decls as incomplete.
2119 if (Tag && Tag->getDecl()->isInvalidDecl())
2120 return true;
2121
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002122 // We have an incomplete type. Produce a diagnostic.
Anders Carlsson91a0cc92009-08-26 22:33:56 +00002123 Diag(Loc, PD) << T;
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002124
Anders Carlsson8c8d9192009-10-09 23:51:55 +00002125 // If we have a note, produce it.
2126 if (!Note.first.isInvalid())
2127 Diag(Note.first, Note.second);
2128
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002129 // If the type was a forward declaration of a class/struct/union
Rafael Espindola01620702010-03-21 22:56:43 +00002130 // type, produce a note.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002131 if (Tag && !Tag->getDecl()->isInvalidDecl())
Mike Stump1eb44332009-09-09 15:08:12 +00002132 Diag(Tag->getDecl()->getLocation(),
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002133 Tag->isBeingDefined() ? diag::note_type_being_defined
2134 : diag::note_forward_declaration)
2135 << QualType(Tag, 0);
2136
2137 return true;
2138}
Douglas Gregore6258932009-03-19 00:39:20 +00002139
Douglas Gregorfe6b2d42010-03-29 23:34:08 +00002140bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
2141 const PartialDiagnostic &PD) {
2142 return RequireCompleteType(Loc, T, PD,
2143 std::make_pair(SourceLocation(), PDiag(0)));
2144}
2145
2146bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
2147 unsigned DiagID) {
2148 return RequireCompleteType(Loc, T, PDiag(DiagID),
2149 std::make_pair(SourceLocation(), PDiag(0)));
2150}
2151
Abramo Bagnara465d41b2010-05-11 21:36:43 +00002152/// \brief Retrieve a version of the type 'T' that is elaborated by Keyword
2153/// and qualified by the nested-name-specifier contained in SS.
2154QualType Sema::getElaboratedType(ElaboratedTypeKeyword Keyword,
2155 const CXXScopeSpec &SS, QualType T) {
2156 if (T.isNull())
Douglas Gregore6258932009-03-19 00:39:20 +00002157 return T;
Abramo Bagnara465d41b2010-05-11 21:36:43 +00002158 NestedNameSpecifier *NNS;
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002159 if (SS.isValid())
Abramo Bagnara465d41b2010-05-11 21:36:43 +00002160 NNS = static_cast<NestedNameSpecifier *>(SS.getScopeRep());
2161 else {
2162 if (Keyword == ETK_None)
2163 return T;
2164 NNS = 0;
2165 }
2166 return Context.getElaboratedType(Keyword, NNS, T);
Douglas Gregore6258932009-03-19 00:39:20 +00002167}
Anders Carlssonaf017e62009-06-29 22:58:55 +00002168
2169QualType Sema::BuildTypeofExprType(Expr *E) {
Douglas Gregor4b52e252009-12-21 23:17:24 +00002170 if (E->getType() == Context.OverloadTy) {
2171 // C++ [temp.arg.explicit]p3 allows us to resolve a template-id to a
2172 // function template specialization wherever deduction cannot occur.
2173 if (FunctionDecl *Specialization
2174 = ResolveSingleFunctionTemplateSpecialization(E)) {
John McCall161755a2010-04-06 21:38:20 +00002175 // The access doesn't really matter in this case.
2176 DeclAccessPair Found = DeclAccessPair::make(Specialization,
2177 Specialization->getAccess());
2178 E = FixOverloadedFunctionReference(E, Found, Specialization);
Douglas Gregor4b52e252009-12-21 23:17:24 +00002179 if (!E)
2180 return QualType();
2181 } else {
2182 Diag(E->getLocStart(),
2183 diag::err_cannot_determine_declared_type_of_overloaded_function)
2184 << false << E->getSourceRange();
2185 return QualType();
2186 }
2187 }
2188
Anders Carlssonaf017e62009-06-29 22:58:55 +00002189 return Context.getTypeOfExprType(E);
2190}
2191
2192QualType Sema::BuildDecltypeType(Expr *E) {
2193 if (E->getType() == Context.OverloadTy) {
Douglas Gregor4b52e252009-12-21 23:17:24 +00002194 // C++ [temp.arg.explicit]p3 allows us to resolve a template-id to a
2195 // function template specialization wherever deduction cannot occur.
2196 if (FunctionDecl *Specialization
2197 = ResolveSingleFunctionTemplateSpecialization(E)) {
John McCall161755a2010-04-06 21:38:20 +00002198 // The access doesn't really matter in this case.
2199 DeclAccessPair Found = DeclAccessPair::make(Specialization,
2200 Specialization->getAccess());
2201 E = FixOverloadedFunctionReference(E, Found, Specialization);
Douglas Gregor4b52e252009-12-21 23:17:24 +00002202 if (!E)
2203 return QualType();
2204 } else {
2205 Diag(E->getLocStart(),
2206 diag::err_cannot_determine_declared_type_of_overloaded_function)
2207 << true << E->getSourceRange();
2208 return QualType();
2209 }
Anders Carlssonaf017e62009-06-29 22:58:55 +00002210 }
Douglas Gregor4b52e252009-12-21 23:17:24 +00002211
Anders Carlssonaf017e62009-06-29 22:58:55 +00002212 return Context.getDecltypeType(E);
2213}