blob: e843ca5fca131a7d0e9192853ef7bf5c0b1ea5d6 [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
John McCall2d887082010-08-25 22:03:47 +000014#include "clang/Sema/SemaInternal.h"
John McCall7cd088e2010-08-24 07:21:54 +000015#include "clang/Sema/Template.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000016#include "clang/AST/ASTContext.h"
Douglas Gregora8f32e02009-10-06 17:59:45 +000017#include "clang/AST/CXXInheritance.h"
Steve Naroff980e5082007-10-01 19:00:59 +000018#include "clang/AST/DeclObjC.h"
Douglas Gregor2943aed2009-03-03 04:44:36 +000019#include "clang/AST/DeclTemplate.h"
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +000020#include "clang/AST/TypeLoc.h"
John McCall51bd8032009-10-18 01:05:36 +000021#include "clang/AST/TypeLocVisitor.h"
Daniel Dunbare91593e2008-08-11 04:54:23 +000022#include "clang/AST/Expr.h"
Anders Carlsson91a0cc92009-08-26 22:33:56 +000023#include "clang/Basic/PartialDiagnostic.h"
Charles Davisd18f9f92010-08-16 04:01:50 +000024#include "clang/Basic/TargetInfo.h"
John McCall19510852010-08-20 18:27:03 +000025#include "clang/Sema/DeclSpec.h"
Sebastian Redl4994d2d2009-07-04 11:39:00 +000026#include "llvm/ADT/SmallPtrSet.h"
Douglas Gregor87c12c42009-11-04 16:49:01 +000027#include "llvm/Support/ErrorHandling.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000028using namespace clang;
29
Douglas Gregor2dc0e642009-03-23 23:06:20 +000030/// \brief Perform adjustment on the parameter type of a function.
31///
32/// This routine adjusts the given parameter type @p T to the actual
Mike Stump1eb44332009-09-09 15:08:12 +000033/// parameter type used by semantic analysis (C99 6.7.5.3p[7,8],
34/// C++ [dcl.fct]p3). The adjusted parameter type is returned.
Douglas Gregor2dc0e642009-03-23 23:06:20 +000035QualType Sema::adjustParameterType(QualType T) {
36 // C99 6.7.5.3p7:
Chris Lattner778ed742009-10-25 17:36:50 +000037 // A declaration of a parameter as "array of type" shall be
38 // adjusted to "qualified pointer to type", where the type
39 // qualifiers (if any) are those specified within the [ and ] of
40 // the array type derivation.
41 if (T->isArrayType())
Douglas Gregor2dc0e642009-03-23 23:06:20 +000042 return Context.getArrayDecayedType(T);
Chris Lattner778ed742009-10-25 17:36:50 +000043
44 // C99 6.7.5.3p8:
45 // A declaration of a parameter as "function returning type"
46 // shall be adjusted to "pointer to function returning type", as
47 // in 6.3.2.1.
48 if (T->isFunctionType())
Douglas Gregor2dc0e642009-03-23 23:06:20 +000049 return Context.getPointerType(T);
50
51 return T;
52}
53
Chris Lattner5db2bb12009-10-25 18:21:37 +000054
55
56/// isOmittedBlockReturnType - Return true if this declarator is missing a
57/// return type because this is a omitted return type on a block literal.
Sebastian Redl8ce35b02009-10-25 21:45:37 +000058static bool isOmittedBlockReturnType(const Declarator &D) {
Chris Lattner5db2bb12009-10-25 18:21:37 +000059 if (D.getContext() != Declarator::BlockLiteralContext ||
Sebastian Redl8ce35b02009-10-25 21:45:37 +000060 D.getDeclSpec().hasTypeSpecifier())
Chris Lattner5db2bb12009-10-25 18:21:37 +000061 return false;
62
63 if (D.getNumTypeObjects() == 0)
Chris Lattnera64ef0a2009-10-25 22:09:09 +000064 return true; // ^{ ... }
Chris Lattner5db2bb12009-10-25 18:21:37 +000065
66 if (D.getNumTypeObjects() == 1 &&
67 D.getTypeObject(0).Kind == DeclaratorChunk::Function)
Chris Lattnera64ef0a2009-10-25 22:09:09 +000068 return true; // ^(int X, float Y) { ... }
Chris Lattner5db2bb12009-10-25 18:21:37 +000069
70 return false;
71}
72
John McCall711c52b2011-01-05 12:14:39 +000073// objc_gc applies to Objective-C pointers or, otherwise, to the
74// smallest available pointer type (i.e. 'void*' in 'void**').
75#define OBJC_POINTER_TYPE_ATTRS_CASELIST \
76 case AttributeList::AT_objc_gc
John McCall04a67a62010-02-05 21:31:56 +000077
John McCall711c52b2011-01-05 12:14:39 +000078// Function type attributes.
79#define FUNCTION_TYPE_ATTRS_CASELIST \
80 case AttributeList::AT_noreturn: \
81 case AttributeList::AT_cdecl: \
82 case AttributeList::AT_fastcall: \
83 case AttributeList::AT_stdcall: \
84 case AttributeList::AT_thiscall: \
85 case AttributeList::AT_pascal: \
86 case AttributeList::AT_regparm
John McCall04a67a62010-02-05 21:31:56 +000087
John McCall711c52b2011-01-05 12:14:39 +000088namespace {
89 /// An object which stores processing state for the entire
90 /// GetTypeForDeclarator process.
91 class TypeProcessingState {
92 Sema &sema;
93
94 /// The declarator being processed.
95 Declarator &declarator;
96
97 /// The index of the declarator chunk we're currently processing.
98 /// May be the total number of valid chunks, indicating the
99 /// DeclSpec.
100 unsigned chunkIndex;
101
102 /// Whether there are non-trivial modifications to the decl spec.
103 bool trivial;
104
105 /// The original set of attributes on the DeclSpec.
106 llvm::SmallVector<AttributeList*, 2> savedAttrs;
107
108 /// A list of attributes to diagnose the uselessness of when the
109 /// processing is complete.
110 llvm::SmallVector<AttributeList*, 2> ignoredTypeAttrs;
111
112 public:
113 TypeProcessingState(Sema &sema, Declarator &declarator)
114 : sema(sema), declarator(declarator),
115 chunkIndex(declarator.getNumTypeObjects()),
116 trivial(true) {}
117
118 Sema &getSema() const {
119 return sema;
Abramo Bagnarae215f722010-04-30 13:10:51 +0000120 }
John McCall711c52b2011-01-05 12:14:39 +0000121
122 Declarator &getDeclarator() const {
123 return declarator;
124 }
125
126 unsigned getCurrentChunkIndex() const {
127 return chunkIndex;
128 }
129
130 void setCurrentChunkIndex(unsigned idx) {
131 assert(idx <= declarator.getNumTypeObjects());
132 chunkIndex = idx;
133 }
134
135 AttributeList *&getCurrentAttrListRef() const {
136 assert(chunkIndex <= declarator.getNumTypeObjects());
137 if (chunkIndex == declarator.getNumTypeObjects())
138 return getMutableDeclSpec().getAttributes().getListRef();
139 return declarator.getTypeObject(chunkIndex).getAttrListRef();
140 }
141
142 /// Save the current set of attributes on the DeclSpec.
143 void saveDeclSpecAttrs() {
144 // Don't try to save them multiple times.
145 if (!savedAttrs.empty()) return;
146
147 DeclSpec &spec = getMutableDeclSpec();
148 for (AttributeList *attr = spec.getAttributes().getList(); attr;
149 attr = attr->getNext())
150 savedAttrs.push_back(attr);
151 trivial &= savedAttrs.empty();
152 }
153
154 /// Record that we had nowhere to put the given type attribute.
155 /// We will diagnose such attributes later.
156 void addIgnoredTypeAttr(AttributeList &attr) {
157 ignoredTypeAttrs.push_back(&attr);
158 }
159
160 /// Diagnose all the ignored type attributes, given that the
161 /// declarator worked out to the given type.
162 void diagnoseIgnoredTypeAttrs(QualType type) const {
163 for (llvm::SmallVectorImpl<AttributeList*>::const_iterator
164 i = ignoredTypeAttrs.begin(), e = ignoredTypeAttrs.end();
165 i != e; ++i) {
166 AttributeList &attr = **i;
167 getSema().Diag(attr.getLoc(), diag::warn_function_attribute_wrong_type)
168 << attr.getName() << type;
169 }
170 }
171
172 ~TypeProcessingState() {
173 if (trivial) return;
174
175 restoreDeclSpecAttrs();
176 }
177
178 private:
179 DeclSpec &getMutableDeclSpec() const {
180 return const_cast<DeclSpec&>(declarator.getDeclSpec());
181 }
182
183 void restoreDeclSpecAttrs() {
184 assert(!savedAttrs.empty());
185 getMutableDeclSpec().getAttributes().set(savedAttrs[0]);
186 for (unsigned i = 0, e = savedAttrs.size() - 1; i != e; ++i)
187 savedAttrs[i]->setNext(savedAttrs[i+1]);
188 savedAttrs.back()->setNext(0);
189 }
190 };
191
192 /// Basically std::pair except that we really want to avoid an
193 /// implicit operator= for safety concerns. It's also a minor
194 /// link-time optimization for this to be a private type.
195 struct AttrAndList {
196 /// The attribute.
197 AttributeList &first;
198
199 /// The head of the list the attribute is currently in.
200 AttributeList *&second;
201
202 AttrAndList(AttributeList &attr, AttributeList *&head)
203 : first(attr), second(head) {}
204 };
John McCall04a67a62010-02-05 21:31:56 +0000205}
206
John McCall711c52b2011-01-05 12:14:39 +0000207namespace llvm {
208 template <> struct isPodLike<AttrAndList> {
209 static const bool value = true;
210 };
211}
212
213static void spliceAttrIntoList(AttributeList &attr, AttributeList *&head) {
214 attr.setNext(head);
215 head = &attr;
216}
217
218static void spliceAttrOutOfList(AttributeList &attr, AttributeList *&head) {
219 if (head == &attr) {
220 head = attr.getNext();
221 return;
John McCall04a67a62010-02-05 21:31:56 +0000222 }
John McCall711c52b2011-01-05 12:14:39 +0000223
224 AttributeList *cur = head;
225 while (true) {
226 assert(cur && cur->getNext() && "ran out of attrs?");
227 if (cur->getNext() == &attr) {
228 cur->setNext(attr.getNext());
229 return;
230 }
231 cur = cur->getNext();
232 }
233}
234
235static void moveAttrFromListToList(AttributeList &attr,
236 AttributeList *&fromList,
237 AttributeList *&toList) {
238 spliceAttrOutOfList(attr, fromList);
239 spliceAttrIntoList(attr, toList);
240}
241
242static void processTypeAttrs(TypeProcessingState &state,
243 QualType &type, bool isDeclSpec,
244 AttributeList *attrs);
245
246static bool handleFunctionTypeAttr(TypeProcessingState &state,
247 AttributeList &attr,
248 QualType &type);
249
250static bool handleObjCGCTypeAttr(TypeProcessingState &state,
251 AttributeList &attr, QualType &type);
252
253static bool handleObjCPointerTypeAttr(TypeProcessingState &state,
254 AttributeList &attr, QualType &type) {
255 // Right now, we have exactly one of these attributes: objc_gc.
256 assert(attr.getKind() == AttributeList::AT_objc_gc);
257 return handleObjCGCTypeAttr(state, attr, type);
258}
259
260/// Given that an objc_gc attribute was written somewhere on a
261/// declaration *other* than on the declarator itself (for which, use
262/// distributeObjCPointerTypeAttrFromDeclarator), and given that it
263/// didn't apply in whatever position it was written in, try to move
264/// it to a more appropriate position.
265static void distributeObjCPointerTypeAttr(TypeProcessingState &state,
266 AttributeList &attr,
267 QualType type) {
268 Declarator &declarator = state.getDeclarator();
269 for (unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
270 DeclaratorChunk &chunk = declarator.getTypeObject(i-1);
271 switch (chunk.Kind) {
272 case DeclaratorChunk::Pointer:
273 case DeclaratorChunk::BlockPointer:
274 moveAttrFromListToList(attr, state.getCurrentAttrListRef(),
275 chunk.getAttrListRef());
276 return;
277
278 case DeclaratorChunk::Paren:
279 case DeclaratorChunk::Array:
280 continue;
281
282 // Don't walk through these.
283 case DeclaratorChunk::Reference:
284 case DeclaratorChunk::Function:
285 case DeclaratorChunk::MemberPointer:
286 goto error;
287 }
288 }
289 error:
290
291 state.getSema().Diag(attr.getLoc(), diag::warn_function_attribute_wrong_type)
292 << attr.getName() << type;
293}
294
295/// Distribute an objc_gc type attribute that was written on the
296/// declarator.
297static void
298distributeObjCPointerTypeAttrFromDeclarator(TypeProcessingState &state,
299 AttributeList &attr,
300 QualType &declSpecType) {
301 Declarator &declarator = state.getDeclarator();
302
303 // objc_gc goes on the innermost pointer to something that's not a
304 // pointer.
305 unsigned innermost = -1U;
306 bool considerDeclSpec = true;
307 for (unsigned i = 0, e = declarator.getNumTypeObjects(); i != e; ++i) {
308 DeclaratorChunk &chunk = declarator.getTypeObject(i);
309 switch (chunk.Kind) {
310 case DeclaratorChunk::Pointer:
311 case DeclaratorChunk::BlockPointer:
312 innermost = i;
John McCallae278a32011-01-12 00:34:59 +0000313 continue;
John McCall711c52b2011-01-05 12:14:39 +0000314
315 case DeclaratorChunk::Reference:
316 case DeclaratorChunk::MemberPointer:
317 case DeclaratorChunk::Paren:
318 case DeclaratorChunk::Array:
319 continue;
320
321 case DeclaratorChunk::Function:
322 considerDeclSpec = false;
323 goto done;
324 }
325 }
326 done:
327
328 // That might actually be the decl spec if we weren't blocked by
329 // anything in the declarator.
330 if (considerDeclSpec) {
331 if (handleObjCPointerTypeAttr(state, attr, declSpecType))
332 return;
333 }
334
335 // Otherwise, if we found an appropriate chunk, splice the attribute
336 // into it.
337 if (innermost != -1U) {
338 moveAttrFromListToList(attr, declarator.getAttrListRef(),
339 declarator.getTypeObject(innermost).getAttrListRef());
340 return;
341 }
342
343 // Otherwise, diagnose when we're done building the type.
344 spliceAttrOutOfList(attr, declarator.getAttrListRef());
345 state.addIgnoredTypeAttr(attr);
346}
347
348/// A function type attribute was written somewhere in a declaration
349/// *other* than on the declarator itself or in the decl spec. Given
350/// that it didn't apply in whatever position it was written in, try
351/// to move it to a more appropriate position.
352static void distributeFunctionTypeAttr(TypeProcessingState &state,
353 AttributeList &attr,
354 QualType type) {
355 Declarator &declarator = state.getDeclarator();
356
357 // Try to push the attribute from the return type of a function to
358 // the function itself.
359 for (unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
360 DeclaratorChunk &chunk = declarator.getTypeObject(i-1);
361 switch (chunk.Kind) {
362 case DeclaratorChunk::Function:
363 moveAttrFromListToList(attr, state.getCurrentAttrListRef(),
364 chunk.getAttrListRef());
365 return;
366
367 case DeclaratorChunk::Paren:
368 case DeclaratorChunk::Pointer:
369 case DeclaratorChunk::BlockPointer:
370 case DeclaratorChunk::Array:
371 case DeclaratorChunk::Reference:
372 case DeclaratorChunk::MemberPointer:
373 continue;
374 }
375 }
376
377 state.getSema().Diag(attr.getLoc(), diag::warn_function_attribute_wrong_type)
378 << attr.getName() << type;
379}
380
381/// Try to distribute a function type attribute to the innermost
382/// function chunk or type. Returns true if the attribute was
383/// distributed, false if no location was found.
384static bool
385distributeFunctionTypeAttrToInnermost(TypeProcessingState &state,
386 AttributeList &attr,
387 AttributeList *&attrList,
388 QualType &declSpecType) {
389 Declarator &declarator = state.getDeclarator();
390
391 // Put it on the innermost function chunk, if there is one.
392 for (unsigned i = 0, e = declarator.getNumTypeObjects(); i != e; ++i) {
393 DeclaratorChunk &chunk = declarator.getTypeObject(i);
394 if (chunk.Kind != DeclaratorChunk::Function) continue;
395
396 moveAttrFromListToList(attr, attrList, chunk.getAttrListRef());
397 return true;
398 }
399
400 return handleFunctionTypeAttr(state, attr, declSpecType);
401}
402
403/// A function type attribute was written in the decl spec. Try to
404/// apply it somewhere.
405static void
406distributeFunctionTypeAttrFromDeclSpec(TypeProcessingState &state,
407 AttributeList &attr,
408 QualType &declSpecType) {
409 state.saveDeclSpecAttrs();
410
411 // Try to distribute to the innermost.
412 if (distributeFunctionTypeAttrToInnermost(state, attr,
413 state.getCurrentAttrListRef(),
414 declSpecType))
415 return;
416
417 // If that failed, diagnose the bad attribute when the declarator is
418 // fully built.
419 state.addIgnoredTypeAttr(attr);
420}
421
422/// A function type attribute was written on the declarator. Try to
423/// apply it somewhere.
424static void
425distributeFunctionTypeAttrFromDeclarator(TypeProcessingState &state,
426 AttributeList &attr,
427 QualType &declSpecType) {
428 Declarator &declarator = state.getDeclarator();
429
430 // Try to distribute to the innermost.
431 if (distributeFunctionTypeAttrToInnermost(state, attr,
432 declarator.getAttrListRef(),
433 declSpecType))
434 return;
435
436 // If that failed, diagnose the bad attribute when the declarator is
437 // fully built.
438 spliceAttrOutOfList(attr, declarator.getAttrListRef());
439 state.addIgnoredTypeAttr(attr);
440}
441
442/// \brief Given that there are attributes written on the declarator
443/// itself, try to distribute any type attributes to the appropriate
444/// declarator chunk.
445///
446/// These are attributes like the following:
447/// int f ATTR;
448/// int (f ATTR)();
449/// but not necessarily this:
450/// int f() ATTR;
451static void distributeTypeAttrsFromDeclarator(TypeProcessingState &state,
452 QualType &declSpecType) {
453 // Collect all the type attributes from the declarator itself.
454 assert(state.getDeclarator().getAttributes() && "declarator has no attrs!");
455 AttributeList *attr = state.getDeclarator().getAttributes();
456 AttributeList *next;
457 do {
458 next = attr->getNext();
459
460 switch (attr->getKind()) {
461 OBJC_POINTER_TYPE_ATTRS_CASELIST:
462 distributeObjCPointerTypeAttrFromDeclarator(state, *attr, declSpecType);
463 break;
464
465 FUNCTION_TYPE_ATTRS_CASELIST:
466 distributeFunctionTypeAttrFromDeclarator(state, *attr, declSpecType);
467 break;
468
469 default:
470 break;
471 }
472 } while ((attr = next));
473}
474
475/// Add a synthetic '()' to a block-literal declarator if it is
476/// required, given the return type.
477static void maybeSynthesizeBlockSignature(TypeProcessingState &state,
478 QualType declSpecType) {
479 Declarator &declarator = state.getDeclarator();
480
481 // First, check whether the declarator would produce a function,
482 // i.e. whether the innermost semantic chunk is a function.
483 if (declarator.isFunctionDeclarator()) {
484 // If so, make that declarator a prototyped declarator.
485 declarator.getFunctionTypeInfo().hasPrototype = true;
486 return;
487 }
488
489 // If there are any type objects, the type as written won't
490 // name a function, regardless of the decl spec type. This
491 // is because a block signature declarator is always an
492 // abstract-declarator, and abstract-declarators can't just
493 // be parentheses chunks. Therefore we need to build a function
494 // chunk unless there are no type objects and the decl spec
495 // type is a function.
496 if (!declarator.getNumTypeObjects() && declSpecType->isFunctionType())
497 return;
498
499#ifndef NDEBUG
500 if (declarator.getNumTypeObjects()) {
501 bool isOnlyParens = true;
502 for (unsigned i = 0, e = declarator.getNumTypeObjects(); i != e; ++i) {
503 if (declarator.getTypeObject(i).Kind != DeclaratorChunk::Paren) {
504 isOnlyParens = false;
505 break;
506 }
507 }
508 assert(!isOnlyParens &&
509 "non-empty abstract-declarator contained only parens!");
John McCall711c52b2011-01-05 12:14:39 +0000510 }
John McCall07fa2fa2011-01-05 12:34:30 +0000511#endif
John McCall711c52b2011-01-05 12:14:39 +0000512
513 // Otherwise, we need to fake up a function declarator.
514 SourceLocation loc = declarator.getSourceRange().getBegin();
515
516 // ...and *prepend* it to the declarator.
517 declarator.AddInnermostTypeInfo(DeclaratorChunk::getFunction(
518 ParsedAttributes(),
519 /*proto*/ true,
520 /*variadic*/ false, SourceLocation(),
521 /*args*/ 0, 0,
522 /*type quals*/ 0,
523 /*EH*/ false, SourceLocation(), false, 0, 0, 0,
524 /*parens*/ loc, loc,
525 declarator));
526
527 // For consistency, make sure the state still has us as processing
528 // the decl spec.
529 assert(state.getCurrentChunkIndex() == declarator.getNumTypeObjects() - 1);
530 state.setCurrentChunkIndex(declarator.getNumTypeObjects());
John McCall04a67a62010-02-05 21:31:56 +0000531}
532
Douglas Gregor930d8b52009-01-30 22:09:00 +0000533/// \brief Convert the specified declspec to the appropriate type
534/// object.
Chris Lattner5db2bb12009-10-25 18:21:37 +0000535/// \param D the declarator containing the declaration specifier.
Chris Lattner5153ee62009-04-25 08:47:54 +0000536/// \returns The type described by the declaration specifiers. This function
537/// never returns null.
John McCall711c52b2011-01-05 12:14:39 +0000538static QualType ConvertDeclSpecToType(Sema &S, TypeProcessingState &state) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000539 // FIXME: Should move the logic from DeclSpec::Finish to here for validity
540 // checking.
John McCall711c52b2011-01-05 12:14:39 +0000541
542 Declarator &declarator = state.getDeclarator();
543 const DeclSpec &DS = declarator.getDeclSpec();
544 SourceLocation DeclLoc = declarator.getIdentifierLoc();
Chris Lattner5db2bb12009-10-25 18:21:37 +0000545 if (DeclLoc.isInvalid())
546 DeclLoc = DS.getSourceRange().getBegin();
Chris Lattner1564e392009-10-25 18:07:27 +0000547
John McCall711c52b2011-01-05 12:14:39 +0000548 ASTContext &Context = S.Context;
Mike Stump1eb44332009-09-09 15:08:12 +0000549
Chris Lattner5db2bb12009-10-25 18:21:37 +0000550 QualType Result;
Reid Spencer5f016e22007-07-11 17:01:13 +0000551 switch (DS.getTypeSpecType()) {
Chris Lattner96b77fc2008-04-02 06:50:17 +0000552 case DeclSpec::TST_void:
553 Result = Context.VoidTy;
554 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000555 case DeclSpec::TST_char:
556 if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified)
Chris Lattnerfab5b452008-02-20 23:53:49 +0000557 Result = Context.CharTy;
Reid Spencer5f016e22007-07-11 17:01:13 +0000558 else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed)
Chris Lattnerfab5b452008-02-20 23:53:49 +0000559 Result = Context.SignedCharTy;
Reid Spencer5f016e22007-07-11 17:01:13 +0000560 else {
561 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned &&
562 "Unknown TSS value");
Chris Lattnerfab5b452008-02-20 23:53:49 +0000563 Result = Context.UnsignedCharTy;
Reid Spencer5f016e22007-07-11 17:01:13 +0000564 }
Chris Lattner958858e2008-02-20 21:40:32 +0000565 break;
Argyrios Kyrtzidis64c438a2008-08-09 16:51:54 +0000566 case DeclSpec::TST_wchar:
567 if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified)
568 Result = Context.WCharTy;
569 else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed) {
John McCall711c52b2011-01-05 12:14:39 +0000570 S.Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec)
Chris Lattnerf3a41af2008-11-20 06:38:18 +0000571 << DS.getSpecifierName(DS.getTypeSpecType());
Argyrios Kyrtzidis64c438a2008-08-09 16:51:54 +0000572 Result = Context.getSignedWCharType();
573 } else {
574 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned &&
575 "Unknown TSS value");
John McCall711c52b2011-01-05 12:14:39 +0000576 S.Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec)
Chris Lattnerf3a41af2008-11-20 06:38:18 +0000577 << DS.getSpecifierName(DS.getTypeSpecType());
Argyrios Kyrtzidis64c438a2008-08-09 16:51:54 +0000578 Result = Context.getUnsignedWCharType();
579 }
580 break;
Alisdair Meredithf5c209d2009-07-14 06:30:34 +0000581 case DeclSpec::TST_char16:
582 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
583 "Unknown TSS value");
584 Result = Context.Char16Ty;
585 break;
586 case DeclSpec::TST_char32:
587 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
588 "Unknown TSS value");
589 Result = Context.Char32Ty;
590 break;
Chris Lattnerd658b562008-04-05 06:32:51 +0000591 case DeclSpec::TST_unspecified:
Chris Lattner62f5f7f2008-07-26 00:46:50 +0000592 // "<proto1,proto2>" is an objc qualified ID with a missing id.
Chris Lattner097e9162008-10-20 02:01:50 +0000593 if (DeclSpec::ProtocolQualifierListTy PQ = DS.getProtocolQualifiers()) {
John McCallc12c5bb2010-05-15 11:32:37 +0000594 Result = Context.getObjCObjectType(Context.ObjCBuiltinIdTy,
595 (ObjCProtocolDecl**)PQ,
596 DS.getNumProtocolQualifiers());
597 Result = Context.getObjCObjectPointerType(Result);
Chris Lattner62f5f7f2008-07-26 00:46:50 +0000598 break;
599 }
Chris Lattner5db2bb12009-10-25 18:21:37 +0000600
601 // If this is a missing declspec in a block literal return context, then it
602 // is inferred from the return statements inside the block.
John McCall711c52b2011-01-05 12:14:39 +0000603 if (isOmittedBlockReturnType(declarator)) {
Chris Lattner5db2bb12009-10-25 18:21:37 +0000604 Result = Context.DependentTy;
605 break;
606 }
Mike Stump1eb44332009-09-09 15:08:12 +0000607
Chris Lattnerd658b562008-04-05 06:32:51 +0000608 // Unspecified typespec defaults to int in C90. However, the C90 grammar
609 // [C90 6.5] only allows a decl-spec if there was *some* type-specifier,
610 // type-qualifier, or storage-class-specifier. If not, emit an extwarn.
611 // Note that the one exception to this is function definitions, which are
612 // allowed to be completely missing a declspec. This is handled in the
613 // parser already though by it pretending to have seen an 'int' in this
614 // case.
John McCall711c52b2011-01-05 12:14:39 +0000615 if (S.getLangOptions().ImplicitInt) {
Chris Lattner35d276f2009-02-27 18:53:28 +0000616 // In C89 mode, we only warn if there is a completely missing declspec
617 // when one is not allowed.
Chris Lattner3f84ad22009-04-22 05:27:59 +0000618 if (DS.isEmpty()) {
John McCall711c52b2011-01-05 12:14:39 +0000619 S.Diag(DeclLoc, diag::ext_missing_declspec)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000620 << DS.getSourceRange()
Douglas Gregor849b2432010-03-31 17:46:05 +0000621 << FixItHint::CreateInsertion(DS.getSourceRange().getBegin(), "int");
Chris Lattner3f84ad22009-04-22 05:27:59 +0000622 }
Douglas Gregor4310f4e2009-02-16 22:38:20 +0000623 } else if (!DS.hasTypeSpecifier()) {
Chris Lattnerd658b562008-04-05 06:32:51 +0000624 // C99 and C++ require a type specifier. For example, C99 6.7.2p2 says:
625 // "At least one type specifier shall be given in the declaration
626 // specifiers in each declaration, and in the specifier-qualifier list in
627 // each struct declaration and type name."
Douglas Gregor4310f4e2009-02-16 22:38:20 +0000628 // FIXME: Does Microsoft really have the implicit int extension in C++?
John McCall711c52b2011-01-05 12:14:39 +0000629 if (S.getLangOptions().CPlusPlus &&
630 !S.getLangOptions().Microsoft) {
631 S.Diag(DeclLoc, diag::err_missing_type_specifier)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000632 << DS.getSourceRange();
Mike Stump1eb44332009-09-09 15:08:12 +0000633
Chris Lattnerb78d8332009-06-26 04:45:06 +0000634 // When this occurs in C++ code, often something is very broken with the
635 // value being declared, poison it as invalid so we don't get chains of
636 // errors.
John McCall711c52b2011-01-05 12:14:39 +0000637 declarator.setInvalidType(true);
Chris Lattnerb78d8332009-06-26 04:45:06 +0000638 } else {
John McCall711c52b2011-01-05 12:14:39 +0000639 S.Diag(DeclLoc, diag::ext_missing_type_specifier)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000640 << DS.getSourceRange();
Chris Lattnerb78d8332009-06-26 04:45:06 +0000641 }
Chris Lattnerd658b562008-04-05 06:32:51 +0000642 }
Mike Stump1eb44332009-09-09 15:08:12 +0000643
644 // FALL THROUGH.
Chris Lattner3cbc38b2007-08-21 17:02:28 +0000645 case DeclSpec::TST_int: {
Reid Spencer5f016e22007-07-11 17:01:13 +0000646 if (DS.getTypeSpecSign() != DeclSpec::TSS_unsigned) {
647 switch (DS.getTypeSpecWidth()) {
Chris Lattnerfab5b452008-02-20 23:53:49 +0000648 case DeclSpec::TSW_unspecified: Result = Context.IntTy; break;
649 case DeclSpec::TSW_short: Result = Context.ShortTy; break;
650 case DeclSpec::TSW_long: Result = Context.LongTy; break;
Chris Lattner311157f2009-10-25 18:25:04 +0000651 case DeclSpec::TSW_longlong:
652 Result = Context.LongLongTy;
653
654 // long long is a C99 feature.
John McCall711c52b2011-01-05 12:14:39 +0000655 if (!S.getLangOptions().C99 &&
656 !S.getLangOptions().CPlusPlus0x)
657 S.Diag(DS.getTypeSpecWidthLoc(), diag::ext_longlong);
Chris Lattner311157f2009-10-25 18:25:04 +0000658 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000659 }
660 } else {
661 switch (DS.getTypeSpecWidth()) {
Chris Lattnerfab5b452008-02-20 23:53:49 +0000662 case DeclSpec::TSW_unspecified: Result = Context.UnsignedIntTy; break;
663 case DeclSpec::TSW_short: Result = Context.UnsignedShortTy; break;
664 case DeclSpec::TSW_long: Result = Context.UnsignedLongTy; break;
Chris Lattner311157f2009-10-25 18:25:04 +0000665 case DeclSpec::TSW_longlong:
666 Result = Context.UnsignedLongLongTy;
667
668 // long long is a C99 feature.
John McCall711c52b2011-01-05 12:14:39 +0000669 if (!S.getLangOptions().C99 &&
670 !S.getLangOptions().CPlusPlus0x)
671 S.Diag(DS.getTypeSpecWidthLoc(), diag::ext_longlong);
Chris Lattner311157f2009-10-25 18:25:04 +0000672 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000673 }
674 }
Chris Lattner958858e2008-02-20 21:40:32 +0000675 break;
Chris Lattner3cbc38b2007-08-21 17:02:28 +0000676 }
Chris Lattnerfab5b452008-02-20 23:53:49 +0000677 case DeclSpec::TST_float: Result = Context.FloatTy; break;
Chris Lattner958858e2008-02-20 21:40:32 +0000678 case DeclSpec::TST_double:
679 if (DS.getTypeSpecWidth() == DeclSpec::TSW_long)
Chris Lattnerfab5b452008-02-20 23:53:49 +0000680 Result = Context.LongDoubleTy;
Chris Lattner958858e2008-02-20 21:40:32 +0000681 else
Chris Lattnerfab5b452008-02-20 23:53:49 +0000682 Result = Context.DoubleTy;
Chris Lattner958858e2008-02-20 21:40:32 +0000683 break;
Chris Lattnerfab5b452008-02-20 23:53:49 +0000684 case DeclSpec::TST_bool: Result = Context.BoolTy; break; // _Bool or bool
Reid Spencer5f016e22007-07-11 17:01:13 +0000685 case DeclSpec::TST_decimal32: // _Decimal32
686 case DeclSpec::TST_decimal64: // _Decimal64
687 case DeclSpec::TST_decimal128: // _Decimal128
John McCall711c52b2011-01-05 12:14:39 +0000688 S.Diag(DS.getTypeSpecTypeLoc(), diag::err_decimal_unsupported);
Chris Lattner8f12f652009-05-13 05:02:08 +0000689 Result = Context.IntTy;
John McCall711c52b2011-01-05 12:14:39 +0000690 declarator.setInvalidType(true);
Chris Lattner8f12f652009-05-13 05:02:08 +0000691 break;
Chris Lattner99dc9142008-04-13 18:59:07 +0000692 case DeclSpec::TST_class:
Reid Spencer5f016e22007-07-11 17:01:13 +0000693 case DeclSpec::TST_enum:
694 case DeclSpec::TST_union:
695 case DeclSpec::TST_struct: {
John McCallb3d87482010-08-24 05:47:05 +0000696 TypeDecl *D = dyn_cast_or_null<TypeDecl>(DS.getRepAsDecl());
John McCall6e247262009-10-10 05:48:19 +0000697 if (!D) {
698 // This can happen in C++ with ambiguous lookups.
699 Result = Context.IntTy;
John McCall711c52b2011-01-05 12:14:39 +0000700 declarator.setInvalidType(true);
John McCall6e247262009-10-10 05:48:19 +0000701 break;
702 }
703
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000704 // If the type is deprecated or unavailable, diagnose it.
John McCall711c52b2011-01-05 12:14:39 +0000705 S.DiagnoseUseOfDecl(D, DS.getTypeSpecTypeLoc());
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000706
Reid Spencer5f016e22007-07-11 17:01:13 +0000707 assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 &&
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000708 DS.getTypeSpecSign() == 0 && "No qualifiers on tag names!");
709
Reid Spencer5f016e22007-07-11 17:01:13 +0000710 // TypeQuals handled by caller.
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000711 Result = Context.getTypeDeclType(D);
John McCall2191b202009-09-05 06:31:47 +0000712
713 // In C++, make an ElaboratedType.
John McCall711c52b2011-01-05 12:14:39 +0000714 if (S.getLangOptions().CPlusPlus) {
Abramo Bagnara465d41b2010-05-11 21:36:43 +0000715 ElaboratedTypeKeyword Keyword
716 = ElaboratedType::getKeywordForTypeSpec(DS.getTypeSpecType());
John McCall711c52b2011-01-05 12:14:39 +0000717 Result = S.getElaboratedType(Keyword, DS.getTypeSpecScope(), Result);
John McCall2191b202009-09-05 06:31:47 +0000718 }
Chris Lattner5153ee62009-04-25 08:47:54 +0000719 if (D->isInvalidDecl())
John McCall711c52b2011-01-05 12:14:39 +0000720 declarator.setInvalidType(true);
Chris Lattner958858e2008-02-20 21:40:32 +0000721 break;
Mike Stump1eb44332009-09-09 15:08:12 +0000722 }
Douglas Gregor1a51b4a2009-02-09 15:09:02 +0000723 case DeclSpec::TST_typename: {
Reid Spencer5f016e22007-07-11 17:01:13 +0000724 assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 &&
725 DS.getTypeSpecSign() == 0 &&
726 "Can't handle qualifiers on typedef names yet!");
John McCall711c52b2011-01-05 12:14:39 +0000727 Result = S.GetTypeFromParser(DS.getRepAsType());
John McCall27940d22010-07-30 05:17:22 +0000728 if (Result.isNull())
John McCall711c52b2011-01-05 12:14:39 +0000729 declarator.setInvalidType(true);
John McCall27940d22010-07-30 05:17:22 +0000730 else if (DeclSpec::ProtocolQualifierListTy PQ
731 = DS.getProtocolQualifiers()) {
John McCallc12c5bb2010-05-15 11:32:37 +0000732 if (const ObjCObjectType *ObjT = Result->getAs<ObjCObjectType>()) {
733 // Silently drop any existing protocol qualifiers.
734 // TODO: determine whether that's the right thing to do.
735 if (ObjT->getNumProtocols())
736 Result = ObjT->getBaseType();
737
738 if (DS.getNumProtocolQualifiers())
739 Result = Context.getObjCObjectType(Result,
740 (ObjCProtocolDecl**) PQ,
741 DS.getNumProtocolQualifiers());
742 } else if (Result->isObjCIdType()) {
Chris Lattnerae4da612008-07-26 01:53:50 +0000743 // id<protocol-list>
John McCallc12c5bb2010-05-15 11:32:37 +0000744 Result = Context.getObjCObjectType(Context.ObjCBuiltinIdTy,
745 (ObjCProtocolDecl**) PQ,
746 DS.getNumProtocolQualifiers());
747 Result = Context.getObjCObjectPointerType(Result);
748 } else if (Result->isObjCClassType()) {
Steve Naroff4262a072009-02-23 18:53:24 +0000749 // Class<protocol-list>
John McCallc12c5bb2010-05-15 11:32:37 +0000750 Result = Context.getObjCObjectType(Context.ObjCBuiltinClassTy,
751 (ObjCProtocolDecl**) PQ,
752 DS.getNumProtocolQualifiers());
753 Result = Context.getObjCObjectPointerType(Result);
Chris Lattner3f84ad22009-04-22 05:27:59 +0000754 } else {
John McCall711c52b2011-01-05 12:14:39 +0000755 S.Diag(DeclLoc, diag::err_invalid_protocol_qualifiers)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000756 << DS.getSourceRange();
John McCall711c52b2011-01-05 12:14:39 +0000757 declarator.setInvalidType(true);
Chris Lattner3f84ad22009-04-22 05:27:59 +0000758 }
Fariborz Jahanianc5692492007-12-17 21:03:50 +0000759 }
Mike Stump1eb44332009-09-09 15:08:12 +0000760
Reid Spencer5f016e22007-07-11 17:01:13 +0000761 // TypeQuals handled by caller.
Chris Lattner958858e2008-02-20 21:40:32 +0000762 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000763 }
Chris Lattner958858e2008-02-20 21:40:32 +0000764 case DeclSpec::TST_typeofType:
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +0000765 // FIXME: Preserve type source info.
John McCall711c52b2011-01-05 12:14:39 +0000766 Result = S.GetTypeFromParser(DS.getRepAsType());
Chris Lattner958858e2008-02-20 21:40:32 +0000767 assert(!Result.isNull() && "Didn't get a type for typeof?");
Fariborz Jahanian730e1752010-10-06 17:00:02 +0000768 if (!Result->isDependentType())
769 if (const TagType *TT = Result->getAs<TagType>())
John McCall711c52b2011-01-05 12:14:39 +0000770 S.DiagnoseUseOfDecl(TT->getDecl(), DS.getTypeSpecTypeLoc());
Steve Naroffd1861fd2007-07-31 12:34:36 +0000771 // TypeQuals handled by caller.
Chris Lattnerfab5b452008-02-20 23:53:49 +0000772 Result = Context.getTypeOfType(Result);
Chris Lattner958858e2008-02-20 21:40:32 +0000773 break;
Steve Naroffd1861fd2007-07-31 12:34:36 +0000774 case DeclSpec::TST_typeofExpr: {
John McCallb3d87482010-08-24 05:47:05 +0000775 Expr *E = DS.getRepAsExpr();
Steve Naroffd1861fd2007-07-31 12:34:36 +0000776 assert(E && "Didn't get an expression for typeof?");
777 // TypeQuals handled by caller.
John McCall711c52b2011-01-05 12:14:39 +0000778 Result = S.BuildTypeofExprType(E, DS.getTypeSpecTypeLoc());
Douglas Gregor4b52e252009-12-21 23:17:24 +0000779 if (Result.isNull()) {
780 Result = Context.IntTy;
John McCall711c52b2011-01-05 12:14:39 +0000781 declarator.setInvalidType(true);
Douglas Gregor4b52e252009-12-21 23:17:24 +0000782 }
Chris Lattner958858e2008-02-20 21:40:32 +0000783 break;
Steve Naroffd1861fd2007-07-31 12:34:36 +0000784 }
Anders Carlsson6fd634f2009-06-24 17:47:40 +0000785 case DeclSpec::TST_decltype: {
John McCallb3d87482010-08-24 05:47:05 +0000786 Expr *E = DS.getRepAsExpr();
Anders Carlsson6fd634f2009-06-24 17:47:40 +0000787 assert(E && "Didn't get an expression for decltype?");
788 // TypeQuals handled by caller.
John McCall711c52b2011-01-05 12:14:39 +0000789 Result = S.BuildDecltypeType(E, DS.getTypeSpecTypeLoc());
Anders Carlssonaf017e62009-06-29 22:58:55 +0000790 if (Result.isNull()) {
791 Result = Context.IntTy;
John McCall711c52b2011-01-05 12:14:39 +0000792 declarator.setInvalidType(true);
Anders Carlssonaf017e62009-06-29 22:58:55 +0000793 }
Anders Carlsson6fd634f2009-06-24 17:47:40 +0000794 break;
795 }
Anders Carlssone89d1592009-06-26 18:41:36 +0000796 case DeclSpec::TST_auto: {
797 // TypeQuals handled by caller.
798 Result = Context.UndeducedAutoTy;
799 break;
800 }
Mike Stump1eb44332009-09-09 15:08:12 +0000801
Douglas Gregor809070a2009-02-18 17:45:20 +0000802 case DeclSpec::TST_error:
Chris Lattner5153ee62009-04-25 08:47:54 +0000803 Result = Context.IntTy;
John McCall711c52b2011-01-05 12:14:39 +0000804 declarator.setInvalidType(true);
Chris Lattner5153ee62009-04-25 08:47:54 +0000805 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000806 }
Mike Stump1eb44332009-09-09 15:08:12 +0000807
Chris Lattner958858e2008-02-20 21:40:32 +0000808 // Handle complex types.
Douglas Gregorf244cd72009-02-14 21:06:05 +0000809 if (DS.getTypeSpecComplex() == DeclSpec::TSC_complex) {
John McCall711c52b2011-01-05 12:14:39 +0000810 if (S.getLangOptions().Freestanding)
811 S.Diag(DS.getTypeSpecComplexLoc(), diag::ext_freestanding_complex);
Chris Lattnerfab5b452008-02-20 23:53:49 +0000812 Result = Context.getComplexType(Result);
John Thompson82287d12010-02-05 00:12:22 +0000813 } else if (DS.isTypeAltiVecVector()) {
814 unsigned typeSize = static_cast<unsigned>(Context.getTypeSize(Result));
815 assert(typeSize > 0 && "type size for vector must be greater than 0 bits");
Bob Wilsone86d78c2010-11-10 21:56:12 +0000816 VectorType::VectorKind VecKind = VectorType::AltiVecVector;
Chris Lattner788b0fd2010-06-23 06:00:24 +0000817 if (DS.isTypeAltiVecPixel())
Bob Wilsone86d78c2010-11-10 21:56:12 +0000818 VecKind = VectorType::AltiVecPixel;
Chris Lattner788b0fd2010-06-23 06:00:24 +0000819 else if (DS.isTypeAltiVecBool())
Bob Wilsone86d78c2010-11-10 21:56:12 +0000820 VecKind = VectorType::AltiVecBool;
821 Result = Context.getVectorType(Result, 128/typeSize, VecKind);
Douglas Gregorf244cd72009-02-14 21:06:05 +0000822 }
Mike Stump1eb44332009-09-09 15:08:12 +0000823
Argyrios Kyrtzidis47423bd2010-09-23 09:40:31 +0000824 // FIXME: Imaginary.
825 if (DS.getTypeSpecComplex() == DeclSpec::TSC_imaginary)
John McCall711c52b2011-01-05 12:14:39 +0000826 S.Diag(DS.getTypeSpecComplexLoc(), diag::err_imaginary_not_supported);
Mike Stump1eb44332009-09-09 15:08:12 +0000827
John McCall711c52b2011-01-05 12:14:39 +0000828 // Before we process any type attributes, synthesize a block literal
829 // function declarator if necessary.
830 if (declarator.getContext() == Declarator::BlockLiteralContext)
831 maybeSynthesizeBlockSignature(state, Result);
832
833 // Apply any type attributes from the decl spec. This may cause the
834 // list of type attributes to be temporarily saved while the type
835 // attributes are pushed around.
836 if (AttributeList *attrs = DS.getAttributes().getList())
837 processTypeAttrs(state, Result, true, attrs);
Mike Stump1eb44332009-09-09 15:08:12 +0000838
Chris Lattner96b77fc2008-04-02 06:50:17 +0000839 // Apply const/volatile/restrict qualifiers to T.
840 if (unsigned TypeQuals = DS.getTypeQualifiers()) {
841
842 // Enforce C99 6.7.3p2: "Types other than pointer types derived from object
843 // or incomplete types shall not be restrict-qualified." C++ also allows
844 // restrict-qualified references.
John McCall0953e762009-09-24 19:53:00 +0000845 if (TypeQuals & DeclSpec::TQ_restrict) {
Fariborz Jahanian2b5ff1a2009-12-07 18:08:58 +0000846 if (Result->isAnyPointerType() || Result->isReferenceType()) {
847 QualType EltTy;
848 if (Result->isObjCObjectPointerType())
849 EltTy = Result;
850 else
851 EltTy = Result->isPointerType() ?
852 Result->getAs<PointerType>()->getPointeeType() :
853 Result->getAs<ReferenceType>()->getPointeeType();
Mike Stump1eb44332009-09-09 15:08:12 +0000854
Douglas Gregorbad0e652009-03-24 20:32:41 +0000855 // If we have a pointer or reference, the pointee must have an object
Chris Lattnerbdcd6372008-04-02 17:35:06 +0000856 // incomplete type.
857 if (!EltTy->isIncompleteOrObjectType()) {
John McCall711c52b2011-01-05 12:14:39 +0000858 S.Diag(DS.getRestrictSpecLoc(),
Chris Lattnerd3a94e22008-11-20 06:06:08 +0000859 diag::err_typecheck_invalid_restrict_invalid_pointee)
Chris Lattnerd1625842008-11-24 06:25:27 +0000860 << EltTy << DS.getSourceRange();
John McCall0953e762009-09-24 19:53:00 +0000861 TypeQuals &= ~DeclSpec::TQ_restrict; // Remove the restrict qualifier.
Chris Lattnerbdcd6372008-04-02 17:35:06 +0000862 }
863 } else {
John McCall711c52b2011-01-05 12:14:39 +0000864 S.Diag(DS.getRestrictSpecLoc(),
865 diag::err_typecheck_invalid_restrict_not_pointer)
Chris Lattnerd1625842008-11-24 06:25:27 +0000866 << Result << DS.getSourceRange();
John McCall0953e762009-09-24 19:53:00 +0000867 TypeQuals &= ~DeclSpec::TQ_restrict; // Remove the restrict qualifier.
Chris Lattner96b77fc2008-04-02 06:50:17 +0000868 }
Chris Lattner96b77fc2008-04-02 06:50:17 +0000869 }
Mike Stump1eb44332009-09-09 15:08:12 +0000870
Chris Lattner96b77fc2008-04-02 06:50:17 +0000871 // Warn about CV qualifiers on functions: C99 6.7.3p8: "If the specification
872 // of a function type includes any type qualifiers, the behavior is
873 // undefined."
874 if (Result->isFunctionType() && TypeQuals) {
875 // Get some location to point at, either the C or V location.
876 SourceLocation Loc;
John McCall0953e762009-09-24 19:53:00 +0000877 if (TypeQuals & DeclSpec::TQ_const)
Chris Lattner96b77fc2008-04-02 06:50:17 +0000878 Loc = DS.getConstSpecLoc();
John McCall0953e762009-09-24 19:53:00 +0000879 else if (TypeQuals & DeclSpec::TQ_volatile)
Chris Lattner96b77fc2008-04-02 06:50:17 +0000880 Loc = DS.getVolatileSpecLoc();
John McCall0953e762009-09-24 19:53:00 +0000881 else {
882 assert((TypeQuals & DeclSpec::TQ_restrict) &&
883 "Has CVR quals but not C, V, or R?");
884 Loc = DS.getRestrictSpecLoc();
Chris Lattner96b77fc2008-04-02 06:50:17 +0000885 }
John McCall711c52b2011-01-05 12:14:39 +0000886 S.Diag(Loc, diag::warn_typecheck_function_qualifiers)
Chris Lattnerd1625842008-11-24 06:25:27 +0000887 << Result << DS.getSourceRange();
Chris Lattner96b77fc2008-04-02 06:50:17 +0000888 }
Mike Stump1eb44332009-09-09 15:08:12 +0000889
Douglas Gregorf1f9b4e2008-11-03 15:51:28 +0000890 // C++ [dcl.ref]p1:
891 // Cv-qualified references are ill-formed except when the
892 // cv-qualifiers are introduced through the use of a typedef
893 // (7.1.3) or of a template type argument (14.3), in which
894 // case the cv-qualifiers are ignored.
Douglas Gregor1a51b4a2009-02-09 15:09:02 +0000895 // FIXME: Shouldn't we be checking SCS_typedef here?
896 if (DS.getTypeSpecType() == DeclSpec::TST_typename &&
Douglas Gregorf1f9b4e2008-11-03 15:51:28 +0000897 TypeQuals && Result->isReferenceType()) {
John McCall0953e762009-09-24 19:53:00 +0000898 TypeQuals &= ~DeclSpec::TQ_const;
899 TypeQuals &= ~DeclSpec::TQ_volatile;
Mike Stump1eb44332009-09-09 15:08:12 +0000900 }
901
John McCall0953e762009-09-24 19:53:00 +0000902 Qualifiers Quals = Qualifiers::fromCVRMask(TypeQuals);
903 Result = Context.getQualifiedType(Result, Quals);
Chris Lattner96b77fc2008-04-02 06:50:17 +0000904 }
John McCall0953e762009-09-24 19:53:00 +0000905
Chris Lattnerf1d705c2008-02-21 01:07:18 +0000906 return Result;
907}
908
Douglas Gregorcd281c32009-02-28 00:25:32 +0000909static std::string getPrintableNameForEntity(DeclarationName Entity) {
910 if (Entity)
911 return Entity.getAsString();
Mike Stump1eb44332009-09-09 15:08:12 +0000912
Douglas Gregorcd281c32009-02-28 00:25:32 +0000913 return "type name";
914}
915
John McCall28654742010-06-05 06:41:15 +0000916QualType Sema::BuildQualifiedType(QualType T, SourceLocation Loc,
917 Qualifiers Qs) {
918 // Enforce C99 6.7.3p2: "Types other than pointer types derived from
919 // object or incomplete types shall not be restrict-qualified."
920 if (Qs.hasRestrict()) {
921 unsigned DiagID = 0;
922 QualType ProblemTy;
923
924 const Type *Ty = T->getCanonicalTypeInternal().getTypePtr();
925 if (const ReferenceType *RTy = dyn_cast<ReferenceType>(Ty)) {
926 if (!RTy->getPointeeType()->isIncompleteOrObjectType()) {
927 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
928 ProblemTy = T->getAs<ReferenceType>()->getPointeeType();
929 }
930 } else if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
931 if (!PTy->getPointeeType()->isIncompleteOrObjectType()) {
932 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
933 ProblemTy = T->getAs<PointerType>()->getPointeeType();
934 }
935 } else if (const MemberPointerType *PTy = dyn_cast<MemberPointerType>(Ty)) {
936 if (!PTy->getPointeeType()->isIncompleteOrObjectType()) {
937 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
938 ProblemTy = T->getAs<PointerType>()->getPointeeType();
939 }
940 } else if (!Ty->isDependentType()) {
941 // FIXME: this deserves a proper diagnostic
942 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
943 ProblemTy = T;
944 }
945
946 if (DiagID) {
947 Diag(Loc, DiagID) << ProblemTy;
948 Qs.removeRestrict();
949 }
950 }
951
952 return Context.getQualifiedType(T, Qs);
953}
954
Abramo Bagnara075f8f12010-12-10 16:29:40 +0000955/// \brief Build a paren type including \p T.
956QualType Sema::BuildParenType(QualType T) {
957 return Context.getParenType(T);
958}
959
Douglas Gregorcd281c32009-02-28 00:25:32 +0000960/// \brief Build a pointer type.
961///
962/// \param T The type to which we'll be building a pointer.
963///
Douglas Gregorcd281c32009-02-28 00:25:32 +0000964/// \param Loc The location of the entity whose type involves this
965/// pointer type or, if there is no such entity, the location of the
966/// type that will have pointer type.
967///
968/// \param Entity The name of the entity that involves the pointer
969/// type, if known.
970///
971/// \returns A suitable pointer type, if there are no
972/// errors. Otherwise, returns a NULL type.
John McCall28654742010-06-05 06:41:15 +0000973QualType Sema::BuildPointerType(QualType T,
Douglas Gregorcd281c32009-02-28 00:25:32 +0000974 SourceLocation Loc, DeclarationName Entity) {
975 if (T->isReferenceType()) {
976 // C++ 8.3.2p4: There shall be no ... pointers to references ...
977 Diag(Loc, diag::err_illegal_decl_pointer_to_reference)
John McCallac406052009-10-30 00:37:20 +0000978 << getPrintableNameForEntity(Entity) << T;
Douglas Gregorcd281c32009-02-28 00:25:32 +0000979 return QualType();
980 }
981
John McCallc12c5bb2010-05-15 11:32:37 +0000982 assert(!T->isObjCObjectType() && "Should build ObjCObjectPointerType");
Douglas Gregor92e986e2010-04-22 16:44:27 +0000983
Douglas Gregorcd281c32009-02-28 00:25:32 +0000984 // Build the pointer type.
John McCall28654742010-06-05 06:41:15 +0000985 return Context.getPointerType(T);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000986}
987
988/// \brief Build a reference type.
989///
990/// \param T The type to which we'll be building a reference.
991///
Douglas Gregorcd281c32009-02-28 00:25:32 +0000992/// \param Loc The location of the entity whose type involves this
993/// reference type or, if there is no such entity, the location of the
994/// type that will have reference type.
995///
996/// \param Entity The name of the entity that involves the reference
997/// type, if known.
998///
999/// \returns A suitable reference type, if there are no
1000/// errors. Otherwise, returns a NULL type.
John McCall54e14c42009-10-22 22:37:11 +00001001QualType Sema::BuildReferenceType(QualType T, bool SpelledAsLValue,
John McCall28654742010-06-05 06:41:15 +00001002 SourceLocation Loc,
John McCall54e14c42009-10-22 22:37:11 +00001003 DeclarationName Entity) {
John McCall54e14c42009-10-22 22:37:11 +00001004 bool LValueRef = SpelledAsLValue || T->getAs<LValueReferenceType>();
1005
1006 // C++0x [dcl.typedef]p9: If a typedef TD names a type that is a
1007 // reference to a type T, and attempt to create the type "lvalue
1008 // reference to cv TD" creates the type "lvalue reference to T".
1009 // We use the qualifiers (restrict or none) of the original reference,
1010 // not the new ones. This is consistent with GCC.
1011
1012 // C++ [dcl.ref]p4: There shall be no references to references.
1013 //
1014 // According to C++ DR 106, references to references are only
1015 // diagnosed when they are written directly (e.g., "int & &"),
1016 // but not when they happen via a typedef:
1017 //
1018 // typedef int& intref;
1019 // typedef intref& intref2;
1020 //
1021 // Parser::ParseDeclaratorInternal diagnoses the case where
1022 // references are written directly; here, we handle the
1023 // collapsing of references-to-references as described in C++
1024 // DR 106 and amended by C++ DR 540.
Douglas Gregorcd281c32009-02-28 00:25:32 +00001025
1026 // C++ [dcl.ref]p1:
Eli Friedman33a31382009-08-05 19:21:58 +00001027 // A declarator that specifies the type "reference to cv void"
Douglas Gregorcd281c32009-02-28 00:25:32 +00001028 // is ill-formed.
1029 if (T->isVoidType()) {
1030 Diag(Loc, diag::err_reference_to_void);
1031 return QualType();
1032 }
1033
Douglas Gregorcd281c32009-02-28 00:25:32 +00001034 // Handle restrict on references.
Sebastian Redl7c80bd62009-03-16 23:22:08 +00001035 if (LValueRef)
John McCall28654742010-06-05 06:41:15 +00001036 return Context.getLValueReferenceType(T, SpelledAsLValue);
1037 return Context.getRValueReferenceType(T);
Douglas Gregorcd281c32009-02-28 00:25:32 +00001038}
1039
1040/// \brief Build an array type.
1041///
1042/// \param T The type of each element in the array.
1043///
1044/// \param ASM C99 array size modifier (e.g., '*', 'static').
Mike Stump1eb44332009-09-09 15:08:12 +00001045///
1046/// \param ArraySize Expression describing the size of the array.
Douglas Gregorcd281c32009-02-28 00:25:32 +00001047///
Douglas Gregorcd281c32009-02-28 00:25:32 +00001048/// \param Loc The location of the entity whose type involves this
1049/// array type or, if there is no such entity, the location of the
1050/// type that will have array type.
1051///
1052/// \param Entity The name of the entity that involves the array
1053/// type, if known.
1054///
1055/// \returns A suitable array type, if there are no errors. Otherwise,
1056/// returns a NULL type.
1057QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM,
1058 Expr *ArraySize, unsigned Quals,
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001059 SourceRange Brackets, DeclarationName Entity) {
John McCall0953e762009-09-24 19:53:00 +00001060
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001061 SourceLocation Loc = Brackets.getBegin();
Sebastian Redl923d56d2009-11-05 15:52:31 +00001062 if (getLangOptions().CPlusPlus) {
Douglas Gregor138bb232010-04-27 19:38:14 +00001063 // C++ [dcl.array]p1:
1064 // T is called the array element type; this type shall not be a reference
1065 // type, the (possibly cv-qualified) type void, a function type or an
1066 // abstract class type.
1067 //
1068 // Note: function types are handled in the common path with C.
1069 if (T->isReferenceType()) {
1070 Diag(Loc, diag::err_illegal_decl_array_of_references)
1071 << getPrintableNameForEntity(Entity) << T;
1072 return QualType();
1073 }
1074
Sebastian Redl923d56d2009-11-05 15:52:31 +00001075 if (T->isVoidType()) {
1076 Diag(Loc, diag::err_illegal_decl_array_incomplete_type) << T;
1077 return QualType();
1078 }
Douglas Gregor138bb232010-04-27 19:38:14 +00001079
1080 if (RequireNonAbstractType(Brackets.getBegin(), T,
1081 diag::err_array_of_abstract_type))
1082 return QualType();
1083
Sebastian Redl923d56d2009-11-05 15:52:31 +00001084 } else {
Douglas Gregor138bb232010-04-27 19:38:14 +00001085 // C99 6.7.5.2p1: If the element type is an incomplete or function type,
1086 // reject it (e.g. void ary[7], struct foo ary[7], void ary[7]())
Sebastian Redl923d56d2009-11-05 15:52:31 +00001087 if (RequireCompleteType(Loc, T,
1088 diag::err_illegal_decl_array_incomplete_type))
1089 return QualType();
1090 }
Douglas Gregorcd281c32009-02-28 00:25:32 +00001091
1092 if (T->isFunctionType()) {
1093 Diag(Loc, diag::err_illegal_decl_array_of_functions)
John McCallac406052009-10-30 00:37:20 +00001094 << getPrintableNameForEntity(Entity) << T;
Douglas Gregorcd281c32009-02-28 00:25:32 +00001095 return QualType();
1096 }
Mike Stump1eb44332009-09-09 15:08:12 +00001097
Anders Carlssone7cf07d2009-06-26 19:33:28 +00001098 if (Context.getCanonicalType(T) == Context.UndeducedAutoTy) {
Mike Stump1eb44332009-09-09 15:08:12 +00001099 Diag(Loc, diag::err_illegal_decl_array_of_auto)
Anders Carlssone7cf07d2009-06-26 19:33:28 +00001100 << getPrintableNameForEntity(Entity);
1101 return QualType();
1102 }
Mike Stump1eb44332009-09-09 15:08:12 +00001103
Ted Kremenek6217b802009-07-29 21:53:49 +00001104 if (const RecordType *EltTy = T->getAs<RecordType>()) {
Douglas Gregorcd281c32009-02-28 00:25:32 +00001105 // If the element type is a struct or union that contains a variadic
1106 // array, accept it as a GNU extension: C99 6.7.2.1p2.
1107 if (EltTy->getDecl()->hasFlexibleArrayMember())
1108 Diag(Loc, diag::ext_flexible_array_in_array) << T;
John McCallc12c5bb2010-05-15 11:32:37 +00001109 } else if (T->isObjCObjectType()) {
Chris Lattnerc7c11b12009-04-27 01:55:56 +00001110 Diag(Loc, diag::err_objc_array_of_interfaces) << T;
1111 return QualType();
Douglas Gregorcd281c32009-02-28 00:25:32 +00001112 }
Mike Stump1eb44332009-09-09 15:08:12 +00001113
John McCall5e3c67b2010-12-15 04:42:30 +00001114 // Do lvalue-to-rvalue conversions on the array size expression.
1115 if (ArraySize && !ArraySize->isRValue())
1116 DefaultLvalueConversion(ArraySize);
1117
Douglas Gregorcd281c32009-02-28 00:25:32 +00001118 // C99 6.7.5.2p1: The size expression shall have integer type.
John McCall5e3c67b2010-12-15 04:42:30 +00001119 // TODO: in theory, if we were insane, we could allow contextual
1120 // conversions to integer type here.
Douglas Gregorcd281c32009-02-28 00:25:32 +00001121 if (ArraySize && !ArraySize->isTypeDependent() &&
Douglas Gregor1274ccd2010-10-08 23:50:27 +00001122 !ArraySize->getType()->isIntegralOrUnscopedEnumerationType()) {
Douglas Gregorcd281c32009-02-28 00:25:32 +00001123 Diag(ArraySize->getLocStart(), diag::err_array_size_non_int)
1124 << ArraySize->getType() << ArraySize->getSourceRange();
Douglas Gregorcd281c32009-02-28 00:25:32 +00001125 return QualType();
1126 }
Douglas Gregor2767ce22010-08-18 00:39:00 +00001127 llvm::APSInt ConstVal(Context.getTypeSize(Context.getSizeType()));
Douglas Gregorcd281c32009-02-28 00:25:32 +00001128 if (!ArraySize) {
Eli Friedmanf91f5c82009-04-26 21:57:51 +00001129 if (ASM == ArrayType::Star)
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001130 T = Context.getVariableArrayType(T, 0, ASM, Quals, Brackets);
Eli Friedmanf91f5c82009-04-26 21:57:51 +00001131 else
1132 T = Context.getIncompleteArrayType(T, ASM, Quals);
Douglas Gregorac06a0e2010-05-18 23:01:22 +00001133 } else if (ArraySize->isTypeDependent() || ArraySize->isValueDependent()) {
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001134 T = Context.getDependentSizedArrayType(T, ArraySize, ASM, Quals, Brackets);
Douglas Gregorcd281c32009-02-28 00:25:32 +00001135 } else if (!ArraySize->isIntegerConstantExpr(ConstVal, Context) ||
Sebastian Redl923d56d2009-11-05 15:52:31 +00001136 (!T->isDependentType() && !T->isIncompleteType() &&
1137 !T->isConstantSizeType())) {
Douglas Gregorcd281c32009-02-28 00:25:32 +00001138 // Per C99, a variable array is an array with either a non-constant
1139 // size or an element type that has a non-constant-size
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001140 T = Context.getVariableArrayType(T, ArraySize, ASM, Quals, Brackets);
Douglas Gregorcd281c32009-02-28 00:25:32 +00001141 } else {
1142 // C99 6.7.5.2p1: If the expression is a constant expression, it shall
1143 // have a value greater than zero.
Sebastian Redl923d56d2009-11-05 15:52:31 +00001144 if (ConstVal.isSigned() && ConstVal.isNegative()) {
Chandler Carruthb2b5cc02011-01-04 04:44:35 +00001145 if (Entity)
1146 Diag(ArraySize->getLocStart(), diag::err_decl_negative_array_size)
1147 << getPrintableNameForEntity(Entity) << ArraySize->getSourceRange();
1148 else
1149 Diag(ArraySize->getLocStart(), diag::err_typecheck_negative_array_size)
1150 << ArraySize->getSourceRange();
Sebastian Redl923d56d2009-11-05 15:52:31 +00001151 return QualType();
1152 }
1153 if (ConstVal == 0) {
Douglas Gregor02024a92010-03-28 02:42:43 +00001154 // GCC accepts zero sized static arrays. We allow them when
1155 // we're not in a SFINAE context.
1156 Diag(ArraySize->getLocStart(),
1157 isSFINAEContext()? diag::err_typecheck_zero_array_size
1158 : diag::ext_typecheck_zero_array_size)
Sebastian Redl923d56d2009-11-05 15:52:31 +00001159 << ArraySize->getSourceRange();
Douglas Gregor2767ce22010-08-18 00:39:00 +00001160 } else if (!T->isDependentType() && !T->isVariablyModifiedType() &&
1161 !T->isIncompleteType()) {
1162 // Is the array too large?
1163 unsigned ActiveSizeBits
1164 = ConstantArrayType::getNumAddressingBits(Context, T, ConstVal);
1165 if (ActiveSizeBits > ConstantArrayType::getMaxSizeBits(Context))
1166 Diag(ArraySize->getLocStart(), diag::err_array_too_large)
1167 << ConstVal.toString(10)
1168 << ArraySize->getSourceRange();
Mike Stump1eb44332009-09-09 15:08:12 +00001169 }
Douglas Gregor2767ce22010-08-18 00:39:00 +00001170
John McCall46a617a2009-10-16 00:14:28 +00001171 T = Context.getConstantArrayType(T, ConstVal, ASM, Quals);
Douglas Gregorcd281c32009-02-28 00:25:32 +00001172 }
David Chisnallaf407762010-01-11 23:08:08 +00001173 // If this is not C99, extwarn about VLA's and C99 array size modifiers.
1174 if (!getLangOptions().C99) {
Douglas Gregor0fddb972010-05-22 16:17:30 +00001175 if (T->isVariableArrayType()) {
1176 // Prohibit the use of non-POD types in VLAs.
Douglas Gregor204ce172010-05-24 20:42:30 +00001177 if (!T->isDependentType() &&
1178 !Context.getBaseElementType(T)->isPODType()) {
Douglas Gregor0fddb972010-05-22 16:17:30 +00001179 Diag(Loc, diag::err_vla_non_pod)
1180 << Context.getBaseElementType(T);
1181 return QualType();
1182 }
Douglas Gregora481ec42010-05-23 19:57:01 +00001183 // Prohibit the use of VLAs during template argument deduction.
1184 else if (isSFINAEContext()) {
1185 Diag(Loc, diag::err_vla_in_sfinae);
1186 return QualType();
1187 }
Douglas Gregor0fddb972010-05-22 16:17:30 +00001188 // Just extwarn about VLAs.
1189 else
1190 Diag(Loc, diag::ext_vla);
1191 } else if (ASM != ArrayType::Normal || Quals != 0)
Douglas Gregor043cad22009-09-11 00:18:58 +00001192 Diag(Loc,
1193 getLangOptions().CPlusPlus? diag::err_c99_array_usage_cxx
1194 : diag::ext_c99_array_usage);
Douglas Gregorcd281c32009-02-28 00:25:32 +00001195 }
1196
1197 return T;
1198}
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001199
1200/// \brief Build an ext-vector type.
1201///
1202/// Run the required checks for the extended vector type.
John McCall9ae2f072010-08-23 23:25:46 +00001203QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize,
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001204 SourceLocation AttrLoc) {
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001205 // unlike gcc's vector_size attribute, we do not allow vectors to be defined
1206 // in conjunction with complex types (pointers, arrays, functions, etc.).
Mike Stump1eb44332009-09-09 15:08:12 +00001207 if (!T->isDependentType() &&
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001208 !T->isIntegerType() && !T->isRealFloatingType()) {
1209 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) << T;
1210 return QualType();
1211 }
1212
John McCall9ae2f072010-08-23 23:25:46 +00001213 if (!ArraySize->isTypeDependent() && !ArraySize->isValueDependent()) {
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001214 llvm::APSInt vecSize(32);
John McCall9ae2f072010-08-23 23:25:46 +00001215 if (!ArraySize->isIntegerConstantExpr(vecSize, Context)) {
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001216 Diag(AttrLoc, diag::err_attribute_argument_not_int)
John McCall9ae2f072010-08-23 23:25:46 +00001217 << "ext_vector_type" << ArraySize->getSourceRange();
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001218 return QualType();
1219 }
Mike Stump1eb44332009-09-09 15:08:12 +00001220
1221 // unlike gcc's vector_size attribute, the size is specified as the
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001222 // number of elements, not the number of bytes.
Mike Stump1eb44332009-09-09 15:08:12 +00001223 unsigned vectorSize = static_cast<unsigned>(vecSize.getZExtValue());
1224
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001225 if (vectorSize == 0) {
1226 Diag(AttrLoc, diag::err_attribute_zero_size)
John McCall9ae2f072010-08-23 23:25:46 +00001227 << ArraySize->getSourceRange();
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001228 return QualType();
1229 }
Mike Stump1eb44332009-09-09 15:08:12 +00001230
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001231 if (!T->isDependentType())
1232 return Context.getExtVectorType(T, vectorSize);
Mike Stump1eb44332009-09-09 15:08:12 +00001233 }
1234
John McCall9ae2f072010-08-23 23:25:46 +00001235 return Context.getDependentSizedExtVectorType(T, ArraySize, AttrLoc);
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001236}
Mike Stump1eb44332009-09-09 15:08:12 +00001237
Douglas Gregor724651c2009-02-28 01:04:19 +00001238/// \brief Build a function type.
1239///
1240/// This routine checks the function type according to C++ rules and
1241/// under the assumption that the result type and parameter types have
1242/// just been instantiated from a template. It therefore duplicates
Douglas Gregor2943aed2009-03-03 04:44:36 +00001243/// some of the behavior of GetTypeForDeclarator, but in a much
Douglas Gregor724651c2009-02-28 01:04:19 +00001244/// simpler form that is only suitable for this narrow use case.
1245///
1246/// \param T The return type of the function.
1247///
1248/// \param ParamTypes The parameter types of the function. This array
1249/// will be modified to account for adjustments to the types of the
1250/// function parameters.
1251///
1252/// \param NumParamTypes The number of parameter types in ParamTypes.
1253///
1254/// \param Variadic Whether this is a variadic function type.
1255///
1256/// \param Quals The cvr-qualifiers to be applied to the function type.
1257///
1258/// \param Loc The location of the entity whose type involves this
1259/// function type or, if there is no such entity, the location of the
1260/// type that will have function type.
1261///
1262/// \param Entity The name of the entity that involves the function
1263/// type, if known.
1264///
1265/// \returns A suitable function type, if there are no
1266/// errors. Otherwise, returns a NULL type.
1267QualType Sema::BuildFunctionType(QualType T,
Mike Stump1eb44332009-09-09 15:08:12 +00001268 QualType *ParamTypes,
Douglas Gregor724651c2009-02-28 01:04:19 +00001269 unsigned NumParamTypes,
1270 bool Variadic, unsigned Quals,
Eli Friedmanfa869542010-08-05 02:54:05 +00001271 SourceLocation Loc, DeclarationName Entity,
John McCalle23cf432010-12-14 08:05:40 +00001272 FunctionType::ExtInfo Info) {
Douglas Gregor724651c2009-02-28 01:04:19 +00001273 if (T->isArrayType() || T->isFunctionType()) {
Douglas Gregor58408bc2010-01-11 18:46:21 +00001274 Diag(Loc, diag::err_func_returning_array_function)
1275 << T->isFunctionType() << T;
Douglas Gregor724651c2009-02-28 01:04:19 +00001276 return QualType();
1277 }
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001278
Douglas Gregor724651c2009-02-28 01:04:19 +00001279 bool Invalid = false;
1280 for (unsigned Idx = 0; Idx < NumParamTypes; ++Idx) {
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001281 QualType ParamType = adjustParameterType(ParamTypes[Idx]);
1282 if (ParamType->isVoidType()) {
Douglas Gregor724651c2009-02-28 01:04:19 +00001283 Diag(Loc, diag::err_param_with_void_type);
1284 Invalid = true;
1285 }
Douglas Gregorcd281c32009-02-28 00:25:32 +00001286
John McCall54e14c42009-10-22 22:37:11 +00001287 ParamTypes[Idx] = ParamType;
Douglas Gregor724651c2009-02-28 01:04:19 +00001288 }
1289
1290 if (Invalid)
1291 return QualType();
1292
John McCalle23cf432010-12-14 08:05:40 +00001293 FunctionProtoType::ExtProtoInfo EPI;
1294 EPI.Variadic = Variadic;
1295 EPI.TypeQuals = Quals;
1296 EPI.ExtInfo = Info;
1297
1298 return Context.getFunctionType(T, ParamTypes, NumParamTypes, EPI);
Douglas Gregor724651c2009-02-28 01:04:19 +00001299}
Mike Stump1eb44332009-09-09 15:08:12 +00001300
Douglas Gregor949bf692009-06-09 22:17:39 +00001301/// \brief Build a member pointer type \c T Class::*.
1302///
1303/// \param T the type to which the member pointer refers.
1304/// \param Class the class type into which the member pointer points.
John McCall0953e762009-09-24 19:53:00 +00001305/// \param CVR Qualifiers applied to the member pointer type
Douglas Gregor949bf692009-06-09 22:17:39 +00001306/// \param Loc the location where this type begins
1307/// \param Entity the name of the entity that will have this member pointer type
1308///
1309/// \returns a member pointer type, if successful, or a NULL type if there was
1310/// an error.
Mike Stump1eb44332009-09-09 15:08:12 +00001311QualType Sema::BuildMemberPointerType(QualType T, QualType Class,
John McCall28654742010-06-05 06:41:15 +00001312 SourceLocation Loc,
Douglas Gregor949bf692009-06-09 22:17:39 +00001313 DeclarationName Entity) {
1314 // Verify that we're not building a pointer to pointer to function with
1315 // exception specification.
1316 if (CheckDistantExceptionSpec(T)) {
1317 Diag(Loc, diag::err_distant_exception_spec);
1318
1319 // FIXME: If we're doing this as part of template instantiation,
1320 // we should return immediately.
1321
1322 // Build the type anyway, but use the canonical type so that the
1323 // exception specifiers are stripped off.
1324 T = Context.getCanonicalType(T);
1325 }
1326
Sebastian Redl73780122010-06-09 21:19:43 +00001327 // C++ 8.3.3p3: A pointer to member shall not point to ... a member
Douglas Gregor949bf692009-06-09 22:17:39 +00001328 // with reference type, or "cv void."
1329 if (T->isReferenceType()) {
Anders Carlsson8d4655d2009-06-30 00:06:57 +00001330 Diag(Loc, diag::err_illegal_decl_mempointer_to_reference)
John McCallac406052009-10-30 00:37:20 +00001331 << (Entity? Entity.getAsString() : "type name") << T;
Douglas Gregor949bf692009-06-09 22:17:39 +00001332 return QualType();
1333 }
1334
1335 if (T->isVoidType()) {
1336 Diag(Loc, diag::err_illegal_decl_mempointer_to_void)
1337 << (Entity? Entity.getAsString() : "type name");
1338 return QualType();
1339 }
1340
Douglas Gregor949bf692009-06-09 22:17:39 +00001341 if (!Class->isDependentType() && !Class->isRecordType()) {
1342 Diag(Loc, diag::err_mempointer_in_nonclass_type) << Class;
1343 return QualType();
1344 }
1345
Charles Davisd18f9f92010-08-16 04:01:50 +00001346 // In the Microsoft ABI, the class is allowed to be an incomplete
1347 // type. In such cases, the compiler makes a worst-case assumption.
1348 // We make no such assumption right now, so emit an error if the
1349 // class isn't a complete type.
Charles Davis20cf7172010-08-19 02:18:14 +00001350 if (Context.Target.getCXXABI() == CXXABI_Microsoft &&
Charles Davisd18f9f92010-08-16 04:01:50 +00001351 RequireCompleteType(Loc, Class, diag::err_incomplete_type))
1352 return QualType();
1353
John McCall28654742010-06-05 06:41:15 +00001354 return Context.getMemberPointerType(T, Class.getTypePtr());
Douglas Gregor949bf692009-06-09 22:17:39 +00001355}
Mike Stump1eb44332009-09-09 15:08:12 +00001356
Anders Carlsson9a917e42009-06-12 22:56:54 +00001357/// \brief Build a block pointer type.
1358///
1359/// \param T The type to which we'll be building a block pointer.
1360///
John McCall0953e762009-09-24 19:53:00 +00001361/// \param CVR The cvr-qualifiers to be applied to the block pointer type.
Anders Carlsson9a917e42009-06-12 22:56:54 +00001362///
1363/// \param Loc The location of the entity whose type involves this
1364/// block pointer type or, if there is no such entity, the location of the
1365/// type that will have block pointer type.
1366///
1367/// \param Entity The name of the entity that involves the block pointer
1368/// type, if known.
1369///
1370/// \returns A suitable block pointer type, if there are no
1371/// errors. Otherwise, returns a NULL type.
John McCall28654742010-06-05 06:41:15 +00001372QualType Sema::BuildBlockPointerType(QualType T,
Mike Stump1eb44332009-09-09 15:08:12 +00001373 SourceLocation Loc,
Anders Carlsson9a917e42009-06-12 22:56:54 +00001374 DeclarationName Entity) {
John McCall0953e762009-09-24 19:53:00 +00001375 if (!T->isFunctionType()) {
Anders Carlsson9a917e42009-06-12 22:56:54 +00001376 Diag(Loc, diag::err_nonfunction_block_type);
1377 return QualType();
1378 }
Mike Stump1eb44332009-09-09 15:08:12 +00001379
John McCall28654742010-06-05 06:41:15 +00001380 return Context.getBlockPointerType(T);
Anders Carlsson9a917e42009-06-12 22:56:54 +00001381}
1382
John McCallb3d87482010-08-24 05:47:05 +00001383QualType Sema::GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo) {
1384 QualType QT = Ty.get();
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001385 if (QT.isNull()) {
John McCalla93c9342009-12-07 02:54:59 +00001386 if (TInfo) *TInfo = 0;
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001387 return QualType();
1388 }
1389
John McCalla93c9342009-12-07 02:54:59 +00001390 TypeSourceInfo *DI = 0;
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +00001391 if (LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) {
1392 QT = LIT->getType();
John McCalla93c9342009-12-07 02:54:59 +00001393 DI = LIT->getTypeSourceInfo();
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +00001394 }
Mike Stump1eb44332009-09-09 15:08:12 +00001395
John McCalla93c9342009-12-07 02:54:59 +00001396 if (TInfo) *TInfo = DI;
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +00001397 return QT;
1398}
1399
Mike Stump98eb8a72009-02-04 22:31:32 +00001400/// GetTypeForDeclarator - Convert the type for the specified
Sebastian Redl8ce35b02009-10-25 21:45:37 +00001401/// declarator to Type instances.
Douglas Gregor402abb52009-05-28 23:31:59 +00001402///
1403/// If OwnedDecl is non-NULL, and this declarator's decl-specifier-seq
1404/// owns the declaration of a type (e.g., the definition of a struct
1405/// type), then *OwnedDecl will receive the owned declaration.
John McCallbf1a0282010-06-04 23:28:52 +00001406///
1407/// The result of this call will never be null, but the associated
1408/// type may be a null type if there's an unrecoverable error.
1409TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
1410 TagDecl **OwnedDecl) {
Douglas Gregor930d8b52009-01-30 22:09:00 +00001411 // Determine the type of the declarator. Not all forms of declarator
1412 // have a type.
1413 QualType T;
Douglas Gregor05baacb2010-04-12 23:19:01 +00001414 TypeSourceInfo *ReturnTypeInfo = 0;
John McCall711c52b2011-01-05 12:14:39 +00001415
1416 TypeProcessingState state(*this, D);
John McCall04a67a62010-02-05 21:31:56 +00001417
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001418 switch (D.getName().getKind()) {
1419 case UnqualifiedId::IK_Identifier:
1420 case UnqualifiedId::IK_OperatorFunctionId:
Sean Hunt0486d742009-11-28 04:44:28 +00001421 case UnqualifiedId::IK_LiteralOperatorId:
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001422 case UnqualifiedId::IK_TemplateId:
John McCall711c52b2011-01-05 12:14:39 +00001423 T = ConvertDeclSpecToType(*this, state);
Chris Lattner5db2bb12009-10-25 18:21:37 +00001424
Douglas Gregor591bd3c2010-02-08 22:07:33 +00001425 if (!D.isInvalidType() && D.getDeclSpec().isTypeSpecOwned()) {
John McCallb3d87482010-08-24 05:47:05 +00001426 TagDecl* Owned = cast<TagDecl>(D.getDeclSpec().getRepAsDecl());
Douglas Gregorb37b6482010-02-12 17:40:34 +00001427 // Owned is embedded if it was defined here, or if it is the
1428 // very first (i.e., canonical) declaration of this tag type.
1429 Owned->setEmbeddedInDeclarator(Owned->isDefinition() ||
1430 Owned->isCanonicalDecl());
Douglas Gregor591bd3c2010-02-08 22:07:33 +00001431 if (OwnedDecl) *OwnedDecl = Owned;
1432 }
Douglas Gregor930d8b52009-01-30 22:09:00 +00001433 break;
1434
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001435 case UnqualifiedId::IK_ConstructorName:
Douglas Gregor0efc2c12010-01-13 17:31:36 +00001436 case UnqualifiedId::IK_ConstructorTemplateId:
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001437 case UnqualifiedId::IK_DestructorName:
Douglas Gregor930d8b52009-01-30 22:09:00 +00001438 // Constructors and destructors don't have return types. Use
Douglas Gregor48026d22010-01-11 18:40:55 +00001439 // "void" instead.
Douglas Gregor930d8b52009-01-30 22:09:00 +00001440 T = Context.VoidTy;
1441 break;
Douglas Gregor48026d22010-01-11 18:40:55 +00001442
1443 case UnqualifiedId::IK_ConversionFunctionId:
1444 // The result type of a conversion function is the type that it
1445 // converts to.
Douglas Gregor05baacb2010-04-12 23:19:01 +00001446 T = GetTypeFromParser(D.getName().ConversionFunctionId,
John McCallbf1a0282010-06-04 23:28:52 +00001447 &ReturnTypeInfo);
Douglas Gregor48026d22010-01-11 18:40:55 +00001448 break;
Douglas Gregor930d8b52009-01-30 22:09:00 +00001449 }
Douglas Gregordab60ad2010-10-01 18:44:50 +00001450
John McCall711c52b2011-01-05 12:14:39 +00001451 if (D.getAttributes())
1452 distributeTypeAttrsFromDeclarator(state, T);
1453
Douglas Gregordab60ad2010-10-01 18:44:50 +00001454 // Check for auto functions and trailing return type and adjust the
1455 // return type accordingly.
1456 if (getLangOptions().CPlusPlus0x && D.isFunctionDeclarator()) {
Abramo Bagnara075f8f12010-12-10 16:29:40 +00001457 const DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
Douglas Gregordab60ad2010-10-01 18:44:50 +00001458 if (T == Context.UndeducedAutoTy) {
1459 if (FTI.TrailingReturnType) {
1460 T = GetTypeFromParser(ParsedType::getFromOpaquePtr(FTI.TrailingReturnType),
1461 &ReturnTypeInfo);
1462 }
1463 else {
1464 Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
1465 diag::err_auto_missing_trailing_return);
1466 T = Context.IntTy;
1467 D.setInvalidType(true);
1468 }
1469 }
1470 else if (FTI.TrailingReturnType) {
1471 Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
1472 diag::err_trailing_return_without_auto);
1473 D.setInvalidType(true);
1474 }
1475 }
1476
Douglas Gregor1f5f3a42009-12-03 17:10:37 +00001477 if (T.isNull())
John McCallbf1a0282010-06-04 23:28:52 +00001478 return Context.getNullTypeSourceInfo();
Douglas Gregor1f5f3a42009-12-03 17:10:37 +00001479
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001480 if (T == Context.UndeducedAutoTy) {
1481 int Error = -1;
Mike Stump1eb44332009-09-09 15:08:12 +00001482
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001483 switch (D.getContext()) {
1484 case Declarator::KNRTypeListContext:
1485 assert(0 && "K&R type lists aren't allowed in C++");
1486 break;
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001487 case Declarator::PrototypeContext:
1488 Error = 0; // Function prototype
1489 break;
1490 case Declarator::MemberContext:
1491 switch (cast<TagDecl>(CurContext)->getTagKind()) {
Abramo Bagnara465d41b2010-05-11 21:36:43 +00001492 case TTK_Enum: assert(0 && "unhandled tag kind"); break;
1493 case TTK_Struct: Error = 1; /* Struct member */ break;
1494 case TTK_Union: Error = 2; /* Union member */ break;
1495 case TTK_Class: Error = 3; /* Class member */ break;
Mike Stump1eb44332009-09-09 15:08:12 +00001496 }
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001497 break;
1498 case Declarator::CXXCatchContext:
1499 Error = 4; // Exception declaration
1500 break;
1501 case Declarator::TemplateParamContext:
1502 Error = 5; // Template parameter
1503 break;
1504 case Declarator::BlockLiteralContext:
1505 Error = 6; // Block literal
1506 break;
1507 case Declarator::FileContext:
1508 case Declarator::BlockContext:
1509 case Declarator::ForContext:
1510 case Declarator::ConditionContext:
1511 case Declarator::TypeNameContext:
1512 break;
1513 }
1514
1515 if (Error != -1) {
1516 Diag(D.getDeclSpec().getTypeSpecTypeLoc(), diag::err_auto_not_allowed)
1517 << Error;
1518 T = Context.IntTy;
1519 D.setInvalidType(true);
1520 }
1521 }
Mike Stump1eb44332009-09-09 15:08:12 +00001522
Douglas Gregorcd281c32009-02-28 00:25:32 +00001523 // The name we're declaring, if any.
1524 DeclarationName Name;
1525 if (D.getIdentifier())
1526 Name = D.getIdentifier();
Mike Stump1eb44332009-09-09 15:08:12 +00001527
Mike Stump98eb8a72009-02-04 22:31:32 +00001528 // Walk the DeclTypeInfo, building the recursive type as we go.
1529 // DeclTypeInfos are ordered from the identifier out, which is
1530 // opposite of what we want :).
Sebastian Redl8ce35b02009-10-25 21:45:37 +00001531 for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
John McCall711c52b2011-01-05 12:14:39 +00001532 unsigned chunkIndex = e - i - 1;
1533 state.setCurrentChunkIndex(chunkIndex);
1534 DeclaratorChunk &DeclType = D.getTypeObject(chunkIndex);
Reid Spencer5f016e22007-07-11 17:01:13 +00001535 switch (DeclType.Kind) {
1536 default: assert(0 && "Unknown decltype!");
Abramo Bagnara075f8f12010-12-10 16:29:40 +00001537 case DeclaratorChunk::Paren:
1538 T = BuildParenType(T);
1539 break;
Steve Naroff5618bd42008-08-27 16:04:49 +00001540 case DeclaratorChunk::BlockPointer:
Chris Lattner9af55002009-03-27 04:18:06 +00001541 // If blocks are disabled, emit an error.
1542 if (!LangOpts.Blocks)
1543 Diag(DeclType.Loc, diag::err_blocks_disable);
Mike Stump1eb44332009-09-09 15:08:12 +00001544
John McCall28654742010-06-05 06:41:15 +00001545 T = BuildBlockPointerType(T, D.getIdentifierLoc(), Name);
1546 if (DeclType.Cls.TypeQuals)
1547 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Cls.TypeQuals);
Steve Naroff5618bd42008-08-27 16:04:49 +00001548 break;
Reid Spencer5f016e22007-07-11 17:01:13 +00001549 case DeclaratorChunk::Pointer:
Sebastian Redl6a7330c2009-05-29 15:01:05 +00001550 // Verify that we're not building a pointer to pointer to function with
1551 // exception specification.
1552 if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
1553 Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
1554 D.setInvalidType(true);
1555 // Build the type anyway.
1556 }
John McCallc12c5bb2010-05-15 11:32:37 +00001557 if (getLangOptions().ObjC1 && T->getAs<ObjCObjectType>()) {
1558 T = Context.getObjCObjectPointerType(T);
John McCall28654742010-06-05 06:41:15 +00001559 if (DeclType.Ptr.TypeQuals)
1560 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
Steve Naroff14108da2009-07-10 23:34:53 +00001561 break;
1562 }
John McCall28654742010-06-05 06:41:15 +00001563 T = BuildPointerType(T, DeclType.Loc, Name);
1564 if (DeclType.Ptr.TypeQuals)
1565 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
John McCall711c52b2011-01-05 12:14:39 +00001566
Reid Spencer5f016e22007-07-11 17:01:13 +00001567 break;
John McCall0953e762009-09-24 19:53:00 +00001568 case DeclaratorChunk::Reference: {
Sebastian Redl6a7330c2009-05-29 15:01:05 +00001569 // Verify that we're not building a reference to pointer to function with
1570 // exception specification.
1571 if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
1572 Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
1573 D.setInvalidType(true);
1574 // Build the type anyway.
1575 }
John McCall28654742010-06-05 06:41:15 +00001576 T = BuildReferenceType(T, DeclType.Ref.LValueRef, DeclType.Loc, Name);
1577
1578 Qualifiers Quals;
1579 if (DeclType.Ref.HasRestrict)
1580 T = BuildQualifiedType(T, DeclType.Loc, Qualifiers::Restrict);
Reid Spencer5f016e22007-07-11 17:01:13 +00001581 break;
John McCall0953e762009-09-24 19:53:00 +00001582 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001583 case DeclaratorChunk::Array: {
Sebastian Redl6a7330c2009-05-29 15:01:05 +00001584 // Verify that we're not building an array of pointers to function with
1585 // exception specification.
1586 if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
1587 Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
1588 D.setInvalidType(true);
1589 // Build the type anyway.
1590 }
Chris Lattnerfd89bc82008-04-02 01:05:10 +00001591 DeclaratorChunk::ArrayTypeInfo &ATI = DeclType.Arr;
Chris Lattner94f81fd2007-08-28 16:54:00 +00001592 Expr *ArraySize = static_cast<Expr*>(ATI.NumElts);
Reid Spencer5f016e22007-07-11 17:01:13 +00001593 ArrayType::ArraySizeModifier ASM;
1594 if (ATI.isStar)
1595 ASM = ArrayType::Star;
1596 else if (ATI.hasStatic)
1597 ASM = ArrayType::Static;
1598 else
1599 ASM = ArrayType::Normal;
Eli Friedmanf91f5c82009-04-26 21:57:51 +00001600 if (ASM == ArrayType::Star &&
1601 D.getContext() != Declarator::PrototypeContext) {
1602 // FIXME: This check isn't quite right: it allows star in prototypes
1603 // for function definitions, and disallows some edge cases detailed
1604 // in http://gcc.gnu.org/ml/gcc-patches/2009-02/msg00133.html
1605 Diag(DeclType.Loc, diag::err_array_star_outside_prototype);
1606 ASM = ArrayType::Normal;
1607 D.setInvalidType(true);
1608 }
John McCall0953e762009-09-24 19:53:00 +00001609 T = BuildArrayType(T, ASM, ArraySize,
1610 Qualifiers::fromCVRMask(ATI.TypeQuals),
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001611 SourceRange(DeclType.Loc, DeclType.EndLoc), Name);
Reid Spencer5f016e22007-07-11 17:01:13 +00001612 break;
1613 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001614 case DeclaratorChunk::Function: {
Reid Spencer5f016e22007-07-11 17:01:13 +00001615 // If the function declarator has a prototype (i.e. it is not () and
1616 // does not have a K&R-style identifier list), then the arguments are part
1617 // of the type, otherwise the argument list is ().
1618 const DeclaratorChunk::FunctionTypeInfo &FTI = DeclType.Fun;
Sebastian Redl3cc97262009-05-31 11:47:27 +00001619
Chris Lattnercd881292007-12-19 05:31:29 +00001620 // C99 6.7.5.3p1: The return type may not be a function or array type.
Douglas Gregor58408bc2010-01-11 18:46:21 +00001621 // For conversion functions, we'll diagnose this particular error later.
Douglas Gregor48026d22010-01-11 18:40:55 +00001622 if ((T->isArrayType() || T->isFunctionType()) &&
1623 (D.getName().getKind() != UnqualifiedId::IK_ConversionFunctionId)) {
Douglas Gregor58408bc2010-01-11 18:46:21 +00001624 Diag(DeclType.Loc, diag::err_func_returning_array_function)
1625 << T->isFunctionType() << T;
Chris Lattnercd881292007-12-19 05:31:29 +00001626 T = Context.IntTy;
1627 D.setInvalidType(true);
1628 }
Sebastian Redl465226e2009-05-27 22:11:52 +00001629
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001630 // cv-qualifiers on return types are pointless except when the type is a
1631 // class type in C++.
1632 if (T.getCVRQualifiers() && D.getDeclSpec().getTypeQualifiers() &&
1633 (!getLangOptions().CPlusPlus ||
1634 (!T->isDependentType() && !T->isRecordType()))) {
1635 unsigned Quals = D.getDeclSpec().getTypeQualifiers();
Douglas Gregorde80ec12010-07-13 08:50:30 +00001636 std::string QualStr;
1637 unsigned NumQuals = 0;
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001638 SourceLocation Loc;
Douglas Gregorde80ec12010-07-13 08:50:30 +00001639 if (Quals & Qualifiers::Const) {
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001640 Loc = D.getDeclSpec().getConstSpecLoc();
Douglas Gregorde80ec12010-07-13 08:50:30 +00001641 ++NumQuals;
1642 QualStr = "const";
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001643 }
Douglas Gregorde80ec12010-07-13 08:50:30 +00001644 if (Quals & Qualifiers::Volatile) {
1645 if (NumQuals == 0) {
1646 Loc = D.getDeclSpec().getVolatileSpecLoc();
1647 QualStr = "volatile";
1648 } else
1649 QualStr += " volatile";
1650 ++NumQuals;
1651 }
1652 if (Quals & Qualifiers::Restrict) {
1653 if (NumQuals == 0) {
1654 Loc = D.getDeclSpec().getRestrictSpecLoc();
1655 QualStr = "restrict";
1656 } else
1657 QualStr += " restrict";
1658 ++NumQuals;
1659 }
1660 assert(NumQuals > 0 && "No known qualifiers?");
1661
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001662 SemaDiagnosticBuilder DB = Diag(Loc, diag::warn_qual_return_type);
Douglas Gregorde80ec12010-07-13 08:50:30 +00001663 DB << QualStr << NumQuals;
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001664 if (Quals & Qualifiers::Const)
1665 DB << FixItHint::CreateRemoval(D.getDeclSpec().getConstSpecLoc());
1666 if (Quals & Qualifiers::Volatile)
1667 DB << FixItHint::CreateRemoval(D.getDeclSpec().getVolatileSpecLoc());
1668 if (Quals & Qualifiers::Restrict)
1669 DB << FixItHint::CreateRemoval(D.getDeclSpec().getRestrictSpecLoc());
1670 }
1671
Douglas Gregor402abb52009-05-28 23:31:59 +00001672 if (getLangOptions().CPlusPlus && D.getDeclSpec().isTypeSpecOwned()) {
1673 // C++ [dcl.fct]p6:
1674 // Types shall not be defined in return or parameter types.
John McCallb3d87482010-08-24 05:47:05 +00001675 TagDecl *Tag = cast<TagDecl>(D.getDeclSpec().getRepAsDecl());
Douglas Gregor402abb52009-05-28 23:31:59 +00001676 if (Tag->isDefinition())
1677 Diag(Tag->getLocation(), diag::err_type_defined_in_result_type)
1678 << Context.getTypeDeclType(Tag);
1679 }
1680
Sebastian Redl3cc97262009-05-31 11:47:27 +00001681 // Exception specs are not allowed in typedefs. Complain, but add it
1682 // anyway.
1683 if (FTI.hasExceptionSpec &&
1684 D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef)
1685 Diag(FTI.getThrowLoc(), diag::err_exception_spec_in_typedef);
1686
John McCall28654742010-06-05 06:41:15 +00001687 if (!FTI.NumArgs && !FTI.isVariadic && !getLangOptions().CPlusPlus) {
1688 // Simple void foo(), where the incoming T is the result type.
1689 T = Context.getFunctionNoProtoType(T);
1690 } else {
1691 // We allow a zero-parameter variadic function in C if the
1692 // function is marked with the "overloadable" attribute. Scan
1693 // for this attribute now.
1694 if (!FTI.NumArgs && FTI.isVariadic && !getLangOptions().CPlusPlus) {
Douglas Gregor965acbb2009-02-18 07:07:28 +00001695 bool Overloadable = false;
1696 for (const AttributeList *Attrs = D.getAttributes();
1697 Attrs; Attrs = Attrs->getNext()) {
1698 if (Attrs->getKind() == AttributeList::AT_overloadable) {
1699 Overloadable = true;
1700 break;
1701 }
1702 }
1703
1704 if (!Overloadable)
1705 Diag(FTI.getEllipsisLoc(), diag::err_ellipsis_first_arg);
Argyrios Kyrtzidisc6f73452008-10-16 17:31:08 +00001706 }
John McCall28654742010-06-05 06:41:15 +00001707
1708 if (FTI.NumArgs && FTI.ArgInfo[0].Param == 0) {
Chris Lattner788b0fd2010-06-23 06:00:24 +00001709 // C99 6.7.5.3p3: Reject int(x,y,z) when it's not a function
1710 // definition.
John McCall28654742010-06-05 06:41:15 +00001711 Diag(FTI.ArgInfo[0].IdentLoc, diag::err_ident_list_in_fn_declaration);
1712 D.setInvalidType(true);
1713 break;
1714 }
1715
John McCalle23cf432010-12-14 08:05:40 +00001716 FunctionProtoType::ExtProtoInfo EPI;
1717 EPI.Variadic = FTI.isVariadic;
1718 EPI.TypeQuals = FTI.TypeQuals;
1719
Reid Spencer5f016e22007-07-11 17:01:13 +00001720 // Otherwise, we have a function with an argument list that is
1721 // potentially variadic.
1722 llvm::SmallVector<QualType, 16> ArgTys;
John McCall28654742010-06-05 06:41:15 +00001723 ArgTys.reserve(FTI.NumArgs);
Mike Stump1eb44332009-09-09 15:08:12 +00001724
Reid Spencer5f016e22007-07-11 17:01:13 +00001725 for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) {
John McCalld226f652010-08-21 09:40:31 +00001726 ParmVarDecl *Param = cast<ParmVarDecl>(FTI.ArgInfo[i].Param);
Chris Lattner8123a952008-04-10 02:22:51 +00001727 QualType ArgTy = Param->getType();
Chris Lattner78c75fb2007-07-21 05:30:18 +00001728 assert(!ArgTy.isNull() && "Couldn't parse type?");
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001729
1730 // Adjust the parameter type.
Douglas Gregorbeb58cb2009-03-23 23:17:00 +00001731 assert((ArgTy == adjustParameterType(ArgTy)) && "Unadjusted type?");
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001732
Reid Spencer5f016e22007-07-11 17:01:13 +00001733 // Look for 'void'. void is allowed only as a single argument to a
1734 // function with no other parameters (C99 6.7.5.3p10). We record
Douglas Gregor72564e72009-02-26 23:50:07 +00001735 // int(void) as a FunctionProtoType with an empty argument list.
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001736 if (ArgTy->isVoidType()) {
Reid Spencer5f016e22007-07-11 17:01:13 +00001737 // If this is something like 'float(int, void)', reject it. 'void'
1738 // is an incomplete type (C99 6.2.5p19) and function decls cannot
1739 // have arguments of incomplete type.
1740 if (FTI.NumArgs != 1 || FTI.isVariadic) {
1741 Diag(DeclType.Loc, diag::err_void_only_param);
Chris Lattner2ff54262007-07-21 05:18:12 +00001742 ArgTy = Context.IntTy;
Chris Lattner8123a952008-04-10 02:22:51 +00001743 Param->setType(ArgTy);
Chris Lattner2ff54262007-07-21 05:18:12 +00001744 } else if (FTI.ArgInfo[i].Ident) {
1745 // Reject, but continue to parse 'int(void abc)'.
Reid Spencer5f016e22007-07-11 17:01:13 +00001746 Diag(FTI.ArgInfo[i].IdentLoc,
Chris Lattner4565d4e2007-07-21 05:26:43 +00001747 diag::err_param_with_void_type);
Chris Lattner2ff54262007-07-21 05:18:12 +00001748 ArgTy = Context.IntTy;
Chris Lattner8123a952008-04-10 02:22:51 +00001749 Param->setType(ArgTy);
Chris Lattner2ff54262007-07-21 05:18:12 +00001750 } else {
1751 // Reject, but continue to parse 'float(const void)'.
John McCall0953e762009-09-24 19:53:00 +00001752 if (ArgTy.hasQualifiers())
Chris Lattner2ff54262007-07-21 05:18:12 +00001753 Diag(DeclType.Loc, diag::err_void_param_qualified);
Mike Stump1eb44332009-09-09 15:08:12 +00001754
Chris Lattner2ff54262007-07-21 05:18:12 +00001755 // Do not add 'void' to the ArgTys list.
1756 break;
1757 }
Eli Friedmaneb4b7052008-08-25 21:31:01 +00001758 } else if (!FTI.hasPrototype) {
1759 if (ArgTy->isPromotableIntegerType()) {
Eli Friedmana95d7572009-08-19 07:44:53 +00001760 ArgTy = Context.getPromotedIntegerType(ArgTy);
John McCall183700f2009-09-21 23:43:11 +00001761 } else if (const BuiltinType* BTy = ArgTy->getAs<BuiltinType>()) {
Eli Friedmaneb4b7052008-08-25 21:31:01 +00001762 if (BTy->getKind() == BuiltinType::Float)
1763 ArgTy = Context.DoubleTy;
1764 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001765 }
Fariborz Jahanian56a965c2010-09-08 21:36:35 +00001766
John McCall54e14c42009-10-22 22:37:11 +00001767 ArgTys.push_back(ArgTy);
Reid Spencer5f016e22007-07-11 17:01:13 +00001768 }
Sebastian Redl465226e2009-05-27 22:11:52 +00001769
1770 llvm::SmallVector<QualType, 4> Exceptions;
John McCalle23cf432010-12-14 08:05:40 +00001771 if (FTI.hasExceptionSpec) {
1772 EPI.HasExceptionSpec = FTI.hasExceptionSpec;
1773 EPI.HasAnyExceptionSpec = FTI.hasAnyExceptionSpec;
John McCalle23cf432010-12-14 08:05:40 +00001774 Exceptions.reserve(FTI.NumExceptions);
1775 for (unsigned ei = 0, ee = FTI.NumExceptions; ei != ee; ++ei) {
1776 // FIXME: Preserve type source info.
1777 QualType ET = GetTypeFromParser(FTI.Exceptions[ei].Ty);
1778 // Check that the type is valid for an exception spec, and
1779 // drop it if not.
1780 if (!CheckSpecifiedExceptionType(ET, FTI.Exceptions[ei].Range))
1781 Exceptions.push_back(ET);
1782 }
John McCall373920b2010-12-14 16:45:57 +00001783 EPI.NumExceptions = Exceptions.size();
John McCalle23cf432010-12-14 08:05:40 +00001784 EPI.Exceptions = Exceptions.data();
Sebastian Redlef65f062009-05-29 18:02:33 +00001785 }
Sebastian Redl465226e2009-05-27 22:11:52 +00001786
John McCalle23cf432010-12-14 08:05:40 +00001787 T = Context.getFunctionType(T, ArgTys.data(), ArgTys.size(), EPI);
Reid Spencer5f016e22007-07-11 17:01:13 +00001788 }
John McCall04a67a62010-02-05 21:31:56 +00001789
Reid Spencer5f016e22007-07-11 17:01:13 +00001790 break;
1791 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001792 case DeclaratorChunk::MemberPointer:
1793 // The scope spec must refer to a class, or be dependent.
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001794 CXXScopeSpec &SS = DeclType.Mem.Scope();
Sebastian Redlf30208a2009-01-24 21:16:55 +00001795 QualType ClsType;
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001796 if (SS.isInvalid()) {
Jeffrey Yasskinedc28772010-04-07 23:29:58 +00001797 // Avoid emitting extra errors if we already errored on the scope.
1798 D.setInvalidType(true);
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001799 } else if (isDependentScopeSpecifier(SS) ||
1800 dyn_cast_or_null<CXXRecordDecl>(computeDeclContext(SS))) {
Mike Stump1eb44332009-09-09 15:08:12 +00001801 NestedNameSpecifier *NNS
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001802 = static_cast<NestedNameSpecifier*>(SS.getScopeRep());
Douglas Gregor87c12c42009-11-04 16:49:01 +00001803 NestedNameSpecifier *NNSPrefix = NNS->getPrefix();
1804 switch (NNS->getKind()) {
1805 case NestedNameSpecifier::Identifier:
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001806 ClsType = Context.getDependentNameType(ETK_None, NNSPrefix,
Douglas Gregor4a2023f2010-03-31 20:19:30 +00001807 NNS->getAsIdentifier());
Douglas Gregor87c12c42009-11-04 16:49:01 +00001808 break;
1809
1810 case NestedNameSpecifier::Namespace:
1811 case NestedNameSpecifier::Global:
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +00001812 llvm_unreachable("Nested-name-specifier must name a type");
Douglas Gregor87c12c42009-11-04 16:49:01 +00001813 break;
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001814
Douglas Gregor87c12c42009-11-04 16:49:01 +00001815 case NestedNameSpecifier::TypeSpec:
1816 case NestedNameSpecifier::TypeSpecWithTemplate:
1817 ClsType = QualType(NNS->getAsType(), 0);
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001818 // Note: if NNS is dependent, then its prefix (if any) is already
1819 // included in ClsType; this does not hold if the NNS is
1820 // nondependent: in this case (if there is indeed a prefix)
1821 // ClsType needs to be wrapped into an elaborated type.
1822 if (NNSPrefix && !NNS->isDependent())
1823 ClsType = Context.getElaboratedType(ETK_None, NNSPrefix, ClsType);
Douglas Gregor87c12c42009-11-04 16:49:01 +00001824 break;
1825 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001826 } else {
Douglas Gregor949bf692009-06-09 22:17:39 +00001827 Diag(DeclType.Mem.Scope().getBeginLoc(),
1828 diag::err_illegal_decl_mempointer_in_nonclass)
1829 << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name")
1830 << DeclType.Mem.Scope().getRange();
Sebastian Redlf30208a2009-01-24 21:16:55 +00001831 D.setInvalidType(true);
Sebastian Redlf30208a2009-01-24 21:16:55 +00001832 }
1833
Douglas Gregor949bf692009-06-09 22:17:39 +00001834 if (!ClsType.isNull())
John McCall28654742010-06-05 06:41:15 +00001835 T = BuildMemberPointerType(T, ClsType, DeclType.Loc, D.getIdentifier());
Douglas Gregor949bf692009-06-09 22:17:39 +00001836 if (T.isNull()) {
1837 T = Context.IntTy;
Sebastian Redlf30208a2009-01-24 21:16:55 +00001838 D.setInvalidType(true);
John McCall28654742010-06-05 06:41:15 +00001839 } else if (DeclType.Mem.TypeQuals) {
1840 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Mem.TypeQuals);
Sebastian Redlf30208a2009-01-24 21:16:55 +00001841 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001842 break;
1843 }
1844
Douglas Gregorcd281c32009-02-28 00:25:32 +00001845 if (T.isNull()) {
1846 D.setInvalidType(true);
1847 T = Context.IntTy;
1848 }
1849
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001850 // See if there are any attributes on this declarator chunk.
John McCall711c52b2011-01-05 12:14:39 +00001851 if (AttributeList *attrs = const_cast<AttributeList*>(DeclType.getAttrs()))
1852 processTypeAttrs(state, T, false, attrs);
Reid Spencer5f016e22007-07-11 17:01:13 +00001853 }
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001854
1855 if (getLangOptions().CPlusPlus && T->isFunctionType()) {
John McCall183700f2009-09-21 23:43:11 +00001856 const FunctionProtoType *FnTy = T->getAs<FunctionProtoType>();
Chris Lattner778ed742009-10-25 17:36:50 +00001857 assert(FnTy && "Why oh why is there not a FunctionProtoType here?");
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001858
Douglas Gregor708f3b82010-10-14 22:03:51 +00001859 // C++ 8.3.5p4:
1860 // A cv-qualifier-seq shall only be part of the function type
1861 // for a nonstatic member function, the function type to which a pointer
1862 // to member refers, or the top-level function type of a function typedef
1863 // declaration.
John McCall613ef3d2010-10-19 01:54:45 +00001864 bool FreeFunction;
1865 if (!D.getCXXScopeSpec().isSet()) {
1866 FreeFunction = (D.getContext() != Declarator::MemberContext ||
1867 D.getDeclSpec().isFriendSpecified());
1868 } else {
1869 DeclContext *DC = computeDeclContext(D.getCXXScopeSpec());
1870 FreeFunction = (DC && !DC->isRecord());
1871 }
1872
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001873 if (FnTy->getTypeQuals() != 0 &&
1874 D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
Sebastian Redlc61bb202010-07-09 21:26:08 +00001875 (FreeFunction ||
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001876 D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static)) {
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001877 if (D.isFunctionDeclarator())
1878 Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_function_type);
1879 else
1880 Diag(D.getIdentifierLoc(),
Sebastian Redlc61bb202010-07-09 21:26:08 +00001881 diag::err_invalid_qualified_typedef_function_type_use)
1882 << FreeFunction;
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001883
1884 // Strip the cv-quals from the type.
John McCalle23cf432010-12-14 08:05:40 +00001885 FunctionProtoType::ExtProtoInfo EPI = FnTy->getExtProtoInfo();
1886 EPI.TypeQuals = 0;
1887
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001888 T = Context.getFunctionType(FnTy->getResultType(), FnTy->arg_type_begin(),
John McCalle23cf432010-12-14 08:05:40 +00001889 FnTy->getNumArgs(), EPI);
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001890 }
1891 }
Mike Stump1eb44332009-09-09 15:08:12 +00001892
John McCall711c52b2011-01-05 12:14:39 +00001893 // Apply any undistributed attributes from the declarator.
1894 if (!T.isNull())
1895 if (AttributeList *attrs = D.getAttributes())
1896 processTypeAttrs(state, T, false, attrs);
1897
1898 // Diagnose any ignored type attributes.
1899 if (!T.isNull()) state.diagnoseIgnoredTypeAttrs(T);
1900
Sebastian Redl73780122010-06-09 21:19:43 +00001901 // If there's a constexpr specifier, treat it as a top-level const.
1902 if (D.getDeclSpec().isConstexprSpecified()) {
1903 T.addConst();
1904 }
1905
Douglas Gregora8bc8c92010-12-23 22:44:42 +00001906 // If there was an ellipsis in the declarator, the declaration declares a
1907 // parameter pack whose type may be a pack expansion type.
1908 if (D.hasEllipsis() && !T.isNull()) {
1909 // C++0x [dcl.fct]p13:
1910 // A declarator-id or abstract-declarator containing an ellipsis shall
1911 // only be used in a parameter-declaration. Such a parameter-declaration
1912 // is a parameter pack (14.5.3). [...]
1913 switch (D.getContext()) {
1914 case Declarator::PrototypeContext:
1915 // C++0x [dcl.fct]p13:
1916 // [...] When it is part of a parameter-declaration-clause, the
1917 // parameter pack is a function parameter pack (14.5.3). The type T
1918 // of the declarator-id of the function parameter pack shall contain
1919 // a template parameter pack; each template parameter pack in T is
1920 // expanded by the function parameter pack.
1921 //
1922 // We represent function parameter packs as function parameters whose
1923 // type is a pack expansion.
1924 if (!T->containsUnexpandedParameterPack()) {
1925 Diag(D.getEllipsisLoc(),
1926 diag::err_function_parameter_pack_without_parameter_packs)
1927 << T << D.getSourceRange();
1928 D.setEllipsisLoc(SourceLocation());
1929 } else {
Douglas Gregorcded4f62011-01-14 17:04:44 +00001930 T = Context.getPackExpansionType(T, llvm::Optional<unsigned>());
Douglas Gregora8bc8c92010-12-23 22:44:42 +00001931 }
1932 break;
1933
1934 case Declarator::TemplateParamContext:
1935 // C++0x [temp.param]p15:
1936 // If a template-parameter is a [...] is a parameter-declaration that
1937 // declares a parameter pack (8.3.5), then the template-parameter is a
1938 // template parameter pack (14.5.3).
1939 //
1940 // Note: core issue 778 clarifies that, if there are any unexpanded
1941 // parameter packs in the type of the non-type template parameter, then
1942 // it expands those parameter packs.
1943 if (T->containsUnexpandedParameterPack())
Douglas Gregorcded4f62011-01-14 17:04:44 +00001944 T = Context.getPackExpansionType(T, llvm::Optional<unsigned>());
Douglas Gregor10738d32010-12-23 23:51:58 +00001945 else if (!getLangOptions().CPlusPlus0x)
1946 Diag(D.getEllipsisLoc(), diag::err_variadic_templates);
Douglas Gregora8bc8c92010-12-23 22:44:42 +00001947 break;
1948
1949 case Declarator::FileContext:
1950 case Declarator::KNRTypeListContext:
1951 case Declarator::TypeNameContext:
1952 case Declarator::MemberContext:
1953 case Declarator::BlockContext:
1954 case Declarator::ForContext:
1955 case Declarator::ConditionContext:
1956 case Declarator::CXXCatchContext:
1957 case Declarator::BlockLiteralContext:
1958 // FIXME: We may want to allow parameter packs in block-literal contexts
1959 // in the future.
1960 Diag(D.getEllipsisLoc(), diag::err_ellipsis_in_declarator_not_parameter);
1961 D.setEllipsisLoc(SourceLocation());
1962 break;
1963 }
1964 }
1965
John McCallbf1a0282010-06-04 23:28:52 +00001966 if (T.isNull())
1967 return Context.getNullTypeSourceInfo();
1968 else if (D.isInvalidType())
1969 return Context.getTrivialTypeSourceInfo(T);
1970 return GetTypeSourceInfoForDeclarator(D, T, ReturnTypeInfo);
Reid Spencer5f016e22007-07-11 17:01:13 +00001971}
1972
John McCall51bd8032009-10-18 01:05:36 +00001973namespace {
1974 class TypeSpecLocFiller : public TypeLocVisitor<TypeSpecLocFiller> {
1975 const DeclSpec &DS;
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00001976
John McCall51bd8032009-10-18 01:05:36 +00001977 public:
1978 TypeSpecLocFiller(const DeclSpec &DS) : DS(DS) {}
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00001979
John McCall51bd8032009-10-18 01:05:36 +00001980 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
1981 Visit(TL.getUnqualifiedLoc());
1982 }
1983 void VisitTypedefTypeLoc(TypedefTypeLoc TL) {
1984 TL.setNameLoc(DS.getTypeSpecTypeLoc());
1985 }
1986 void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
1987 TL.setNameLoc(DS.getTypeSpecTypeLoc());
John McCallc12c5bb2010-05-15 11:32:37 +00001988 }
1989 void VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
1990 // Handle the base type, which might not have been written explicitly.
1991 if (DS.getTypeSpecType() == DeclSpec::TST_unspecified) {
1992 TL.setHasBaseTypeAsWritten(false);
1993 TL.getBaseLoc().initialize(SourceLocation());
1994 } else {
1995 TL.setHasBaseTypeAsWritten(true);
1996 Visit(TL.getBaseLoc());
1997 }
Argyrios Kyrtzidiseb667592009-09-29 19:45:22 +00001998
John McCallc12c5bb2010-05-15 11:32:37 +00001999 // Protocol qualifiers.
John McCall54e14c42009-10-22 22:37:11 +00002000 if (DS.getProtocolQualifiers()) {
2001 assert(TL.getNumProtocols() > 0);
2002 assert(TL.getNumProtocols() == DS.getNumProtocolQualifiers());
2003 TL.setLAngleLoc(DS.getProtocolLAngleLoc());
2004 TL.setRAngleLoc(DS.getSourceRange().getEnd());
2005 for (unsigned i = 0, e = DS.getNumProtocolQualifiers(); i != e; ++i)
2006 TL.setProtocolLoc(i, DS.getProtocolLocs()[i]);
2007 } else {
2008 assert(TL.getNumProtocols() == 0);
2009 TL.setLAngleLoc(SourceLocation());
2010 TL.setRAngleLoc(SourceLocation());
2011 }
2012 }
2013 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
John McCall54e14c42009-10-22 22:37:11 +00002014 TL.setStarLoc(SourceLocation());
John McCallc12c5bb2010-05-15 11:32:37 +00002015 Visit(TL.getPointeeLoc());
John McCall51bd8032009-10-18 01:05:36 +00002016 }
John McCall833ca992009-10-29 08:12:44 +00002017 void VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
John McCalla93c9342009-12-07 02:54:59 +00002018 TypeSourceInfo *TInfo = 0;
John McCallb3d87482010-08-24 05:47:05 +00002019 Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
John McCall833ca992009-10-29 08:12:44 +00002020
2021 // If we got no declarator info from previous Sema routines,
2022 // just fill with the typespec loc.
John McCalla93c9342009-12-07 02:54:59 +00002023 if (!TInfo) {
John McCall833ca992009-10-29 08:12:44 +00002024 TL.initialize(DS.getTypeSpecTypeLoc());
2025 return;
2026 }
2027
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002028 TypeLoc OldTL = TInfo->getTypeLoc();
2029 if (TInfo->getType()->getAs<ElaboratedType>()) {
2030 ElaboratedTypeLoc ElabTL = cast<ElaboratedTypeLoc>(OldTL);
2031 TemplateSpecializationTypeLoc NamedTL =
2032 cast<TemplateSpecializationTypeLoc>(ElabTL.getNamedTypeLoc());
2033 TL.copy(NamedTL);
2034 }
2035 else
2036 TL.copy(cast<TemplateSpecializationTypeLoc>(OldTL));
John McCall833ca992009-10-29 08:12:44 +00002037 }
John McCallcfb708c2010-01-13 20:03:27 +00002038 void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
2039 assert(DS.getTypeSpecType() == DeclSpec::TST_typeofExpr);
2040 TL.setTypeofLoc(DS.getTypeSpecTypeLoc());
2041 TL.setParensRange(DS.getTypeofParensRange());
2042 }
2043 void VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
2044 assert(DS.getTypeSpecType() == DeclSpec::TST_typeofType);
2045 TL.setTypeofLoc(DS.getTypeSpecTypeLoc());
2046 TL.setParensRange(DS.getTypeofParensRange());
John McCallb3d87482010-08-24 05:47:05 +00002047 assert(DS.getRepAsType());
John McCallcfb708c2010-01-13 20:03:27 +00002048 TypeSourceInfo *TInfo = 0;
John McCallb3d87482010-08-24 05:47:05 +00002049 Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
John McCallcfb708c2010-01-13 20:03:27 +00002050 TL.setUnderlyingTInfo(TInfo);
2051 }
Douglas Gregorddf889a2010-01-18 18:04:31 +00002052 void VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
2053 // By default, use the source location of the type specifier.
2054 TL.setBuiltinLoc(DS.getTypeSpecTypeLoc());
2055 if (TL.needsExtraLocalData()) {
2056 // Set info for the written builtin specifiers.
2057 TL.getWrittenBuiltinSpecs() = DS.getWrittenBuiltinSpecs();
2058 // Try to have a meaningful source location.
2059 if (TL.getWrittenSignSpec() != TSS_unspecified)
2060 // Sign spec loc overrides the others (e.g., 'unsigned long').
2061 TL.setBuiltinLoc(DS.getTypeSpecSignLoc());
2062 else if (TL.getWrittenWidthSpec() != TSW_unspecified)
2063 // Width spec loc overrides type spec loc (e.g., 'short int').
2064 TL.setBuiltinLoc(DS.getTypeSpecWidthLoc());
2065 }
2066 }
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002067 void VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
2068 ElaboratedTypeKeyword Keyword
2069 = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
Nico Weber253e80b2010-11-22 10:30:56 +00002070 if (DS.getTypeSpecType() == TST_typename) {
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002071 TypeSourceInfo *TInfo = 0;
John McCallb3d87482010-08-24 05:47:05 +00002072 Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002073 if (TInfo) {
2074 TL.copy(cast<ElaboratedTypeLoc>(TInfo->getTypeLoc()));
2075 return;
2076 }
2077 }
2078 TL.setKeywordLoc(Keyword != ETK_None
2079 ? DS.getTypeSpecTypeLoc()
2080 : SourceLocation());
2081 const CXXScopeSpec& SS = DS.getTypeSpecScope();
2082 TL.setQualifierRange(SS.isEmpty() ? SourceRange(): SS.getRange());
2083 Visit(TL.getNextTypeLoc().getUnqualifiedLoc());
2084 }
2085 void VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
2086 ElaboratedTypeKeyword Keyword
2087 = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
Nico Weber253e80b2010-11-22 10:30:56 +00002088 if (DS.getTypeSpecType() == TST_typename) {
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002089 TypeSourceInfo *TInfo = 0;
John McCallb3d87482010-08-24 05:47:05 +00002090 Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002091 if (TInfo) {
2092 TL.copy(cast<DependentNameTypeLoc>(TInfo->getTypeLoc()));
2093 return;
2094 }
2095 }
2096 TL.setKeywordLoc(Keyword != ETK_None
2097 ? DS.getTypeSpecTypeLoc()
2098 : SourceLocation());
2099 const CXXScopeSpec& SS = DS.getTypeSpecScope();
2100 TL.setQualifierRange(SS.isEmpty() ? SourceRange() : SS.getRange());
2101 // FIXME: load appropriate source location.
2102 TL.setNameLoc(DS.getTypeSpecTypeLoc());
2103 }
John McCall33500952010-06-11 00:33:02 +00002104 void VisitDependentTemplateSpecializationTypeLoc(
2105 DependentTemplateSpecializationTypeLoc TL) {
2106 ElaboratedTypeKeyword Keyword
2107 = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
2108 if (Keyword == ETK_Typename) {
2109 TypeSourceInfo *TInfo = 0;
John McCallb3d87482010-08-24 05:47:05 +00002110 Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
John McCall33500952010-06-11 00:33:02 +00002111 if (TInfo) {
2112 TL.copy(cast<DependentTemplateSpecializationTypeLoc>(
2113 TInfo->getTypeLoc()));
2114 return;
2115 }
2116 }
2117 TL.initializeLocal(SourceLocation());
2118 TL.setKeywordLoc(Keyword != ETK_None
2119 ? DS.getTypeSpecTypeLoc()
2120 : SourceLocation());
2121 const CXXScopeSpec& SS = DS.getTypeSpecScope();
2122 TL.setQualifierRange(SS.isEmpty() ? SourceRange() : SS.getRange());
2123 // FIXME: load appropriate source location.
2124 TL.setNameLoc(DS.getTypeSpecTypeLoc());
2125 }
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002126
John McCall51bd8032009-10-18 01:05:36 +00002127 void VisitTypeLoc(TypeLoc TL) {
2128 // FIXME: add other typespec types and change this to an assert.
2129 TL.initialize(DS.getTypeSpecTypeLoc());
2130 }
2131 };
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00002132
John McCall51bd8032009-10-18 01:05:36 +00002133 class DeclaratorLocFiller : public TypeLocVisitor<DeclaratorLocFiller> {
2134 const DeclaratorChunk &Chunk;
2135
2136 public:
2137 DeclaratorLocFiller(const DeclaratorChunk &Chunk) : Chunk(Chunk) {}
2138
2139 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +00002140 llvm_unreachable("qualified type locs not expected here!");
John McCall51bd8032009-10-18 01:05:36 +00002141 }
2142
2143 void VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
2144 assert(Chunk.Kind == DeclaratorChunk::BlockPointer);
2145 TL.setCaretLoc(Chunk.Loc);
2146 }
2147 void VisitPointerTypeLoc(PointerTypeLoc TL) {
2148 assert(Chunk.Kind == DeclaratorChunk::Pointer);
2149 TL.setStarLoc(Chunk.Loc);
2150 }
2151 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
2152 assert(Chunk.Kind == DeclaratorChunk::Pointer);
2153 TL.setStarLoc(Chunk.Loc);
2154 }
2155 void VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
2156 assert(Chunk.Kind == DeclaratorChunk::MemberPointer);
2157 TL.setStarLoc(Chunk.Loc);
2158 // FIXME: nested name specifier
2159 }
2160 void VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
2161 assert(Chunk.Kind == DeclaratorChunk::Reference);
John McCall54e14c42009-10-22 22:37:11 +00002162 // 'Amp' is misleading: this might have been originally
2163 /// spelled with AmpAmp.
John McCall51bd8032009-10-18 01:05:36 +00002164 TL.setAmpLoc(Chunk.Loc);
2165 }
2166 void VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
2167 assert(Chunk.Kind == DeclaratorChunk::Reference);
2168 assert(!Chunk.Ref.LValueRef);
2169 TL.setAmpAmpLoc(Chunk.Loc);
2170 }
2171 void VisitArrayTypeLoc(ArrayTypeLoc TL) {
2172 assert(Chunk.Kind == DeclaratorChunk::Array);
2173 TL.setLBracketLoc(Chunk.Loc);
2174 TL.setRBracketLoc(Chunk.EndLoc);
2175 TL.setSizeExpr(static_cast<Expr*>(Chunk.Arr.NumElts));
2176 }
2177 void VisitFunctionTypeLoc(FunctionTypeLoc TL) {
2178 assert(Chunk.Kind == DeclaratorChunk::Function);
2179 TL.setLParenLoc(Chunk.Loc);
2180 TL.setRParenLoc(Chunk.EndLoc);
Douglas Gregordab60ad2010-10-01 18:44:50 +00002181 TL.setTrailingReturn(!!Chunk.Fun.TrailingReturnType);
John McCall51bd8032009-10-18 01:05:36 +00002182
2183 const DeclaratorChunk::FunctionTypeInfo &FTI = Chunk.Fun;
John McCall54e14c42009-10-22 22:37:11 +00002184 for (unsigned i = 0, e = TL.getNumArgs(), tpi = 0; i != e; ++i) {
John McCalld226f652010-08-21 09:40:31 +00002185 ParmVarDecl *Param = cast<ParmVarDecl>(FTI.ArgInfo[i].Param);
John McCall54e14c42009-10-22 22:37:11 +00002186 TL.setArg(tpi++, Param);
John McCall51bd8032009-10-18 01:05:36 +00002187 }
2188 // FIXME: exception specs
2189 }
Abramo Bagnara075f8f12010-12-10 16:29:40 +00002190 void VisitParenTypeLoc(ParenTypeLoc TL) {
2191 assert(Chunk.Kind == DeclaratorChunk::Paren);
2192 TL.setLParenLoc(Chunk.Loc);
2193 TL.setRParenLoc(Chunk.EndLoc);
2194 }
John McCall51bd8032009-10-18 01:05:36 +00002195
2196 void VisitTypeLoc(TypeLoc TL) {
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +00002197 llvm_unreachable("unsupported TypeLoc kind in declarator!");
John McCall51bd8032009-10-18 01:05:36 +00002198 }
2199 };
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00002200}
2201
John McCalla93c9342009-12-07 02:54:59 +00002202/// \brief Create and instantiate a TypeSourceInfo with type source information.
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00002203///
2204/// \param T QualType referring to the type as written in source code.
Douglas Gregor05baacb2010-04-12 23:19:01 +00002205///
2206/// \param ReturnTypeInfo For declarators whose return type does not show
2207/// up in the normal place in the declaration specifiers (such as a C++
2208/// conversion function), this pointer will refer to a type source information
2209/// for that return type.
John McCalla93c9342009-12-07 02:54:59 +00002210TypeSourceInfo *
Douglas Gregor05baacb2010-04-12 23:19:01 +00002211Sema::GetTypeSourceInfoForDeclarator(Declarator &D, QualType T,
2212 TypeSourceInfo *ReturnTypeInfo) {
John McCalla93c9342009-12-07 02:54:59 +00002213 TypeSourceInfo *TInfo = Context.CreateTypeSourceInfo(T);
2214 UnqualTypeLoc CurrTL = TInfo->getTypeLoc().getUnqualifiedLoc();
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00002215
Douglas Gregora8bc8c92010-12-23 22:44:42 +00002216 // Handle parameter packs whose type is a pack expansion.
2217 if (isa<PackExpansionType>(T)) {
2218 cast<PackExpansionTypeLoc>(CurrTL).setEllipsisLoc(D.getEllipsisLoc());
2219 CurrTL = CurrTL.getNextTypeLoc().getUnqualifiedLoc();
2220 }
2221
Sebastian Redl8ce35b02009-10-25 21:45:37 +00002222 for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
John McCall51bd8032009-10-18 01:05:36 +00002223 DeclaratorLocFiller(D.getTypeObject(i)).Visit(CurrTL);
2224 CurrTL = CurrTL.getNextTypeLoc().getUnqualifiedLoc();
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00002225 }
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00002226
John McCallb3d87482010-08-24 05:47:05 +00002227 // If we have different source information for the return type, use
2228 // that. This really only applies to C++ conversion functions.
2229 if (ReturnTypeInfo) {
Douglas Gregor05baacb2010-04-12 23:19:01 +00002230 TypeLoc TL = ReturnTypeInfo->getTypeLoc();
2231 assert(TL.getFullDataSize() == CurrTL.getFullDataSize());
2232 memcpy(CurrTL.getOpaqueData(), TL.getOpaqueData(), TL.getFullDataSize());
John McCallb3d87482010-08-24 05:47:05 +00002233 } else {
2234 TypeSpecLocFiller(D.getDeclSpec()).Visit(CurrTL);
Douglas Gregor05baacb2010-04-12 23:19:01 +00002235 }
2236
John McCalla93c9342009-12-07 02:54:59 +00002237 return TInfo;
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00002238}
2239
John McCalla93c9342009-12-07 02:54:59 +00002240/// \brief Create a LocInfoType to hold the given QualType and TypeSourceInfo.
John McCallb3d87482010-08-24 05:47:05 +00002241ParsedType Sema::CreateParsedType(QualType T, TypeSourceInfo *TInfo) {
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00002242 // FIXME: LocInfoTypes are "transient", only needed for passing to/from Parser
2243 // and Sema during declaration parsing. Try deallocating/caching them when
2244 // it's appropriate, instead of allocating them and keeping them around.
Douglas Gregoreb0eb492010-12-10 08:12:03 +00002245 LocInfoType *LocT = (LocInfoType*)BumpAlloc.Allocate(sizeof(LocInfoType),
2246 TypeAlignment);
John McCalla93c9342009-12-07 02:54:59 +00002247 new (LocT) LocInfoType(T, TInfo);
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00002248 assert(LocT->getTypeClass() != T->getTypeClass() &&
2249 "LocInfoType's TypeClass conflicts with an existing Type class");
John McCallb3d87482010-08-24 05:47:05 +00002250 return ParsedType::make(QualType(LocT, 0));
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00002251}
2252
2253void LocInfoType::getAsStringInternal(std::string &Str,
2254 const PrintingPolicy &Policy) const {
Argyrios Kyrtzidis35d44e52009-08-19 01:46:06 +00002255 assert(false && "LocInfoType leaked into the type system; an opaque TypeTy*"
2256 " was used directly instead of getting the QualType through"
2257 " GetTypeFromParser");
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00002258}
2259
John McCallf312b1e2010-08-26 23:41:50 +00002260TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) {
Reid Spencer5f016e22007-07-11 17:01:13 +00002261 // C99 6.7.6: Type names have no identifier. This is already validated by
2262 // the parser.
2263 assert(D.getIdentifier() == 0 && "Type name should have no identifier!");
Mike Stump1eb44332009-09-09 15:08:12 +00002264
Douglas Gregor402abb52009-05-28 23:31:59 +00002265 TagDecl *OwnedTag = 0;
John McCallbf1a0282010-06-04 23:28:52 +00002266 TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedTag);
2267 QualType T = TInfo->getType();
Chris Lattner5153ee62009-04-25 08:47:54 +00002268 if (D.isInvalidType())
Douglas Gregor809070a2009-02-18 17:45:20 +00002269 return true;
Steve Naroff5912a352007-08-28 20:14:24 +00002270
Douglas Gregor402abb52009-05-28 23:31:59 +00002271 if (getLangOptions().CPlusPlus) {
2272 // Check that there are no default arguments (C++ only).
Douglas Gregor6d6eb572008-05-07 04:49:29 +00002273 CheckExtraCXXDefaultArguments(D);
2274
Douglas Gregor402abb52009-05-28 23:31:59 +00002275 // C++0x [dcl.type]p3:
2276 // A type-specifier-seq shall not define a class or enumeration
2277 // unless it appears in the type-id of an alias-declaration
2278 // (7.1.3).
2279 if (OwnedTag && OwnedTag->isDefinition())
2280 Diag(OwnedTag->getLocation(), diag::err_type_defined_in_type_specifier)
2281 << Context.getTypeDeclType(OwnedTag);
2282 }
2283
John McCallb3d87482010-08-24 05:47:05 +00002284 return CreateParsedType(T, TInfo);
Reid Spencer5f016e22007-07-11 17:01:13 +00002285}
2286
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002287
2288
2289//===----------------------------------------------------------------------===//
2290// Type Attribute Processing
2291//===----------------------------------------------------------------------===//
2292
2293/// HandleAddressSpaceTypeAttribute - Process an address_space attribute on the
2294/// specified type. The attribute contains 1 argument, the id of the address
2295/// space for the type.
Mike Stump1eb44332009-09-09 15:08:12 +00002296static void HandleAddressSpaceTypeAttribute(QualType &Type,
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002297 const AttributeList &Attr, Sema &S){
John McCall0953e762009-09-24 19:53:00 +00002298
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002299 // If this type is already address space qualified, reject it.
2300 // Clause 6.7.3 - Type qualifiers: "No type shall be qualified by qualifiers
2301 // for two or more different address spaces."
2302 if (Type.getAddressSpace()) {
2303 S.Diag(Attr.getLoc(), diag::err_attribute_address_multiple_qualifiers);
Abramo Bagnarae215f722010-04-30 13:10:51 +00002304 Attr.setInvalid();
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002305 return;
2306 }
Mike Stump1eb44332009-09-09 15:08:12 +00002307
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002308 // Check the attribute arguments.
2309 if (Attr.getNumArgs() != 1) {
Chris Lattnerf3a41af2008-11-20 06:38:18 +00002310 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
Abramo Bagnarae215f722010-04-30 13:10:51 +00002311 Attr.setInvalid();
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002312 return;
2313 }
2314 Expr *ASArgExpr = static_cast<Expr *>(Attr.getArg(0));
2315 llvm::APSInt addrSpace(32);
Douglas Gregorac06a0e2010-05-18 23:01:22 +00002316 if (ASArgExpr->isTypeDependent() || ASArgExpr->isValueDependent() ||
2317 !ASArgExpr->isIntegerConstantExpr(addrSpace, S.Context)) {
Chris Lattnerdcd5ef12008-11-19 05:27:50 +00002318 S.Diag(Attr.getLoc(), diag::err_attribute_address_space_not_int)
2319 << ASArgExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002320 Attr.setInvalid();
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002321 return;
2322 }
2323
John McCallefadb772009-07-28 06:52:18 +00002324 // Bounds checking.
2325 if (addrSpace.isSigned()) {
2326 if (addrSpace.isNegative()) {
2327 S.Diag(Attr.getLoc(), diag::err_attribute_address_space_negative)
2328 << ASArgExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002329 Attr.setInvalid();
John McCallefadb772009-07-28 06:52:18 +00002330 return;
2331 }
2332 addrSpace.setIsSigned(false);
2333 }
2334 llvm::APSInt max(addrSpace.getBitWidth());
John McCall0953e762009-09-24 19:53:00 +00002335 max = Qualifiers::MaxAddressSpace;
John McCallefadb772009-07-28 06:52:18 +00002336 if (addrSpace > max) {
2337 S.Diag(Attr.getLoc(), diag::err_attribute_address_space_too_high)
John McCall0953e762009-09-24 19:53:00 +00002338 << Qualifiers::MaxAddressSpace << ASArgExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002339 Attr.setInvalid();
John McCallefadb772009-07-28 06:52:18 +00002340 return;
2341 }
2342
Mike Stump1eb44332009-09-09 15:08:12 +00002343 unsigned ASIdx = static_cast<unsigned>(addrSpace.getZExtValue());
Fariborz Jahanianf11284a2009-02-17 18:27:45 +00002344 Type = S.Context.getAddrSpaceQualType(Type, ASIdx);
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002345}
2346
John McCall711c52b2011-01-05 12:14:39 +00002347/// handleObjCGCTypeAttr - Process the __attribute__((objc_gc)) type
2348/// attribute on the specified type. Returns true to indicate that
2349/// the attribute was handled, false to indicate that the type does
2350/// not permit the attribute.
2351static bool handleObjCGCTypeAttr(TypeProcessingState &state,
2352 AttributeList &attr,
2353 QualType &type) {
2354 Sema &S = state.getSema();
2355
2356 // Delay if this isn't some kind of pointer.
2357 if (!type->isPointerType() &&
2358 !type->isObjCObjectPointerType() &&
2359 !type->isBlockPointerType())
2360 return false;
2361
2362 if (type.getObjCGCAttr() != Qualifiers::GCNone) {
2363 S.Diag(attr.getLoc(), diag::err_attribute_multiple_objc_gc);
2364 attr.setInvalid();
2365 return true;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002366 }
Mike Stump1eb44332009-09-09 15:08:12 +00002367
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002368 // Check the attribute arguments.
John McCall711c52b2011-01-05 12:14:39 +00002369 if (!attr.getParameterName()) {
2370 S.Diag(attr.getLoc(), diag::err_attribute_argument_n_not_string)
Fariborz Jahanianba372b82009-02-18 17:52:36 +00002371 << "objc_gc" << 1;
John McCall711c52b2011-01-05 12:14:39 +00002372 attr.setInvalid();
2373 return true;
Fariborz Jahanianba372b82009-02-18 17:52:36 +00002374 }
John McCall0953e762009-09-24 19:53:00 +00002375 Qualifiers::GC GCAttr;
John McCall711c52b2011-01-05 12:14:39 +00002376 if (attr.getNumArgs() != 0) {
2377 S.Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
2378 attr.setInvalid();
2379 return true;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002380 }
John McCall711c52b2011-01-05 12:14:39 +00002381 if (attr.getParameterName()->isStr("weak"))
John McCall0953e762009-09-24 19:53:00 +00002382 GCAttr = Qualifiers::Weak;
John McCall711c52b2011-01-05 12:14:39 +00002383 else if (attr.getParameterName()->isStr("strong"))
John McCall0953e762009-09-24 19:53:00 +00002384 GCAttr = Qualifiers::Strong;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002385 else {
John McCall711c52b2011-01-05 12:14:39 +00002386 S.Diag(attr.getLoc(), diag::warn_attribute_type_not_supported)
2387 << "objc_gc" << attr.getParameterName();
2388 attr.setInvalid();
2389 return true;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002390 }
Mike Stump1eb44332009-09-09 15:08:12 +00002391
John McCall711c52b2011-01-05 12:14:39 +00002392 type = S.Context.getObjCGCQualType(type, GCAttr);
2393 return true;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002394}
2395
John McCalle6a365d2010-12-19 02:44:49 +00002396namespace {
2397 /// A helper class to unwrap a type down to a function for the
2398 /// purposes of applying attributes there.
2399 ///
2400 /// Use:
2401 /// FunctionTypeUnwrapper unwrapped(SemaRef, T);
2402 /// if (unwrapped.isFunctionType()) {
2403 /// const FunctionType *fn = unwrapped.get();
2404 /// // change fn somehow
2405 /// T = unwrapped.wrap(fn);
2406 /// }
2407 struct FunctionTypeUnwrapper {
2408 enum WrapKind {
2409 Desugar,
2410 Parens,
2411 Pointer,
2412 BlockPointer,
2413 Reference,
2414 MemberPointer
2415 };
2416
2417 QualType Original;
2418 const FunctionType *Fn;
2419 llvm::SmallVector<unsigned char /*WrapKind*/, 8> Stack;
2420
2421 FunctionTypeUnwrapper(Sema &S, QualType T) : Original(T) {
2422 while (true) {
2423 const Type *Ty = T.getTypePtr();
2424 if (isa<FunctionType>(Ty)) {
2425 Fn = cast<FunctionType>(Ty);
2426 return;
2427 } else if (isa<ParenType>(Ty)) {
2428 T = cast<ParenType>(Ty)->getInnerType();
2429 Stack.push_back(Parens);
2430 } else if (isa<PointerType>(Ty)) {
2431 T = cast<PointerType>(Ty)->getPointeeType();
2432 Stack.push_back(Pointer);
2433 } else if (isa<BlockPointerType>(Ty)) {
2434 T = cast<BlockPointerType>(Ty)->getPointeeType();
2435 Stack.push_back(BlockPointer);
2436 } else if (isa<MemberPointerType>(Ty)) {
2437 T = cast<MemberPointerType>(Ty)->getPointeeType();
2438 Stack.push_back(MemberPointer);
2439 } else if (isa<ReferenceType>(Ty)) {
2440 T = cast<ReferenceType>(Ty)->getPointeeType();
2441 Stack.push_back(Reference);
2442 } else {
2443 const Type *DTy = Ty->getUnqualifiedDesugaredType();
2444 if (Ty == DTy) {
2445 Fn = 0;
2446 return;
2447 }
2448
2449 T = QualType(DTy, 0);
2450 Stack.push_back(Desugar);
2451 }
2452 }
2453 }
2454
2455 bool isFunctionType() const { return (Fn != 0); }
2456 const FunctionType *get() const { return Fn; }
2457
2458 QualType wrap(Sema &S, const FunctionType *New) {
2459 // If T wasn't modified from the unwrapped type, do nothing.
2460 if (New == get()) return Original;
2461
2462 Fn = New;
2463 return wrap(S.Context, Original, 0);
2464 }
2465
2466 private:
2467 QualType wrap(ASTContext &C, QualType Old, unsigned I) {
2468 if (I == Stack.size())
2469 return C.getQualifiedType(Fn, Old.getQualifiers());
2470
2471 // Build up the inner type, applying the qualifiers from the old
2472 // type to the new type.
2473 SplitQualType SplitOld = Old.split();
2474
2475 // As a special case, tail-recurse if there are no qualifiers.
2476 if (SplitOld.second.empty())
2477 return wrap(C, SplitOld.first, I);
2478 return C.getQualifiedType(wrap(C, SplitOld.first, I), SplitOld.second);
2479 }
2480
2481 QualType wrap(ASTContext &C, const Type *Old, unsigned I) {
2482 if (I == Stack.size()) return QualType(Fn, 0);
2483
2484 switch (static_cast<WrapKind>(Stack[I++])) {
2485 case Desugar:
2486 // This is the point at which we potentially lose source
2487 // information.
2488 return wrap(C, Old->getUnqualifiedDesugaredType(), I);
2489
2490 case Parens: {
2491 QualType New = wrap(C, cast<ParenType>(Old)->getInnerType(), I);
2492 return C.getParenType(New);
2493 }
2494
2495 case Pointer: {
2496 QualType New = wrap(C, cast<PointerType>(Old)->getPointeeType(), I);
2497 return C.getPointerType(New);
2498 }
2499
2500 case BlockPointer: {
2501 QualType New = wrap(C, cast<BlockPointerType>(Old)->getPointeeType(),I);
2502 return C.getBlockPointerType(New);
2503 }
2504
2505 case MemberPointer: {
2506 const MemberPointerType *OldMPT = cast<MemberPointerType>(Old);
2507 QualType New = wrap(C, OldMPT->getPointeeType(), I);
2508 return C.getMemberPointerType(New, OldMPT->getClass());
2509 }
2510
2511 case Reference: {
2512 const ReferenceType *OldRef = cast<ReferenceType>(Old);
2513 QualType New = wrap(C, OldRef->getPointeeType(), I);
2514 if (isa<LValueReferenceType>(OldRef))
2515 return C.getLValueReferenceType(New, OldRef->isSpelledAsLValue());
2516 else
2517 return C.getRValueReferenceType(New);
2518 }
2519 }
2520
2521 llvm_unreachable("unknown wrapping kind");
2522 return QualType();
2523 }
2524 };
2525}
2526
John McCall711c52b2011-01-05 12:14:39 +00002527/// Process an individual function attribute. Returns true to
2528/// indicate that the attribute was handled, false if it wasn't.
2529static bool handleFunctionTypeAttr(TypeProcessingState &state,
2530 AttributeList &attr,
2531 QualType &type) {
2532 Sema &S = state.getSema();
John McCalle6a365d2010-12-19 02:44:49 +00002533
John McCall711c52b2011-01-05 12:14:39 +00002534 FunctionTypeUnwrapper unwrapped(S, type);
Mike Stump24556362009-07-25 21:26:53 +00002535
John McCall711c52b2011-01-05 12:14:39 +00002536 if (attr.getKind() == AttributeList::AT_noreturn) {
2537 if (S.CheckNoReturnAttr(attr))
John McCall04a67a62010-02-05 21:31:56 +00002538 return true;
John McCalle6a365d2010-12-19 02:44:49 +00002539
John McCall711c52b2011-01-05 12:14:39 +00002540 // Delay if this is not a function type.
2541 if (!unwrapped.isFunctionType())
2542 return false;
2543
John McCall04a67a62010-02-05 21:31:56 +00002544 // Otherwise we can process right away.
John McCall711c52b2011-01-05 12:14:39 +00002545 FunctionType::ExtInfo EI = unwrapped.get()->getExtInfo().withNoReturn(true);
2546 type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
2547 return true;
John McCall04a67a62010-02-05 21:31:56 +00002548 }
Mike Stump24556362009-07-25 21:26:53 +00002549
John McCall711c52b2011-01-05 12:14:39 +00002550 if (attr.getKind() == AttributeList::AT_regparm) {
2551 unsigned value;
2552 if (S.CheckRegparmAttr(attr, value))
Rafael Espindola425ef722010-03-30 22:15:11 +00002553 return true;
2554
John McCall711c52b2011-01-05 12:14:39 +00002555 // Delay if this is not a function type.
2556 if (!unwrapped.isFunctionType())
Rafael Espindola425ef722010-03-30 22:15:11 +00002557 return false;
2558
John McCalle6a365d2010-12-19 02:44:49 +00002559 FunctionType::ExtInfo EI =
John McCall711c52b2011-01-05 12:14:39 +00002560 unwrapped.get()->getExtInfo().withRegParm(value);
2561 type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
2562 return true;
Rafael Espindola425ef722010-03-30 22:15:11 +00002563 }
2564
John McCall04a67a62010-02-05 21:31:56 +00002565 // Otherwise, a calling convention.
John McCall711c52b2011-01-05 12:14:39 +00002566 CallingConv CC;
2567 if (S.CheckCallingConvAttr(attr, CC))
2568 return true;
John McCallf82b4e82010-02-04 05:44:44 +00002569
John McCall04a67a62010-02-05 21:31:56 +00002570 // Delay if the type didn't work out to a function.
John McCall711c52b2011-01-05 12:14:39 +00002571 if (!unwrapped.isFunctionType()) return false;
John McCall04a67a62010-02-05 21:31:56 +00002572
John McCall711c52b2011-01-05 12:14:39 +00002573 const FunctionType *fn = unwrapped.get();
2574 CallingConv CCOld = fn->getCallConv();
Charles Davis064f7db2010-02-23 06:13:55 +00002575 if (S.Context.getCanonicalCallConv(CC) ==
Abramo Bagnarae215f722010-04-30 13:10:51 +00002576 S.Context.getCanonicalCallConv(CCOld)) {
John McCall711c52b2011-01-05 12:14:39 +00002577 attr.setInvalid();
2578 return true;
Abramo Bagnarae215f722010-04-30 13:10:51 +00002579 }
John McCall04a67a62010-02-05 21:31:56 +00002580
2581 if (CCOld != CC_Default) {
2582 // Should we diagnose reapplications of the same convention?
John McCall711c52b2011-01-05 12:14:39 +00002583 S.Diag(attr.getLoc(), diag::err_attributes_are_not_compatible)
John McCall04a67a62010-02-05 21:31:56 +00002584 << FunctionType::getNameForCallConv(CC)
2585 << FunctionType::getNameForCallConv(CCOld);
John McCall711c52b2011-01-05 12:14:39 +00002586 attr.setInvalid();
2587 return true;
John McCall04a67a62010-02-05 21:31:56 +00002588 }
2589
2590 // Diagnose the use of X86 fastcall on varargs or unprototyped functions.
2591 if (CC == CC_X86FastCall) {
John McCall711c52b2011-01-05 12:14:39 +00002592 if (isa<FunctionNoProtoType>(fn)) {
2593 S.Diag(attr.getLoc(), diag::err_cconv_knr)
John McCall04a67a62010-02-05 21:31:56 +00002594 << FunctionType::getNameForCallConv(CC);
John McCall711c52b2011-01-05 12:14:39 +00002595 attr.setInvalid();
2596 return true;
John McCall04a67a62010-02-05 21:31:56 +00002597 }
2598
John McCall711c52b2011-01-05 12:14:39 +00002599 const FunctionProtoType *FnP = cast<FunctionProtoType>(fn);
John McCall04a67a62010-02-05 21:31:56 +00002600 if (FnP->isVariadic()) {
John McCall711c52b2011-01-05 12:14:39 +00002601 S.Diag(attr.getLoc(), diag::err_cconv_varargs)
John McCall04a67a62010-02-05 21:31:56 +00002602 << FunctionType::getNameForCallConv(CC);
John McCall711c52b2011-01-05 12:14:39 +00002603 attr.setInvalid();
2604 return true;
John McCall04a67a62010-02-05 21:31:56 +00002605 }
2606 }
2607
John McCall711c52b2011-01-05 12:14:39 +00002608 FunctionType::ExtInfo EI = unwrapped.get()->getExtInfo().withCallingConv(CC);
2609 type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
2610 return true;
John McCallf82b4e82010-02-04 05:44:44 +00002611}
2612
John Thompson6e132aa2009-12-04 21:51:28 +00002613/// HandleVectorSizeAttribute - this attribute is only applicable to integral
2614/// and float scalars, although arrays, pointers, and function return values are
2615/// allowed in conjunction with this construct. Aggregates with this attribute
2616/// are invalid, even if they are of the same size as a corresponding scalar.
2617/// The raw attribute should contain precisely 1 argument, the vector size for
2618/// the variable, measured in bytes. If curType and rawAttr are well formed,
2619/// this routine will return a new vector type.
Chris Lattner788b0fd2010-06-23 06:00:24 +00002620static void HandleVectorSizeAttr(QualType& CurType, const AttributeList &Attr,
2621 Sema &S) {
Bob Wilson56affbc2010-11-16 00:32:16 +00002622 // Check the attribute arguments.
John Thompson6e132aa2009-12-04 21:51:28 +00002623 if (Attr.getNumArgs() != 1) {
2624 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
Abramo Bagnarae215f722010-04-30 13:10:51 +00002625 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00002626 return;
2627 }
2628 Expr *sizeExpr = static_cast<Expr *>(Attr.getArg(0));
2629 llvm::APSInt vecSize(32);
Douglas Gregorac06a0e2010-05-18 23:01:22 +00002630 if (sizeExpr->isTypeDependent() || sizeExpr->isValueDependent() ||
2631 !sizeExpr->isIntegerConstantExpr(vecSize, S.Context)) {
John Thompson6e132aa2009-12-04 21:51:28 +00002632 S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
2633 << "vector_size" << sizeExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002634 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00002635 return;
2636 }
2637 // the base type must be integer or float, and can't already be a vector.
Douglas Gregorf6094622010-07-23 15:58:24 +00002638 if (!CurType->isIntegerType() && !CurType->isRealFloatingType()) {
John Thompson6e132aa2009-12-04 21:51:28 +00002639 S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
Abramo Bagnarae215f722010-04-30 13:10:51 +00002640 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00002641 return;
2642 }
2643 unsigned typeSize = static_cast<unsigned>(S.Context.getTypeSize(CurType));
2644 // vecSize is specified in bytes - convert to bits.
2645 unsigned vectorSize = static_cast<unsigned>(vecSize.getZExtValue() * 8);
2646
2647 // the vector size needs to be an integral multiple of the type size.
2648 if (vectorSize % typeSize) {
2649 S.Diag(Attr.getLoc(), diag::err_attribute_invalid_size)
2650 << sizeExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002651 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00002652 return;
2653 }
2654 if (vectorSize == 0) {
2655 S.Diag(Attr.getLoc(), diag::err_attribute_zero_size)
2656 << sizeExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002657 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00002658 return;
2659 }
2660
2661 // Success! Instantiate the vector type, the number of elements is > 0, and
2662 // not required to be a power of 2, unlike GCC.
Chris Lattner788b0fd2010-06-23 06:00:24 +00002663 CurType = S.Context.getVectorType(CurType, vectorSize/typeSize,
Bob Wilsone86d78c2010-11-10 21:56:12 +00002664 VectorType::GenericVector);
John Thompson6e132aa2009-12-04 21:51:28 +00002665}
2666
Bob Wilson4211bb62010-11-16 00:32:24 +00002667/// HandleNeonVectorTypeAttr - The "neon_vector_type" and
2668/// "neon_polyvector_type" attributes are used to create vector types that
2669/// are mangled according to ARM's ABI. Otherwise, these types are identical
2670/// to those created with the "vector_size" attribute. Unlike "vector_size"
2671/// the argument to these Neon attributes is the number of vector elements,
2672/// not the vector size in bytes. The vector width and element type must
2673/// match one of the standard Neon vector types.
2674static void HandleNeonVectorTypeAttr(QualType& CurType,
2675 const AttributeList &Attr, Sema &S,
2676 VectorType::VectorKind VecKind,
2677 const char *AttrName) {
2678 // Check the attribute arguments.
2679 if (Attr.getNumArgs() != 1) {
2680 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
2681 Attr.setInvalid();
2682 return;
2683 }
2684 // The number of elements must be an ICE.
2685 Expr *numEltsExpr = static_cast<Expr *>(Attr.getArg(0));
2686 llvm::APSInt numEltsInt(32);
2687 if (numEltsExpr->isTypeDependent() || numEltsExpr->isValueDependent() ||
2688 !numEltsExpr->isIntegerConstantExpr(numEltsInt, S.Context)) {
2689 S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
2690 << AttrName << numEltsExpr->getSourceRange();
2691 Attr.setInvalid();
2692 return;
2693 }
2694 // Only certain element types are supported for Neon vectors.
2695 const BuiltinType* BTy = CurType->getAs<BuiltinType>();
2696 if (!BTy ||
2697 (VecKind == VectorType::NeonPolyVector &&
2698 BTy->getKind() != BuiltinType::SChar &&
2699 BTy->getKind() != BuiltinType::Short) ||
2700 (BTy->getKind() != BuiltinType::SChar &&
2701 BTy->getKind() != BuiltinType::UChar &&
2702 BTy->getKind() != BuiltinType::Short &&
2703 BTy->getKind() != BuiltinType::UShort &&
2704 BTy->getKind() != BuiltinType::Int &&
2705 BTy->getKind() != BuiltinType::UInt &&
2706 BTy->getKind() != BuiltinType::LongLong &&
2707 BTy->getKind() != BuiltinType::ULongLong &&
2708 BTy->getKind() != BuiltinType::Float)) {
2709 S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) <<CurType;
2710 Attr.setInvalid();
2711 return;
2712 }
2713 // The total size of the vector must be 64 or 128 bits.
2714 unsigned typeSize = static_cast<unsigned>(S.Context.getTypeSize(CurType));
2715 unsigned numElts = static_cast<unsigned>(numEltsInt.getZExtValue());
2716 unsigned vecSize = typeSize * numElts;
2717 if (vecSize != 64 && vecSize != 128) {
2718 S.Diag(Attr.getLoc(), diag::err_attribute_bad_neon_vector_size) << CurType;
2719 Attr.setInvalid();
2720 return;
2721 }
2722
2723 CurType = S.Context.getVectorType(CurType, numElts, VecKind);
2724}
2725
John McCall711c52b2011-01-05 12:14:39 +00002726static void processTypeAttrs(TypeProcessingState &state, QualType &type,
2727 bool isDeclSpec, AttributeList *attrs) {
Chris Lattner232e8822008-02-21 01:08:11 +00002728 // Scan through and apply attributes to this type where it makes sense. Some
2729 // attributes (such as __address_space__, __vector_size__, etc) apply to the
2730 // type, but others can be present in the type specifiers even though they
Chris Lattnerfca0ddd2008-06-26 06:27:57 +00002731 // apply to the decl. Here we apply type attributes and ignore the rest.
John McCall711c52b2011-01-05 12:14:39 +00002732
2733 AttributeList *next;
2734 do {
2735 AttributeList &attr = *attrs;
2736 next = attr.getNext();
2737
Abramo Bagnarae215f722010-04-30 13:10:51 +00002738 // Skip attributes that were marked to be invalid.
John McCall711c52b2011-01-05 12:14:39 +00002739 if (attr.isInvalid())
Abramo Bagnarae215f722010-04-30 13:10:51 +00002740 continue;
2741
Abramo Bagnarab1f1b262010-04-30 09:13:03 +00002742 // If this is an attribute we can handle, do so now,
2743 // otherwise, add it to the FnAttrs list for rechaining.
John McCall711c52b2011-01-05 12:14:39 +00002744 switch (attr.getKind()) {
Chris Lattner232e8822008-02-21 01:08:11 +00002745 default: break;
John McCall04a67a62010-02-05 21:31:56 +00002746
Chris Lattner232e8822008-02-21 01:08:11 +00002747 case AttributeList::AT_address_space:
John McCall711c52b2011-01-05 12:14:39 +00002748 HandleAddressSpaceTypeAttribute(type, attr, state.getSema());
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002749 break;
John McCall711c52b2011-01-05 12:14:39 +00002750 OBJC_POINTER_TYPE_ATTRS_CASELIST:
2751 if (!handleObjCPointerTypeAttr(state, attr, type))
2752 distributeObjCPointerTypeAttr(state, attr, type);
Mike Stump24556362009-07-25 21:26:53 +00002753 break;
John Thompson6e132aa2009-12-04 21:51:28 +00002754 case AttributeList::AT_vector_size:
John McCall711c52b2011-01-05 12:14:39 +00002755 HandleVectorSizeAttr(type, attr, state.getSema());
John McCall04a67a62010-02-05 21:31:56 +00002756 break;
Bob Wilson4211bb62010-11-16 00:32:24 +00002757 case AttributeList::AT_neon_vector_type:
John McCall711c52b2011-01-05 12:14:39 +00002758 HandleNeonVectorTypeAttr(type, attr, state.getSema(),
2759 VectorType::NeonVector, "neon_vector_type");
Bob Wilson4211bb62010-11-16 00:32:24 +00002760 break;
2761 case AttributeList::AT_neon_polyvector_type:
John McCall711c52b2011-01-05 12:14:39 +00002762 HandleNeonVectorTypeAttr(type, attr, state.getSema(),
2763 VectorType::NeonPolyVector,
Bob Wilson4211bb62010-11-16 00:32:24 +00002764 "neon_polyvector_type");
2765 break;
John McCall04a67a62010-02-05 21:31:56 +00002766
John McCall711c52b2011-01-05 12:14:39 +00002767 FUNCTION_TYPE_ATTRS_CASELIST:
2768 // Never process function type attributes as part of the
2769 // declaration-specifiers.
2770 if (isDeclSpec)
2771 distributeFunctionTypeAttrFromDeclSpec(state, attr, type);
2772
2773 // Otherwise, handle the possible delays.
2774 else if (!handleFunctionTypeAttr(state, attr, type))
2775 distributeFunctionTypeAttr(state, attr, type);
John Thompson6e132aa2009-12-04 21:51:28 +00002776 break;
Chris Lattner232e8822008-02-21 01:08:11 +00002777 }
John McCall711c52b2011-01-05 12:14:39 +00002778 } while ((attrs = next));
Chris Lattner232e8822008-02-21 01:08:11 +00002779}
2780
Mike Stump1eb44332009-09-09 15:08:12 +00002781/// @brief Ensure that the type T is a complete type.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002782///
2783/// This routine checks whether the type @p T is complete in any
2784/// context where a complete type is required. If @p T is a complete
Douglas Gregor86447ec2009-03-09 16:13:40 +00002785/// type, returns false. If @p T is a class template specialization,
2786/// this routine then attempts to perform class template
2787/// instantiation. If instantiation fails, or if @p T is incomplete
2788/// and cannot be completed, issues the diagnostic @p diag (giving it
2789/// the type @p T) and returns true.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002790///
2791/// @param Loc The location in the source that the incomplete type
2792/// diagnostic should refer to.
2793///
2794/// @param T The type that this routine is examining for completeness.
2795///
Mike Stump1eb44332009-09-09 15:08:12 +00002796/// @param PD The partial diagnostic that will be printed out if T is not a
Anders Carlssonb7906612009-08-26 23:45:07 +00002797/// complete type.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002798///
2799/// @returns @c true if @p T is incomplete and a diagnostic was emitted,
2800/// @c false otherwise.
Anders Carlsson91a0cc92009-08-26 22:33:56 +00002801bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
Anders Carlsson8c8d9192009-10-09 23:51:55 +00002802 const PartialDiagnostic &PD,
2803 std::pair<SourceLocation,
2804 PartialDiagnostic> Note) {
Anders Carlsson91a0cc92009-08-26 22:33:56 +00002805 unsigned diag = PD.getDiagID();
Mike Stump1eb44332009-09-09 15:08:12 +00002806
Douglas Gregor573d9c32009-10-21 23:19:44 +00002807 // FIXME: Add this assertion to make sure we always get instantiation points.
2808 // assert(!Loc.isInvalid() && "Invalid location in RequireCompleteType");
Douglas Gregor690dc7f2009-05-21 23:48:18 +00002809 // FIXME: Add this assertion to help us flush out problems with
2810 // checking for dependent types and type-dependent expressions.
2811 //
Mike Stump1eb44332009-09-09 15:08:12 +00002812 // assert(!T->isDependentType() &&
Douglas Gregor690dc7f2009-05-21 23:48:18 +00002813 // "Can't ask whether a dependent type is complete");
2814
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002815 // If we have a complete type, we're done.
2816 if (!T->isIncompleteType())
2817 return false;
Eli Friedman3c0eb162008-05-27 03:33:27 +00002818
Douglas Gregord475b8d2009-03-25 21:17:03 +00002819 // If we have a class template specialization or a class member of a
Sebastian Redl923d56d2009-11-05 15:52:31 +00002820 // class template specialization, or an array with known size of such,
2821 // try to instantiate it.
2822 QualType MaybeTemplate = T;
Douglas Gregor89c49f02009-11-09 22:08:55 +00002823 if (const ConstantArrayType *Array = Context.getAsConstantArrayType(T))
Sebastian Redl923d56d2009-11-05 15:52:31 +00002824 MaybeTemplate = Array->getElementType();
2825 if (const RecordType *Record = MaybeTemplate->getAs<RecordType>()) {
Douglas Gregor2943aed2009-03-03 04:44:36 +00002826 if (ClassTemplateSpecializationDecl *ClassTemplateSpec
Douglas Gregord475b8d2009-03-25 21:17:03 +00002827 = dyn_cast<ClassTemplateSpecializationDecl>(Record->getDecl())) {
Douglas Gregor972e6ce2009-10-27 06:26:26 +00002828 if (ClassTemplateSpec->getSpecializationKind() == TSK_Undeclared)
2829 return InstantiateClassTemplateSpecialization(Loc, ClassTemplateSpec,
Douglas Gregord0e3daf2009-09-04 22:48:11 +00002830 TSK_ImplicitInstantiation,
Douglas Gregor5842ba92009-08-24 15:23:48 +00002831 /*Complain=*/diag != 0);
Mike Stump1eb44332009-09-09 15:08:12 +00002832 } else if (CXXRecordDecl *Rec
Douglas Gregord475b8d2009-03-25 21:17:03 +00002833 = dyn_cast<CXXRecordDecl>(Record->getDecl())) {
2834 if (CXXRecordDecl *Pattern = Rec->getInstantiatedFromMemberClass()) {
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00002835 MemberSpecializationInfo *MSInfo = Rec->getMemberSpecializationInfo();
2836 assert(MSInfo && "Missing member specialization information?");
Douglas Gregor357bbd02009-08-28 20:50:45 +00002837 // This record was instantiated from a class within a template.
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00002838 if (MSInfo->getTemplateSpecializationKind()
Douglas Gregor972e6ce2009-10-27 06:26:26 +00002839 != TSK_ExplicitSpecialization)
Douglas Gregorf6b11852009-10-08 15:14:33 +00002840 return InstantiateClass(Loc, Rec, Pattern,
2841 getTemplateInstantiationArgs(Rec),
2842 TSK_ImplicitInstantiation,
2843 /*Complain=*/diag != 0);
Douglas Gregord475b8d2009-03-25 21:17:03 +00002844 }
2845 }
2846 }
Douglas Gregor2943aed2009-03-03 04:44:36 +00002847
Douglas Gregor5842ba92009-08-24 15:23:48 +00002848 if (diag == 0)
2849 return true;
Mike Stump1eb44332009-09-09 15:08:12 +00002850
John McCall916c8702010-11-16 01:44:35 +00002851 const TagType *Tag = T->getAs<TagType>();
Rafael Espindola01620702010-03-21 22:56:43 +00002852
2853 // Avoid diagnosing invalid decls as incomplete.
2854 if (Tag && Tag->getDecl()->isInvalidDecl())
2855 return true;
2856
John McCall916c8702010-11-16 01:44:35 +00002857 // Give the external AST source a chance to complete the type.
2858 if (Tag && Tag->getDecl()->hasExternalLexicalStorage()) {
2859 Context.getExternalSource()->CompleteType(Tag->getDecl());
2860 if (!Tag->isIncompleteType())
2861 return false;
2862 }
2863
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002864 // We have an incomplete type. Produce a diagnostic.
Anders Carlsson91a0cc92009-08-26 22:33:56 +00002865 Diag(Loc, PD) << T;
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002866
Anders Carlsson8c8d9192009-10-09 23:51:55 +00002867 // If we have a note, produce it.
2868 if (!Note.first.isInvalid())
2869 Diag(Note.first, Note.second);
2870
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002871 // If the type was a forward declaration of a class/struct/union
Rafael Espindola01620702010-03-21 22:56:43 +00002872 // type, produce a note.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002873 if (Tag && !Tag->getDecl()->isInvalidDecl())
Mike Stump1eb44332009-09-09 15:08:12 +00002874 Diag(Tag->getDecl()->getLocation(),
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002875 Tag->isBeingDefined() ? diag::note_type_being_defined
2876 : diag::note_forward_declaration)
2877 << QualType(Tag, 0);
2878
2879 return true;
2880}
Douglas Gregore6258932009-03-19 00:39:20 +00002881
Douglas Gregorfe6b2d42010-03-29 23:34:08 +00002882bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
2883 const PartialDiagnostic &PD) {
2884 return RequireCompleteType(Loc, T, PD,
2885 std::make_pair(SourceLocation(), PDiag(0)));
2886}
2887
2888bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
2889 unsigned DiagID) {
2890 return RequireCompleteType(Loc, T, PDiag(DiagID),
2891 std::make_pair(SourceLocation(), PDiag(0)));
2892}
2893
Abramo Bagnara465d41b2010-05-11 21:36:43 +00002894/// \brief Retrieve a version of the type 'T' that is elaborated by Keyword
2895/// and qualified by the nested-name-specifier contained in SS.
2896QualType Sema::getElaboratedType(ElaboratedTypeKeyword Keyword,
2897 const CXXScopeSpec &SS, QualType T) {
2898 if (T.isNull())
Douglas Gregore6258932009-03-19 00:39:20 +00002899 return T;
Abramo Bagnara465d41b2010-05-11 21:36:43 +00002900 NestedNameSpecifier *NNS;
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002901 if (SS.isValid())
Abramo Bagnara465d41b2010-05-11 21:36:43 +00002902 NNS = static_cast<NestedNameSpecifier *>(SS.getScopeRep());
2903 else {
2904 if (Keyword == ETK_None)
2905 return T;
2906 NNS = 0;
2907 }
2908 return Context.getElaboratedType(Keyword, NNS, T);
Douglas Gregore6258932009-03-19 00:39:20 +00002909}
Anders Carlssonaf017e62009-06-29 22:58:55 +00002910
John McCall2a984ca2010-10-12 00:20:44 +00002911QualType Sema::BuildTypeofExprType(Expr *E, SourceLocation Loc) {
2912 ExprResult ER = CheckPlaceholderExpr(E, Loc);
2913 if (ER.isInvalid()) return QualType();
2914 E = ER.take();
2915
Fariborz Jahanian2b1d51b2010-10-05 23:24:00 +00002916 if (!E->isTypeDependent()) {
2917 QualType T = E->getType();
Fariborz Jahanianaca7f7b2010-10-06 00:23:25 +00002918 if (const TagType *TT = T->getAs<TagType>())
2919 DiagnoseUseOfDecl(TT->getDecl(), E->getExprLoc());
Fariborz Jahanian2b1d51b2010-10-05 23:24:00 +00002920 }
Anders Carlssonaf017e62009-06-29 22:58:55 +00002921 return Context.getTypeOfExprType(E);
2922}
2923
John McCall2a984ca2010-10-12 00:20:44 +00002924QualType Sema::BuildDecltypeType(Expr *E, SourceLocation Loc) {
2925 ExprResult ER = CheckPlaceholderExpr(E, Loc);
2926 if (ER.isInvalid()) return QualType();
2927 E = ER.take();
Douglas Gregor4b52e252009-12-21 23:17:24 +00002928
Anders Carlssonaf017e62009-06-29 22:58:55 +00002929 return Context.getDecltypeType(E);
2930}