blob: 1c8a58b07ce5b2fe5ec6321b2c392c81778443c1 [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
John McCallda263792011-02-08 01:59:10 +0000489 // If there are any type objects, the type as written won't name a
490 // function, regardless of the decl spec type. This is because a
491 // block signature declarator is always an abstract-declarator, and
492 // abstract-declarators can't just be parentheses chunks. Therefore
493 // we need to build a function chunk unless there are no type
494 // objects and the decl spec type is a function.
John McCall711c52b2011-01-05 12:14:39 +0000495 if (!declarator.getNumTypeObjects() && declSpecType->isFunctionType())
496 return;
497
John McCallda263792011-02-08 01:59:10 +0000498 // Note that there *are* cases with invalid declarators where
499 // declarators consist solely of parentheses. In general, these
500 // occur only in failed efforts to make function declarators, so
501 // faking up the function chunk is still the right thing to do.
John McCall711c52b2011-01-05 12:14:39 +0000502
503 // Otherwise, we need to fake up a function declarator.
504 SourceLocation loc = declarator.getSourceRange().getBegin();
505
506 // ...and *prepend* it to the declarator.
507 declarator.AddInnermostTypeInfo(DeclaratorChunk::getFunction(
508 ParsedAttributes(),
509 /*proto*/ true,
510 /*variadic*/ false, SourceLocation(),
511 /*args*/ 0, 0,
512 /*type quals*/ 0,
Douglas Gregor83f51722011-01-26 03:43:54 +0000513 /*ref-qualifier*/true, SourceLocation(),
John McCall711c52b2011-01-05 12:14:39 +0000514 /*EH*/ false, SourceLocation(), false, 0, 0, 0,
515 /*parens*/ loc, loc,
516 declarator));
517
518 // For consistency, make sure the state still has us as processing
519 // the decl spec.
520 assert(state.getCurrentChunkIndex() == declarator.getNumTypeObjects() - 1);
521 state.setCurrentChunkIndex(declarator.getNumTypeObjects());
John McCall04a67a62010-02-05 21:31:56 +0000522}
523
Douglas Gregor930d8b52009-01-30 22:09:00 +0000524/// \brief Convert the specified declspec to the appropriate type
525/// object.
Chris Lattner5db2bb12009-10-25 18:21:37 +0000526/// \param D the declarator containing the declaration specifier.
Chris Lattner5153ee62009-04-25 08:47:54 +0000527/// \returns The type described by the declaration specifiers. This function
528/// never returns null.
John McCall711c52b2011-01-05 12:14:39 +0000529static QualType ConvertDeclSpecToType(Sema &S, TypeProcessingState &state) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000530 // FIXME: Should move the logic from DeclSpec::Finish to here for validity
531 // checking.
John McCall711c52b2011-01-05 12:14:39 +0000532
533 Declarator &declarator = state.getDeclarator();
534 const DeclSpec &DS = declarator.getDeclSpec();
535 SourceLocation DeclLoc = declarator.getIdentifierLoc();
Chris Lattner5db2bb12009-10-25 18:21:37 +0000536 if (DeclLoc.isInvalid())
537 DeclLoc = DS.getSourceRange().getBegin();
Chris Lattner1564e392009-10-25 18:07:27 +0000538
John McCall711c52b2011-01-05 12:14:39 +0000539 ASTContext &Context = S.Context;
Mike Stump1eb44332009-09-09 15:08:12 +0000540
Chris Lattner5db2bb12009-10-25 18:21:37 +0000541 QualType Result;
Reid Spencer5f016e22007-07-11 17:01:13 +0000542 switch (DS.getTypeSpecType()) {
Chris Lattner96b77fc2008-04-02 06:50:17 +0000543 case DeclSpec::TST_void:
544 Result = Context.VoidTy;
545 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000546 case DeclSpec::TST_char:
547 if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified)
Chris Lattnerfab5b452008-02-20 23:53:49 +0000548 Result = Context.CharTy;
Reid Spencer5f016e22007-07-11 17:01:13 +0000549 else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed)
Chris Lattnerfab5b452008-02-20 23:53:49 +0000550 Result = Context.SignedCharTy;
Reid Spencer5f016e22007-07-11 17:01:13 +0000551 else {
552 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned &&
553 "Unknown TSS value");
Chris Lattnerfab5b452008-02-20 23:53:49 +0000554 Result = Context.UnsignedCharTy;
Reid Spencer5f016e22007-07-11 17:01:13 +0000555 }
Chris Lattner958858e2008-02-20 21:40:32 +0000556 break;
Argyrios Kyrtzidis64c438a2008-08-09 16:51:54 +0000557 case DeclSpec::TST_wchar:
558 if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified)
559 Result = Context.WCharTy;
560 else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed) {
John McCall711c52b2011-01-05 12:14:39 +0000561 S.Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec)
Chris Lattnerf3a41af2008-11-20 06:38:18 +0000562 << DS.getSpecifierName(DS.getTypeSpecType());
Argyrios Kyrtzidis64c438a2008-08-09 16:51:54 +0000563 Result = Context.getSignedWCharType();
564 } else {
565 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned &&
566 "Unknown TSS value");
John McCall711c52b2011-01-05 12:14:39 +0000567 S.Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec)
Chris Lattnerf3a41af2008-11-20 06:38:18 +0000568 << DS.getSpecifierName(DS.getTypeSpecType());
Argyrios Kyrtzidis64c438a2008-08-09 16:51:54 +0000569 Result = Context.getUnsignedWCharType();
570 }
571 break;
Alisdair Meredithf5c209d2009-07-14 06:30:34 +0000572 case DeclSpec::TST_char16:
573 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
574 "Unknown TSS value");
575 Result = Context.Char16Ty;
576 break;
577 case DeclSpec::TST_char32:
578 assert(DS.getTypeSpecSign() == DeclSpec::TSS_unspecified &&
579 "Unknown TSS value");
580 Result = Context.Char32Ty;
581 break;
Chris Lattnerd658b562008-04-05 06:32:51 +0000582 case DeclSpec::TST_unspecified:
Chris Lattner62f5f7f2008-07-26 00:46:50 +0000583 // "<proto1,proto2>" is an objc qualified ID with a missing id.
Chris Lattner097e9162008-10-20 02:01:50 +0000584 if (DeclSpec::ProtocolQualifierListTy PQ = DS.getProtocolQualifiers()) {
John McCallc12c5bb2010-05-15 11:32:37 +0000585 Result = Context.getObjCObjectType(Context.ObjCBuiltinIdTy,
586 (ObjCProtocolDecl**)PQ,
587 DS.getNumProtocolQualifiers());
588 Result = Context.getObjCObjectPointerType(Result);
Chris Lattner62f5f7f2008-07-26 00:46:50 +0000589 break;
590 }
Chris Lattner5db2bb12009-10-25 18:21:37 +0000591
592 // If this is a missing declspec in a block literal return context, then it
593 // is inferred from the return statements inside the block.
John McCall711c52b2011-01-05 12:14:39 +0000594 if (isOmittedBlockReturnType(declarator)) {
Chris Lattner5db2bb12009-10-25 18:21:37 +0000595 Result = Context.DependentTy;
596 break;
597 }
Mike Stump1eb44332009-09-09 15:08:12 +0000598
Chris Lattnerd658b562008-04-05 06:32:51 +0000599 // Unspecified typespec defaults to int in C90. However, the C90 grammar
600 // [C90 6.5] only allows a decl-spec if there was *some* type-specifier,
601 // type-qualifier, or storage-class-specifier. If not, emit an extwarn.
602 // Note that the one exception to this is function definitions, which are
603 // allowed to be completely missing a declspec. This is handled in the
604 // parser already though by it pretending to have seen an 'int' in this
605 // case.
John McCall711c52b2011-01-05 12:14:39 +0000606 if (S.getLangOptions().ImplicitInt) {
Chris Lattner35d276f2009-02-27 18:53:28 +0000607 // In C89 mode, we only warn if there is a completely missing declspec
608 // when one is not allowed.
Chris Lattner3f84ad22009-04-22 05:27:59 +0000609 if (DS.isEmpty()) {
John McCall711c52b2011-01-05 12:14:39 +0000610 S.Diag(DeclLoc, diag::ext_missing_declspec)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000611 << DS.getSourceRange()
Douglas Gregor849b2432010-03-31 17:46:05 +0000612 << FixItHint::CreateInsertion(DS.getSourceRange().getBegin(), "int");
Chris Lattner3f84ad22009-04-22 05:27:59 +0000613 }
Douglas Gregor4310f4e2009-02-16 22:38:20 +0000614 } else if (!DS.hasTypeSpecifier()) {
Chris Lattnerd658b562008-04-05 06:32:51 +0000615 // C99 and C++ require a type specifier. For example, C99 6.7.2p2 says:
616 // "At least one type specifier shall be given in the declaration
617 // specifiers in each declaration, and in the specifier-qualifier list in
618 // each struct declaration and type name."
Douglas Gregor4310f4e2009-02-16 22:38:20 +0000619 // FIXME: Does Microsoft really have the implicit int extension in C++?
John McCall711c52b2011-01-05 12:14:39 +0000620 if (S.getLangOptions().CPlusPlus &&
621 !S.getLangOptions().Microsoft) {
622 S.Diag(DeclLoc, diag::err_missing_type_specifier)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000623 << DS.getSourceRange();
Mike Stump1eb44332009-09-09 15:08:12 +0000624
Chris Lattnerb78d8332009-06-26 04:45:06 +0000625 // When this occurs in C++ code, often something is very broken with the
626 // value being declared, poison it as invalid so we don't get chains of
627 // errors.
John McCall711c52b2011-01-05 12:14:39 +0000628 declarator.setInvalidType(true);
Chris Lattnerb78d8332009-06-26 04:45:06 +0000629 } else {
John McCall711c52b2011-01-05 12:14:39 +0000630 S.Diag(DeclLoc, diag::ext_missing_type_specifier)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000631 << DS.getSourceRange();
Chris Lattnerb78d8332009-06-26 04:45:06 +0000632 }
Chris Lattnerd658b562008-04-05 06:32:51 +0000633 }
Mike Stump1eb44332009-09-09 15:08:12 +0000634
635 // FALL THROUGH.
Chris Lattner3cbc38b2007-08-21 17:02:28 +0000636 case DeclSpec::TST_int: {
Reid Spencer5f016e22007-07-11 17:01:13 +0000637 if (DS.getTypeSpecSign() != DeclSpec::TSS_unsigned) {
638 switch (DS.getTypeSpecWidth()) {
Chris Lattnerfab5b452008-02-20 23:53:49 +0000639 case DeclSpec::TSW_unspecified: Result = Context.IntTy; break;
640 case DeclSpec::TSW_short: Result = Context.ShortTy; break;
641 case DeclSpec::TSW_long: Result = Context.LongTy; break;
Chris Lattner311157f2009-10-25 18:25:04 +0000642 case DeclSpec::TSW_longlong:
643 Result = Context.LongLongTy;
644
645 // long long is a C99 feature.
John McCall711c52b2011-01-05 12:14:39 +0000646 if (!S.getLangOptions().C99 &&
647 !S.getLangOptions().CPlusPlus0x)
648 S.Diag(DS.getTypeSpecWidthLoc(), diag::ext_longlong);
Chris Lattner311157f2009-10-25 18:25:04 +0000649 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000650 }
651 } else {
652 switch (DS.getTypeSpecWidth()) {
Chris Lattnerfab5b452008-02-20 23:53:49 +0000653 case DeclSpec::TSW_unspecified: Result = Context.UnsignedIntTy; break;
654 case DeclSpec::TSW_short: Result = Context.UnsignedShortTy; break;
655 case DeclSpec::TSW_long: Result = Context.UnsignedLongTy; break;
Chris Lattner311157f2009-10-25 18:25:04 +0000656 case DeclSpec::TSW_longlong:
657 Result = Context.UnsignedLongLongTy;
658
659 // long long is a C99 feature.
John McCall711c52b2011-01-05 12:14:39 +0000660 if (!S.getLangOptions().C99 &&
661 !S.getLangOptions().CPlusPlus0x)
662 S.Diag(DS.getTypeSpecWidthLoc(), diag::ext_longlong);
Chris Lattner311157f2009-10-25 18:25:04 +0000663 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000664 }
665 }
Chris Lattner958858e2008-02-20 21:40:32 +0000666 break;
Chris Lattner3cbc38b2007-08-21 17:02:28 +0000667 }
Chris Lattnerfab5b452008-02-20 23:53:49 +0000668 case DeclSpec::TST_float: Result = Context.FloatTy; break;
Chris Lattner958858e2008-02-20 21:40:32 +0000669 case DeclSpec::TST_double:
670 if (DS.getTypeSpecWidth() == DeclSpec::TSW_long)
Chris Lattnerfab5b452008-02-20 23:53:49 +0000671 Result = Context.LongDoubleTy;
Chris Lattner958858e2008-02-20 21:40:32 +0000672 else
Chris Lattnerfab5b452008-02-20 23:53:49 +0000673 Result = Context.DoubleTy;
Peter Collingbourne39d3e7a2011-02-15 19:46:23 +0000674
675 if (S.getLangOptions().OpenCL && !S.getOpenCLOptions().cl_khr_fp64) {
676 S.Diag(DS.getTypeSpecTypeLoc(), diag::err_double_requires_fp64);
677 declarator.setInvalidType(true);
678 }
Chris Lattner958858e2008-02-20 21:40:32 +0000679 break;
Chris Lattnerfab5b452008-02-20 23:53:49 +0000680 case DeclSpec::TST_bool: Result = Context.BoolTy; break; // _Bool or bool
Reid Spencer5f016e22007-07-11 17:01:13 +0000681 case DeclSpec::TST_decimal32: // _Decimal32
682 case DeclSpec::TST_decimal64: // _Decimal64
683 case DeclSpec::TST_decimal128: // _Decimal128
John McCall711c52b2011-01-05 12:14:39 +0000684 S.Diag(DS.getTypeSpecTypeLoc(), diag::err_decimal_unsupported);
Chris Lattner8f12f652009-05-13 05:02:08 +0000685 Result = Context.IntTy;
John McCall711c52b2011-01-05 12:14:39 +0000686 declarator.setInvalidType(true);
Chris Lattner8f12f652009-05-13 05:02:08 +0000687 break;
Chris Lattner99dc9142008-04-13 18:59:07 +0000688 case DeclSpec::TST_class:
Reid Spencer5f016e22007-07-11 17:01:13 +0000689 case DeclSpec::TST_enum:
690 case DeclSpec::TST_union:
691 case DeclSpec::TST_struct: {
John McCallb3d87482010-08-24 05:47:05 +0000692 TypeDecl *D = dyn_cast_or_null<TypeDecl>(DS.getRepAsDecl());
John McCall6e247262009-10-10 05:48:19 +0000693 if (!D) {
694 // This can happen in C++ with ambiguous lookups.
695 Result = Context.IntTy;
John McCall711c52b2011-01-05 12:14:39 +0000696 declarator.setInvalidType(true);
John McCall6e247262009-10-10 05:48:19 +0000697 break;
698 }
699
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000700 // If the type is deprecated or unavailable, diagnose it.
John McCall711c52b2011-01-05 12:14:39 +0000701 S.DiagnoseUseOfDecl(D, DS.getTypeSpecTypeLoc());
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000702
Reid Spencer5f016e22007-07-11 17:01:13 +0000703 assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 &&
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000704 DS.getTypeSpecSign() == 0 && "No qualifiers on tag names!");
705
Reid Spencer5f016e22007-07-11 17:01:13 +0000706 // TypeQuals handled by caller.
Chris Lattnera64ef0a2009-10-25 22:09:09 +0000707 Result = Context.getTypeDeclType(D);
John McCall2191b202009-09-05 06:31:47 +0000708
709 // In C++, make an ElaboratedType.
John McCall711c52b2011-01-05 12:14:39 +0000710 if (S.getLangOptions().CPlusPlus) {
Abramo Bagnara465d41b2010-05-11 21:36:43 +0000711 ElaboratedTypeKeyword Keyword
712 = ElaboratedType::getKeywordForTypeSpec(DS.getTypeSpecType());
John McCall711c52b2011-01-05 12:14:39 +0000713 Result = S.getElaboratedType(Keyword, DS.getTypeSpecScope(), Result);
John McCall2191b202009-09-05 06:31:47 +0000714 }
Chris Lattner5153ee62009-04-25 08:47:54 +0000715 if (D->isInvalidDecl())
John McCall711c52b2011-01-05 12:14:39 +0000716 declarator.setInvalidType(true);
Chris Lattner958858e2008-02-20 21:40:32 +0000717 break;
Mike Stump1eb44332009-09-09 15:08:12 +0000718 }
Douglas Gregor1a51b4a2009-02-09 15:09:02 +0000719 case DeclSpec::TST_typename: {
Reid Spencer5f016e22007-07-11 17:01:13 +0000720 assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 &&
721 DS.getTypeSpecSign() == 0 &&
722 "Can't handle qualifiers on typedef names yet!");
John McCall711c52b2011-01-05 12:14:39 +0000723 Result = S.GetTypeFromParser(DS.getRepAsType());
John McCall27940d22010-07-30 05:17:22 +0000724 if (Result.isNull())
John McCall711c52b2011-01-05 12:14:39 +0000725 declarator.setInvalidType(true);
John McCall27940d22010-07-30 05:17:22 +0000726 else if (DeclSpec::ProtocolQualifierListTy PQ
727 = DS.getProtocolQualifiers()) {
John McCallc12c5bb2010-05-15 11:32:37 +0000728 if (const ObjCObjectType *ObjT = Result->getAs<ObjCObjectType>()) {
729 // Silently drop any existing protocol qualifiers.
730 // TODO: determine whether that's the right thing to do.
731 if (ObjT->getNumProtocols())
732 Result = ObjT->getBaseType();
733
734 if (DS.getNumProtocolQualifiers())
735 Result = Context.getObjCObjectType(Result,
736 (ObjCProtocolDecl**) PQ,
737 DS.getNumProtocolQualifiers());
738 } else if (Result->isObjCIdType()) {
Chris Lattnerae4da612008-07-26 01:53:50 +0000739 // id<protocol-list>
John McCallc12c5bb2010-05-15 11:32:37 +0000740 Result = Context.getObjCObjectType(Context.ObjCBuiltinIdTy,
741 (ObjCProtocolDecl**) PQ,
742 DS.getNumProtocolQualifiers());
743 Result = Context.getObjCObjectPointerType(Result);
744 } else if (Result->isObjCClassType()) {
Steve Naroff4262a072009-02-23 18:53:24 +0000745 // Class<protocol-list>
John McCallc12c5bb2010-05-15 11:32:37 +0000746 Result = Context.getObjCObjectType(Context.ObjCBuiltinClassTy,
747 (ObjCProtocolDecl**) PQ,
748 DS.getNumProtocolQualifiers());
749 Result = Context.getObjCObjectPointerType(Result);
Chris Lattner3f84ad22009-04-22 05:27:59 +0000750 } else {
John McCall711c52b2011-01-05 12:14:39 +0000751 S.Diag(DeclLoc, diag::err_invalid_protocol_qualifiers)
Chris Lattner3f84ad22009-04-22 05:27:59 +0000752 << DS.getSourceRange();
John McCall711c52b2011-01-05 12:14:39 +0000753 declarator.setInvalidType(true);
Chris Lattner3f84ad22009-04-22 05:27:59 +0000754 }
Fariborz Jahanianc5692492007-12-17 21:03:50 +0000755 }
Mike Stump1eb44332009-09-09 15:08:12 +0000756
Reid Spencer5f016e22007-07-11 17:01:13 +0000757 // TypeQuals handled by caller.
Chris Lattner958858e2008-02-20 21:40:32 +0000758 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000759 }
Chris Lattner958858e2008-02-20 21:40:32 +0000760 case DeclSpec::TST_typeofType:
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +0000761 // FIXME: Preserve type source info.
John McCall711c52b2011-01-05 12:14:39 +0000762 Result = S.GetTypeFromParser(DS.getRepAsType());
Chris Lattner958858e2008-02-20 21:40:32 +0000763 assert(!Result.isNull() && "Didn't get a type for typeof?");
Fariborz Jahanian730e1752010-10-06 17:00:02 +0000764 if (!Result->isDependentType())
765 if (const TagType *TT = Result->getAs<TagType>())
John McCall711c52b2011-01-05 12:14:39 +0000766 S.DiagnoseUseOfDecl(TT->getDecl(), DS.getTypeSpecTypeLoc());
Steve Naroffd1861fd2007-07-31 12:34:36 +0000767 // TypeQuals handled by caller.
Chris Lattnerfab5b452008-02-20 23:53:49 +0000768 Result = Context.getTypeOfType(Result);
Chris Lattner958858e2008-02-20 21:40:32 +0000769 break;
Steve Naroffd1861fd2007-07-31 12:34:36 +0000770 case DeclSpec::TST_typeofExpr: {
John McCallb3d87482010-08-24 05:47:05 +0000771 Expr *E = DS.getRepAsExpr();
Steve Naroffd1861fd2007-07-31 12:34:36 +0000772 assert(E && "Didn't get an expression for typeof?");
773 // TypeQuals handled by caller.
John McCall711c52b2011-01-05 12:14:39 +0000774 Result = S.BuildTypeofExprType(E, DS.getTypeSpecTypeLoc());
Douglas Gregor4b52e252009-12-21 23:17:24 +0000775 if (Result.isNull()) {
776 Result = Context.IntTy;
John McCall711c52b2011-01-05 12:14:39 +0000777 declarator.setInvalidType(true);
Douglas Gregor4b52e252009-12-21 23:17:24 +0000778 }
Chris Lattner958858e2008-02-20 21:40:32 +0000779 break;
Steve Naroffd1861fd2007-07-31 12:34:36 +0000780 }
Anders Carlsson6fd634f2009-06-24 17:47:40 +0000781 case DeclSpec::TST_decltype: {
John McCallb3d87482010-08-24 05:47:05 +0000782 Expr *E = DS.getRepAsExpr();
Anders Carlsson6fd634f2009-06-24 17:47:40 +0000783 assert(E && "Didn't get an expression for decltype?");
784 // TypeQuals handled by caller.
John McCall711c52b2011-01-05 12:14:39 +0000785 Result = S.BuildDecltypeType(E, DS.getTypeSpecTypeLoc());
Anders Carlssonaf017e62009-06-29 22:58:55 +0000786 if (Result.isNull()) {
787 Result = Context.IntTy;
John McCall711c52b2011-01-05 12:14:39 +0000788 declarator.setInvalidType(true);
Anders Carlssonaf017e62009-06-29 22:58:55 +0000789 }
Anders Carlsson6fd634f2009-06-24 17:47:40 +0000790 break;
791 }
Anders Carlssone89d1592009-06-26 18:41:36 +0000792 case DeclSpec::TST_auto: {
793 // TypeQuals handled by caller.
Richard Smith34b41d92011-02-20 03:19:35 +0000794 Result = Context.getAutoType(QualType());
Anders Carlssone89d1592009-06-26 18:41:36 +0000795 break;
796 }
Mike Stump1eb44332009-09-09 15:08:12 +0000797
Douglas Gregor809070a2009-02-18 17:45:20 +0000798 case DeclSpec::TST_error:
Chris Lattner5153ee62009-04-25 08:47:54 +0000799 Result = Context.IntTy;
John McCall711c52b2011-01-05 12:14:39 +0000800 declarator.setInvalidType(true);
Chris Lattner5153ee62009-04-25 08:47:54 +0000801 break;
Reid Spencer5f016e22007-07-11 17:01:13 +0000802 }
Mike Stump1eb44332009-09-09 15:08:12 +0000803
Chris Lattner958858e2008-02-20 21:40:32 +0000804 // Handle complex types.
Douglas Gregorf244cd72009-02-14 21:06:05 +0000805 if (DS.getTypeSpecComplex() == DeclSpec::TSC_complex) {
John McCall711c52b2011-01-05 12:14:39 +0000806 if (S.getLangOptions().Freestanding)
807 S.Diag(DS.getTypeSpecComplexLoc(), diag::ext_freestanding_complex);
Chris Lattnerfab5b452008-02-20 23:53:49 +0000808 Result = Context.getComplexType(Result);
John Thompson82287d12010-02-05 00:12:22 +0000809 } else if (DS.isTypeAltiVecVector()) {
810 unsigned typeSize = static_cast<unsigned>(Context.getTypeSize(Result));
811 assert(typeSize > 0 && "type size for vector must be greater than 0 bits");
Bob Wilsone86d78c2010-11-10 21:56:12 +0000812 VectorType::VectorKind VecKind = VectorType::AltiVecVector;
Chris Lattner788b0fd2010-06-23 06:00:24 +0000813 if (DS.isTypeAltiVecPixel())
Bob Wilsone86d78c2010-11-10 21:56:12 +0000814 VecKind = VectorType::AltiVecPixel;
Chris Lattner788b0fd2010-06-23 06:00:24 +0000815 else if (DS.isTypeAltiVecBool())
Bob Wilsone86d78c2010-11-10 21:56:12 +0000816 VecKind = VectorType::AltiVecBool;
817 Result = Context.getVectorType(Result, 128/typeSize, VecKind);
Douglas Gregorf244cd72009-02-14 21:06:05 +0000818 }
Mike Stump1eb44332009-09-09 15:08:12 +0000819
Argyrios Kyrtzidis47423bd2010-09-23 09:40:31 +0000820 // FIXME: Imaginary.
821 if (DS.getTypeSpecComplex() == DeclSpec::TSC_imaginary)
John McCall711c52b2011-01-05 12:14:39 +0000822 S.Diag(DS.getTypeSpecComplexLoc(), diag::err_imaginary_not_supported);
Mike Stump1eb44332009-09-09 15:08:12 +0000823
John McCall711c52b2011-01-05 12:14:39 +0000824 // Before we process any type attributes, synthesize a block literal
825 // function declarator if necessary.
826 if (declarator.getContext() == Declarator::BlockLiteralContext)
827 maybeSynthesizeBlockSignature(state, Result);
828
829 // Apply any type attributes from the decl spec. This may cause the
830 // list of type attributes to be temporarily saved while the type
831 // attributes are pushed around.
832 if (AttributeList *attrs = DS.getAttributes().getList())
833 processTypeAttrs(state, Result, true, attrs);
Mike Stump1eb44332009-09-09 15:08:12 +0000834
Chris Lattner96b77fc2008-04-02 06:50:17 +0000835 // Apply const/volatile/restrict qualifiers to T.
836 if (unsigned TypeQuals = DS.getTypeQualifiers()) {
837
838 // Enforce C99 6.7.3p2: "Types other than pointer types derived from object
839 // or incomplete types shall not be restrict-qualified." C++ also allows
840 // restrict-qualified references.
John McCall0953e762009-09-24 19:53:00 +0000841 if (TypeQuals & DeclSpec::TQ_restrict) {
Fariborz Jahanian2b5ff1a2009-12-07 18:08:58 +0000842 if (Result->isAnyPointerType() || Result->isReferenceType()) {
843 QualType EltTy;
844 if (Result->isObjCObjectPointerType())
845 EltTy = Result;
846 else
847 EltTy = Result->isPointerType() ?
848 Result->getAs<PointerType>()->getPointeeType() :
849 Result->getAs<ReferenceType>()->getPointeeType();
Mike Stump1eb44332009-09-09 15:08:12 +0000850
Douglas Gregorbad0e652009-03-24 20:32:41 +0000851 // If we have a pointer or reference, the pointee must have an object
Chris Lattnerbdcd6372008-04-02 17:35:06 +0000852 // incomplete type.
853 if (!EltTy->isIncompleteOrObjectType()) {
John McCall711c52b2011-01-05 12:14:39 +0000854 S.Diag(DS.getRestrictSpecLoc(),
Chris Lattnerd3a94e22008-11-20 06:06:08 +0000855 diag::err_typecheck_invalid_restrict_invalid_pointee)
Chris Lattnerd1625842008-11-24 06:25:27 +0000856 << EltTy << DS.getSourceRange();
John McCall0953e762009-09-24 19:53:00 +0000857 TypeQuals &= ~DeclSpec::TQ_restrict; // Remove the restrict qualifier.
Chris Lattnerbdcd6372008-04-02 17:35:06 +0000858 }
859 } else {
John McCall711c52b2011-01-05 12:14:39 +0000860 S.Diag(DS.getRestrictSpecLoc(),
861 diag::err_typecheck_invalid_restrict_not_pointer)
Chris Lattnerd1625842008-11-24 06:25:27 +0000862 << Result << DS.getSourceRange();
John McCall0953e762009-09-24 19:53:00 +0000863 TypeQuals &= ~DeclSpec::TQ_restrict; // Remove the restrict qualifier.
Chris Lattner96b77fc2008-04-02 06:50:17 +0000864 }
Chris Lattner96b77fc2008-04-02 06:50:17 +0000865 }
Mike Stump1eb44332009-09-09 15:08:12 +0000866
Chris Lattner96b77fc2008-04-02 06:50:17 +0000867 // Warn about CV qualifiers on functions: C99 6.7.3p8: "If the specification
868 // of a function type includes any type qualifiers, the behavior is
869 // undefined."
870 if (Result->isFunctionType() && TypeQuals) {
871 // Get some location to point at, either the C or V location.
872 SourceLocation Loc;
John McCall0953e762009-09-24 19:53:00 +0000873 if (TypeQuals & DeclSpec::TQ_const)
Chris Lattner96b77fc2008-04-02 06:50:17 +0000874 Loc = DS.getConstSpecLoc();
John McCall0953e762009-09-24 19:53:00 +0000875 else if (TypeQuals & DeclSpec::TQ_volatile)
Chris Lattner96b77fc2008-04-02 06:50:17 +0000876 Loc = DS.getVolatileSpecLoc();
John McCall0953e762009-09-24 19:53:00 +0000877 else {
878 assert((TypeQuals & DeclSpec::TQ_restrict) &&
879 "Has CVR quals but not C, V, or R?");
880 Loc = DS.getRestrictSpecLoc();
Chris Lattner96b77fc2008-04-02 06:50:17 +0000881 }
John McCall711c52b2011-01-05 12:14:39 +0000882 S.Diag(Loc, diag::warn_typecheck_function_qualifiers)
Chris Lattnerd1625842008-11-24 06:25:27 +0000883 << Result << DS.getSourceRange();
Chris Lattner96b77fc2008-04-02 06:50:17 +0000884 }
Mike Stump1eb44332009-09-09 15:08:12 +0000885
Douglas Gregorf1f9b4e2008-11-03 15:51:28 +0000886 // C++ [dcl.ref]p1:
887 // Cv-qualified references are ill-formed except when the
888 // cv-qualifiers are introduced through the use of a typedef
889 // (7.1.3) or of a template type argument (14.3), in which
890 // case the cv-qualifiers are ignored.
Douglas Gregor1a51b4a2009-02-09 15:09:02 +0000891 // FIXME: Shouldn't we be checking SCS_typedef here?
892 if (DS.getTypeSpecType() == DeclSpec::TST_typename &&
Douglas Gregorf1f9b4e2008-11-03 15:51:28 +0000893 TypeQuals && Result->isReferenceType()) {
John McCall0953e762009-09-24 19:53:00 +0000894 TypeQuals &= ~DeclSpec::TQ_const;
895 TypeQuals &= ~DeclSpec::TQ_volatile;
Mike Stump1eb44332009-09-09 15:08:12 +0000896 }
897
John McCall0953e762009-09-24 19:53:00 +0000898 Qualifiers Quals = Qualifiers::fromCVRMask(TypeQuals);
899 Result = Context.getQualifiedType(Result, Quals);
Chris Lattner96b77fc2008-04-02 06:50:17 +0000900 }
John McCall0953e762009-09-24 19:53:00 +0000901
Chris Lattnerf1d705c2008-02-21 01:07:18 +0000902 return Result;
903}
904
Douglas Gregorcd281c32009-02-28 00:25:32 +0000905static std::string getPrintableNameForEntity(DeclarationName Entity) {
906 if (Entity)
907 return Entity.getAsString();
Mike Stump1eb44332009-09-09 15:08:12 +0000908
Douglas Gregorcd281c32009-02-28 00:25:32 +0000909 return "type name";
910}
911
John McCall28654742010-06-05 06:41:15 +0000912QualType Sema::BuildQualifiedType(QualType T, SourceLocation Loc,
913 Qualifiers Qs) {
914 // Enforce C99 6.7.3p2: "Types other than pointer types derived from
915 // object or incomplete types shall not be restrict-qualified."
916 if (Qs.hasRestrict()) {
917 unsigned DiagID = 0;
918 QualType ProblemTy;
919
920 const Type *Ty = T->getCanonicalTypeInternal().getTypePtr();
921 if (const ReferenceType *RTy = dyn_cast<ReferenceType>(Ty)) {
922 if (!RTy->getPointeeType()->isIncompleteOrObjectType()) {
923 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
924 ProblemTy = T->getAs<ReferenceType>()->getPointeeType();
925 }
926 } else if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
927 if (!PTy->getPointeeType()->isIncompleteOrObjectType()) {
928 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
929 ProblemTy = T->getAs<PointerType>()->getPointeeType();
930 }
931 } else if (const MemberPointerType *PTy = dyn_cast<MemberPointerType>(Ty)) {
932 if (!PTy->getPointeeType()->isIncompleteOrObjectType()) {
933 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
934 ProblemTy = T->getAs<PointerType>()->getPointeeType();
935 }
936 } else if (!Ty->isDependentType()) {
937 // FIXME: this deserves a proper diagnostic
938 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
939 ProblemTy = T;
940 }
941
942 if (DiagID) {
943 Diag(Loc, DiagID) << ProblemTy;
944 Qs.removeRestrict();
945 }
946 }
947
948 return Context.getQualifiedType(T, Qs);
949}
950
Abramo Bagnara075f8f12010-12-10 16:29:40 +0000951/// \brief Build a paren type including \p T.
952QualType Sema::BuildParenType(QualType T) {
953 return Context.getParenType(T);
954}
955
Douglas Gregorcd281c32009-02-28 00:25:32 +0000956/// \brief Build a pointer type.
957///
958/// \param T The type to which we'll be building a pointer.
959///
Douglas Gregorcd281c32009-02-28 00:25:32 +0000960/// \param Loc The location of the entity whose type involves this
961/// pointer type or, if there is no such entity, the location of the
962/// type that will have pointer type.
963///
964/// \param Entity The name of the entity that involves the pointer
965/// type, if known.
966///
967/// \returns A suitable pointer type, if there are no
968/// errors. Otherwise, returns a NULL type.
John McCall28654742010-06-05 06:41:15 +0000969QualType Sema::BuildPointerType(QualType T,
Douglas Gregorcd281c32009-02-28 00:25:32 +0000970 SourceLocation Loc, DeclarationName Entity) {
971 if (T->isReferenceType()) {
972 // C++ 8.3.2p4: There shall be no ... pointers to references ...
973 Diag(Loc, diag::err_illegal_decl_pointer_to_reference)
John McCallac406052009-10-30 00:37:20 +0000974 << getPrintableNameForEntity(Entity) << T;
Douglas Gregorcd281c32009-02-28 00:25:32 +0000975 return QualType();
976 }
977
John McCallc12c5bb2010-05-15 11:32:37 +0000978 assert(!T->isObjCObjectType() && "Should build ObjCObjectPointerType");
Douglas Gregor92e986e2010-04-22 16:44:27 +0000979
Douglas Gregorcd281c32009-02-28 00:25:32 +0000980 // Build the pointer type.
John McCall28654742010-06-05 06:41:15 +0000981 return Context.getPointerType(T);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000982}
983
984/// \brief Build a reference type.
985///
986/// \param T The type to which we'll be building a reference.
987///
Douglas Gregorcd281c32009-02-28 00:25:32 +0000988/// \param Loc The location of the entity whose type involves this
989/// reference type or, if there is no such entity, the location of the
990/// type that will have reference type.
991///
992/// \param Entity The name of the entity that involves the reference
993/// type, if known.
994///
995/// \returns A suitable reference type, if there are no
996/// errors. Otherwise, returns a NULL type.
John McCall54e14c42009-10-22 22:37:11 +0000997QualType Sema::BuildReferenceType(QualType T, bool SpelledAsLValue,
John McCall28654742010-06-05 06:41:15 +0000998 SourceLocation Loc,
John McCall54e14c42009-10-22 22:37:11 +0000999 DeclarationName Entity) {
Douglas Gregor69d83162011-01-20 16:08:06 +00001000 // C++0x [dcl.ref]p6:
1001 // If a typedef (7.1.3), a type template-parameter (14.3.1), or a
1002 // decltype-specifier (7.1.6.2) denotes a type TR that is a reference to a
1003 // type T, an attempt to create the type "lvalue reference to cv TR" creates
1004 // the type "lvalue reference to T", while an attempt to create the type
1005 // "rvalue reference to cv TR" creates the type TR.
John McCall54e14c42009-10-22 22:37:11 +00001006 bool LValueRef = SpelledAsLValue || T->getAs<LValueReferenceType>();
1007
John McCall54e14c42009-10-22 22:37:11 +00001008 // C++ [dcl.ref]p4: There shall be no references to references.
1009 //
1010 // According to C++ DR 106, references to references are only
1011 // diagnosed when they are written directly (e.g., "int & &"),
1012 // but not when they happen via a typedef:
1013 //
1014 // typedef int& intref;
1015 // typedef intref& intref2;
1016 //
1017 // Parser::ParseDeclaratorInternal diagnoses the case where
1018 // references are written directly; here, we handle the
Douglas Gregor69d83162011-01-20 16:08:06 +00001019 // collapsing of references-to-references as described in C++0x.
1020 // DR 106 and 540 introduce reference-collapsing into C++98/03.
Douglas Gregorcd281c32009-02-28 00:25:32 +00001021
1022 // C++ [dcl.ref]p1:
Eli Friedman33a31382009-08-05 19:21:58 +00001023 // A declarator that specifies the type "reference to cv void"
Douglas Gregorcd281c32009-02-28 00:25:32 +00001024 // is ill-formed.
1025 if (T->isVoidType()) {
1026 Diag(Loc, diag::err_reference_to_void);
1027 return QualType();
1028 }
1029
Douglas Gregorcd281c32009-02-28 00:25:32 +00001030 // Handle restrict on references.
Sebastian Redl7c80bd62009-03-16 23:22:08 +00001031 if (LValueRef)
John McCall28654742010-06-05 06:41:15 +00001032 return Context.getLValueReferenceType(T, SpelledAsLValue);
1033 return Context.getRValueReferenceType(T);
Douglas Gregorcd281c32009-02-28 00:25:32 +00001034}
1035
1036/// \brief Build an array type.
1037///
1038/// \param T The type of each element in the array.
1039///
1040/// \param ASM C99 array size modifier (e.g., '*', 'static').
Mike Stump1eb44332009-09-09 15:08:12 +00001041///
1042/// \param ArraySize Expression describing the size of the array.
Douglas Gregorcd281c32009-02-28 00:25:32 +00001043///
Douglas Gregorcd281c32009-02-28 00:25:32 +00001044/// \param Loc The location of the entity whose type involves this
1045/// array type or, if there is no such entity, the location of the
1046/// type that will have array type.
1047///
1048/// \param Entity The name of the entity that involves the array
1049/// type, if known.
1050///
1051/// \returns A suitable array type, if there are no errors. Otherwise,
1052/// returns a NULL type.
1053QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM,
1054 Expr *ArraySize, unsigned Quals,
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001055 SourceRange Brackets, DeclarationName Entity) {
John McCall0953e762009-09-24 19:53:00 +00001056
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001057 SourceLocation Loc = Brackets.getBegin();
Sebastian Redl923d56d2009-11-05 15:52:31 +00001058 if (getLangOptions().CPlusPlus) {
Douglas Gregor138bb232010-04-27 19:38:14 +00001059 // C++ [dcl.array]p1:
1060 // T is called the array element type; this type shall not be a reference
1061 // type, the (possibly cv-qualified) type void, a function type or an
1062 // abstract class type.
1063 //
1064 // Note: function types are handled in the common path with C.
1065 if (T->isReferenceType()) {
1066 Diag(Loc, diag::err_illegal_decl_array_of_references)
1067 << getPrintableNameForEntity(Entity) << T;
1068 return QualType();
1069 }
1070
Sebastian Redl923d56d2009-11-05 15:52:31 +00001071 if (T->isVoidType()) {
1072 Diag(Loc, diag::err_illegal_decl_array_incomplete_type) << T;
1073 return QualType();
1074 }
Douglas Gregor138bb232010-04-27 19:38:14 +00001075
1076 if (RequireNonAbstractType(Brackets.getBegin(), T,
1077 diag::err_array_of_abstract_type))
1078 return QualType();
1079
Sebastian Redl923d56d2009-11-05 15:52:31 +00001080 } else {
Douglas Gregor138bb232010-04-27 19:38:14 +00001081 // C99 6.7.5.2p1: If the element type is an incomplete or function type,
1082 // reject it (e.g. void ary[7], struct foo ary[7], void ary[7]())
Sebastian Redl923d56d2009-11-05 15:52:31 +00001083 if (RequireCompleteType(Loc, T,
1084 diag::err_illegal_decl_array_incomplete_type))
1085 return QualType();
1086 }
Douglas Gregorcd281c32009-02-28 00:25:32 +00001087
1088 if (T->isFunctionType()) {
1089 Diag(Loc, diag::err_illegal_decl_array_of_functions)
John McCallac406052009-10-30 00:37:20 +00001090 << getPrintableNameForEntity(Entity) << T;
Douglas Gregorcd281c32009-02-28 00:25:32 +00001091 return QualType();
1092 }
Mike Stump1eb44332009-09-09 15:08:12 +00001093
Richard Smith34b41d92011-02-20 03:19:35 +00001094 if (T->getContainedAutoType()) {
1095 Diag(Loc, diag::err_illegal_decl_array_of_auto)
1096 << getPrintableNameForEntity(Entity) << T;
Anders Carlssone7cf07d2009-06-26 19:33:28 +00001097 return QualType();
1098 }
Mike Stump1eb44332009-09-09 15:08:12 +00001099
Ted Kremenek6217b802009-07-29 21:53:49 +00001100 if (const RecordType *EltTy = T->getAs<RecordType>()) {
Douglas Gregorcd281c32009-02-28 00:25:32 +00001101 // If the element type is a struct or union that contains a variadic
1102 // array, accept it as a GNU extension: C99 6.7.2.1p2.
1103 if (EltTy->getDecl()->hasFlexibleArrayMember())
1104 Diag(Loc, diag::ext_flexible_array_in_array) << T;
John McCallc12c5bb2010-05-15 11:32:37 +00001105 } else if (T->isObjCObjectType()) {
Chris Lattnerc7c11b12009-04-27 01:55:56 +00001106 Diag(Loc, diag::err_objc_array_of_interfaces) << T;
1107 return QualType();
Douglas Gregorcd281c32009-02-28 00:25:32 +00001108 }
Mike Stump1eb44332009-09-09 15:08:12 +00001109
John McCall5e3c67b2010-12-15 04:42:30 +00001110 // Do lvalue-to-rvalue conversions on the array size expression.
1111 if (ArraySize && !ArraySize->isRValue())
1112 DefaultLvalueConversion(ArraySize);
1113
Douglas Gregorcd281c32009-02-28 00:25:32 +00001114 // C99 6.7.5.2p1: The size expression shall have integer type.
John McCall5e3c67b2010-12-15 04:42:30 +00001115 // TODO: in theory, if we were insane, we could allow contextual
1116 // conversions to integer type here.
Douglas Gregorcd281c32009-02-28 00:25:32 +00001117 if (ArraySize && !ArraySize->isTypeDependent() &&
Douglas Gregor1274ccd2010-10-08 23:50:27 +00001118 !ArraySize->getType()->isIntegralOrUnscopedEnumerationType()) {
Douglas Gregorcd281c32009-02-28 00:25:32 +00001119 Diag(ArraySize->getLocStart(), diag::err_array_size_non_int)
1120 << ArraySize->getType() << ArraySize->getSourceRange();
Douglas Gregorcd281c32009-02-28 00:25:32 +00001121 return QualType();
1122 }
Douglas Gregor2767ce22010-08-18 00:39:00 +00001123 llvm::APSInt ConstVal(Context.getTypeSize(Context.getSizeType()));
Douglas Gregorcd281c32009-02-28 00:25:32 +00001124 if (!ArraySize) {
Eli Friedmanf91f5c82009-04-26 21:57:51 +00001125 if (ASM == ArrayType::Star)
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001126 T = Context.getVariableArrayType(T, 0, ASM, Quals, Brackets);
Eli Friedmanf91f5c82009-04-26 21:57:51 +00001127 else
1128 T = Context.getIncompleteArrayType(T, ASM, Quals);
Douglas Gregorac06a0e2010-05-18 23:01:22 +00001129 } else if (ArraySize->isTypeDependent() || ArraySize->isValueDependent()) {
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001130 T = Context.getDependentSizedArrayType(T, ArraySize, ASM, Quals, Brackets);
Douglas Gregorcd281c32009-02-28 00:25:32 +00001131 } else if (!ArraySize->isIntegerConstantExpr(ConstVal, Context) ||
Sebastian Redl923d56d2009-11-05 15:52:31 +00001132 (!T->isDependentType() && !T->isIncompleteType() &&
1133 !T->isConstantSizeType())) {
Douglas Gregorcd281c32009-02-28 00:25:32 +00001134 // Per C99, a variable array is an array with either a non-constant
1135 // size or an element type that has a non-constant-size
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001136 T = Context.getVariableArrayType(T, ArraySize, ASM, Quals, Brackets);
Douglas Gregorcd281c32009-02-28 00:25:32 +00001137 } else {
1138 // C99 6.7.5.2p1: If the expression is a constant expression, it shall
1139 // have a value greater than zero.
Sebastian Redl923d56d2009-11-05 15:52:31 +00001140 if (ConstVal.isSigned() && ConstVal.isNegative()) {
Chandler Carruthb2b5cc02011-01-04 04:44:35 +00001141 if (Entity)
1142 Diag(ArraySize->getLocStart(), diag::err_decl_negative_array_size)
1143 << getPrintableNameForEntity(Entity) << ArraySize->getSourceRange();
1144 else
1145 Diag(ArraySize->getLocStart(), diag::err_typecheck_negative_array_size)
1146 << ArraySize->getSourceRange();
Sebastian Redl923d56d2009-11-05 15:52:31 +00001147 return QualType();
1148 }
1149 if (ConstVal == 0) {
Douglas Gregor02024a92010-03-28 02:42:43 +00001150 // GCC accepts zero sized static arrays. We allow them when
1151 // we're not in a SFINAE context.
1152 Diag(ArraySize->getLocStart(),
1153 isSFINAEContext()? diag::err_typecheck_zero_array_size
1154 : diag::ext_typecheck_zero_array_size)
Sebastian Redl923d56d2009-11-05 15:52:31 +00001155 << ArraySize->getSourceRange();
Douglas Gregor2767ce22010-08-18 00:39:00 +00001156 } else if (!T->isDependentType() && !T->isVariablyModifiedType() &&
1157 !T->isIncompleteType()) {
1158 // Is the array too large?
1159 unsigned ActiveSizeBits
1160 = ConstantArrayType::getNumAddressingBits(Context, T, ConstVal);
1161 if (ActiveSizeBits > ConstantArrayType::getMaxSizeBits(Context))
1162 Diag(ArraySize->getLocStart(), diag::err_array_too_large)
1163 << ConstVal.toString(10)
1164 << ArraySize->getSourceRange();
Mike Stump1eb44332009-09-09 15:08:12 +00001165 }
Douglas Gregor2767ce22010-08-18 00:39:00 +00001166
John McCall46a617a2009-10-16 00:14:28 +00001167 T = Context.getConstantArrayType(T, ConstVal, ASM, Quals);
Douglas Gregorcd281c32009-02-28 00:25:32 +00001168 }
David Chisnallaf407762010-01-11 23:08:08 +00001169 // If this is not C99, extwarn about VLA's and C99 array size modifiers.
1170 if (!getLangOptions().C99) {
Douglas Gregor0fddb972010-05-22 16:17:30 +00001171 if (T->isVariableArrayType()) {
1172 // Prohibit the use of non-POD types in VLAs.
Douglas Gregor204ce172010-05-24 20:42:30 +00001173 if (!T->isDependentType() &&
1174 !Context.getBaseElementType(T)->isPODType()) {
Douglas Gregor0fddb972010-05-22 16:17:30 +00001175 Diag(Loc, diag::err_vla_non_pod)
1176 << Context.getBaseElementType(T);
1177 return QualType();
1178 }
Douglas Gregora481ec42010-05-23 19:57:01 +00001179 // Prohibit the use of VLAs during template argument deduction.
1180 else if (isSFINAEContext()) {
1181 Diag(Loc, diag::err_vla_in_sfinae);
1182 return QualType();
1183 }
Douglas Gregor0fddb972010-05-22 16:17:30 +00001184 // Just extwarn about VLAs.
1185 else
1186 Diag(Loc, diag::ext_vla);
1187 } else if (ASM != ArrayType::Normal || Quals != 0)
Douglas Gregor043cad22009-09-11 00:18:58 +00001188 Diag(Loc,
1189 getLangOptions().CPlusPlus? diag::err_c99_array_usage_cxx
1190 : diag::ext_c99_array_usage);
Douglas Gregorcd281c32009-02-28 00:25:32 +00001191 }
1192
1193 return T;
1194}
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001195
1196/// \brief Build an ext-vector type.
1197///
1198/// Run the required checks for the extended vector type.
John McCall9ae2f072010-08-23 23:25:46 +00001199QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize,
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001200 SourceLocation AttrLoc) {
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001201 // unlike gcc's vector_size attribute, we do not allow vectors to be defined
1202 // in conjunction with complex types (pointers, arrays, functions, etc.).
Mike Stump1eb44332009-09-09 15:08:12 +00001203 if (!T->isDependentType() &&
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001204 !T->isIntegerType() && !T->isRealFloatingType()) {
1205 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) << T;
1206 return QualType();
1207 }
1208
John McCall9ae2f072010-08-23 23:25:46 +00001209 if (!ArraySize->isTypeDependent() && !ArraySize->isValueDependent()) {
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001210 llvm::APSInt vecSize(32);
John McCall9ae2f072010-08-23 23:25:46 +00001211 if (!ArraySize->isIntegerConstantExpr(vecSize, Context)) {
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001212 Diag(AttrLoc, diag::err_attribute_argument_not_int)
John McCall9ae2f072010-08-23 23:25:46 +00001213 << "ext_vector_type" << ArraySize->getSourceRange();
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001214 return QualType();
1215 }
Mike Stump1eb44332009-09-09 15:08:12 +00001216
1217 // unlike gcc's vector_size attribute, the size is specified as the
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001218 // number of elements, not the number of bytes.
Mike Stump1eb44332009-09-09 15:08:12 +00001219 unsigned vectorSize = static_cast<unsigned>(vecSize.getZExtValue());
1220
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001221 if (vectorSize == 0) {
1222 Diag(AttrLoc, diag::err_attribute_zero_size)
John McCall9ae2f072010-08-23 23:25:46 +00001223 << ArraySize->getSourceRange();
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001224 return QualType();
1225 }
Mike Stump1eb44332009-09-09 15:08:12 +00001226
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001227 if (!T->isDependentType())
1228 return Context.getExtVectorType(T, vectorSize);
Mike Stump1eb44332009-09-09 15:08:12 +00001229 }
1230
John McCall9ae2f072010-08-23 23:25:46 +00001231 return Context.getDependentSizedExtVectorType(T, ArraySize, AttrLoc);
Douglas Gregor9cdda0c2009-06-17 21:51:59 +00001232}
Mike Stump1eb44332009-09-09 15:08:12 +00001233
Douglas Gregor724651c2009-02-28 01:04:19 +00001234/// \brief Build a function type.
1235///
1236/// This routine checks the function type according to C++ rules and
1237/// under the assumption that the result type and parameter types have
1238/// just been instantiated from a template. It therefore duplicates
Douglas Gregor2943aed2009-03-03 04:44:36 +00001239/// some of the behavior of GetTypeForDeclarator, but in a much
Douglas Gregor724651c2009-02-28 01:04:19 +00001240/// simpler form that is only suitable for this narrow use case.
1241///
1242/// \param T The return type of the function.
1243///
1244/// \param ParamTypes The parameter types of the function. This array
1245/// will be modified to account for adjustments to the types of the
1246/// function parameters.
1247///
1248/// \param NumParamTypes The number of parameter types in ParamTypes.
1249///
1250/// \param Variadic Whether this is a variadic function type.
1251///
1252/// \param Quals The cvr-qualifiers to be applied to the function type.
1253///
1254/// \param Loc The location of the entity whose type involves this
1255/// function type or, if there is no such entity, the location of the
1256/// type that will have function type.
1257///
1258/// \param Entity The name of the entity that involves the function
1259/// type, if known.
1260///
1261/// \returns A suitable function type, if there are no
1262/// errors. Otherwise, returns a NULL type.
1263QualType Sema::BuildFunctionType(QualType T,
Mike Stump1eb44332009-09-09 15:08:12 +00001264 QualType *ParamTypes,
Douglas Gregor724651c2009-02-28 01:04:19 +00001265 unsigned NumParamTypes,
1266 bool Variadic, unsigned Quals,
Douglas Gregorc938c162011-01-26 05:01:58 +00001267 RefQualifierKind RefQualifier,
Eli Friedmanfa869542010-08-05 02:54:05 +00001268 SourceLocation Loc, DeclarationName Entity,
John McCalle23cf432010-12-14 08:05:40 +00001269 FunctionType::ExtInfo Info) {
Douglas Gregor724651c2009-02-28 01:04:19 +00001270 if (T->isArrayType() || T->isFunctionType()) {
Douglas Gregor58408bc2010-01-11 18:46:21 +00001271 Diag(Loc, diag::err_func_returning_array_function)
1272 << T->isFunctionType() << T;
Douglas Gregor724651c2009-02-28 01:04:19 +00001273 return QualType();
1274 }
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001275
Douglas Gregor724651c2009-02-28 01:04:19 +00001276 bool Invalid = false;
1277 for (unsigned Idx = 0; Idx < NumParamTypes; ++Idx) {
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001278 QualType ParamType = adjustParameterType(ParamTypes[Idx]);
1279 if (ParamType->isVoidType()) {
Douglas Gregor724651c2009-02-28 01:04:19 +00001280 Diag(Loc, diag::err_param_with_void_type);
1281 Invalid = true;
1282 }
Douglas Gregorcd281c32009-02-28 00:25:32 +00001283
John McCall54e14c42009-10-22 22:37:11 +00001284 ParamTypes[Idx] = ParamType;
Douglas Gregor724651c2009-02-28 01:04:19 +00001285 }
1286
1287 if (Invalid)
1288 return QualType();
1289
John McCalle23cf432010-12-14 08:05:40 +00001290 FunctionProtoType::ExtProtoInfo EPI;
1291 EPI.Variadic = Variadic;
1292 EPI.TypeQuals = Quals;
Douglas Gregorc938c162011-01-26 05:01:58 +00001293 EPI.RefQualifier = RefQualifier;
John McCalle23cf432010-12-14 08:05:40 +00001294 EPI.ExtInfo = Info;
1295
1296 return Context.getFunctionType(T, ParamTypes, NumParamTypes, EPI);
Douglas Gregor724651c2009-02-28 01:04:19 +00001297}
Mike Stump1eb44332009-09-09 15:08:12 +00001298
Douglas Gregor949bf692009-06-09 22:17:39 +00001299/// \brief Build a member pointer type \c T Class::*.
1300///
1301/// \param T the type to which the member pointer refers.
1302/// \param Class the class type into which the member pointer points.
John McCall0953e762009-09-24 19:53:00 +00001303/// \param CVR Qualifiers applied to the member pointer type
Douglas Gregor949bf692009-06-09 22:17:39 +00001304/// \param Loc the location where this type begins
1305/// \param Entity the name of the entity that will have this member pointer type
1306///
1307/// \returns a member pointer type, if successful, or a NULL type if there was
1308/// an error.
Mike Stump1eb44332009-09-09 15:08:12 +00001309QualType Sema::BuildMemberPointerType(QualType T, QualType Class,
John McCall28654742010-06-05 06:41:15 +00001310 SourceLocation Loc,
Douglas Gregor949bf692009-06-09 22:17:39 +00001311 DeclarationName Entity) {
1312 // Verify that we're not building a pointer to pointer to function with
1313 // exception specification.
1314 if (CheckDistantExceptionSpec(T)) {
1315 Diag(Loc, diag::err_distant_exception_spec);
1316
1317 // FIXME: If we're doing this as part of template instantiation,
1318 // we should return immediately.
1319
1320 // Build the type anyway, but use the canonical type so that the
1321 // exception specifiers are stripped off.
1322 T = Context.getCanonicalType(T);
1323 }
1324
Sebastian Redl73780122010-06-09 21:19:43 +00001325 // C++ 8.3.3p3: A pointer to member shall not point to ... a member
Douglas Gregor949bf692009-06-09 22:17:39 +00001326 // with reference type, or "cv void."
1327 if (T->isReferenceType()) {
Anders Carlsson8d4655d2009-06-30 00:06:57 +00001328 Diag(Loc, diag::err_illegal_decl_mempointer_to_reference)
John McCallac406052009-10-30 00:37:20 +00001329 << (Entity? Entity.getAsString() : "type name") << T;
Douglas Gregor949bf692009-06-09 22:17:39 +00001330 return QualType();
1331 }
1332
1333 if (T->isVoidType()) {
1334 Diag(Loc, diag::err_illegal_decl_mempointer_to_void)
1335 << (Entity? Entity.getAsString() : "type name");
1336 return QualType();
1337 }
1338
Douglas Gregor949bf692009-06-09 22:17:39 +00001339 if (!Class->isDependentType() && !Class->isRecordType()) {
1340 Diag(Loc, diag::err_mempointer_in_nonclass_type) << Class;
1341 return QualType();
1342 }
1343
Charles Davisd18f9f92010-08-16 04:01:50 +00001344 // In the Microsoft ABI, the class is allowed to be an incomplete
1345 // type. In such cases, the compiler makes a worst-case assumption.
1346 // We make no such assumption right now, so emit an error if the
1347 // class isn't a complete type.
Charles Davis20cf7172010-08-19 02:18:14 +00001348 if (Context.Target.getCXXABI() == CXXABI_Microsoft &&
Charles Davisd18f9f92010-08-16 04:01:50 +00001349 RequireCompleteType(Loc, Class, diag::err_incomplete_type))
1350 return QualType();
1351
John McCall28654742010-06-05 06:41:15 +00001352 return Context.getMemberPointerType(T, Class.getTypePtr());
Douglas Gregor949bf692009-06-09 22:17:39 +00001353}
Mike Stump1eb44332009-09-09 15:08:12 +00001354
Anders Carlsson9a917e42009-06-12 22:56:54 +00001355/// \brief Build a block pointer type.
1356///
1357/// \param T The type to which we'll be building a block pointer.
1358///
John McCall0953e762009-09-24 19:53:00 +00001359/// \param CVR The cvr-qualifiers to be applied to the block pointer type.
Anders Carlsson9a917e42009-06-12 22:56:54 +00001360///
1361/// \param Loc The location of the entity whose type involves this
1362/// block pointer type or, if there is no such entity, the location of the
1363/// type that will have block pointer type.
1364///
1365/// \param Entity The name of the entity that involves the block pointer
1366/// type, if known.
1367///
1368/// \returns A suitable block pointer type, if there are no
1369/// errors. Otherwise, returns a NULL type.
John McCall28654742010-06-05 06:41:15 +00001370QualType Sema::BuildBlockPointerType(QualType T,
Mike Stump1eb44332009-09-09 15:08:12 +00001371 SourceLocation Loc,
Anders Carlsson9a917e42009-06-12 22:56:54 +00001372 DeclarationName Entity) {
John McCall0953e762009-09-24 19:53:00 +00001373 if (!T->isFunctionType()) {
Anders Carlsson9a917e42009-06-12 22:56:54 +00001374 Diag(Loc, diag::err_nonfunction_block_type);
1375 return QualType();
1376 }
Mike Stump1eb44332009-09-09 15:08:12 +00001377
John McCall28654742010-06-05 06:41:15 +00001378 return Context.getBlockPointerType(T);
Anders Carlsson9a917e42009-06-12 22:56:54 +00001379}
1380
John McCallb3d87482010-08-24 05:47:05 +00001381QualType Sema::GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo) {
1382 QualType QT = Ty.get();
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001383 if (QT.isNull()) {
John McCalla93c9342009-12-07 02:54:59 +00001384 if (TInfo) *TInfo = 0;
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001385 return QualType();
1386 }
1387
John McCalla93c9342009-12-07 02:54:59 +00001388 TypeSourceInfo *DI = 0;
John McCallf4c73712011-01-19 06:33:43 +00001389 if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) {
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +00001390 QT = LIT->getType();
John McCalla93c9342009-12-07 02:54:59 +00001391 DI = LIT->getTypeSourceInfo();
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +00001392 }
Mike Stump1eb44332009-09-09 15:08:12 +00001393
John McCalla93c9342009-12-07 02:54:59 +00001394 if (TInfo) *TInfo = DI;
Argyrios Kyrtzidise8661902009-08-19 01:28:28 +00001395 return QT;
1396}
1397
Chandler Carruthd067c072011-02-23 18:51:59 +00001398static void DiagnoseIgnoredQualifiers(unsigned Quals,
1399 SourceLocation ConstQualLoc,
1400 SourceLocation VolatileQualLoc,
1401 SourceLocation RestrictQualLoc,
1402 Sema& S) {
1403 std::string QualStr;
1404 unsigned NumQuals = 0;
1405 SourceLocation Loc;
1406
1407 FixItHint ConstFixIt;
1408 FixItHint VolatileFixIt;
1409 FixItHint RestrictFixIt;
1410
1411 // FIXME: The locations here are set kind of arbitrarily. It'd be nicer to
1412 // find a range and grow it to encompass all the qualifiers, regardless of
1413 // the order in which they textually appear.
1414 if (Quals & Qualifiers::Const) {
1415 ConstFixIt = FixItHint::CreateRemoval(ConstQualLoc);
1416 Loc = ConstQualLoc;
1417 ++NumQuals;
1418 QualStr = "const";
1419 }
1420 if (Quals & Qualifiers::Volatile) {
1421 VolatileFixIt = FixItHint::CreateRemoval(VolatileQualLoc);
1422 if (NumQuals == 0) {
1423 Loc = VolatileQualLoc;
1424 QualStr = "volatile";
1425 } else {
1426 QualStr += " volatile";
1427 }
1428 ++NumQuals;
1429 }
1430 if (Quals & Qualifiers::Restrict) {
1431 RestrictFixIt = FixItHint::CreateRemoval(RestrictQualLoc);
1432 if (NumQuals == 0) {
1433 Loc = RestrictQualLoc;
1434 QualStr = "restrict";
1435 } else {
1436 QualStr += " restrict";
1437 }
1438 ++NumQuals;
1439 }
1440
1441 assert(NumQuals > 0 && "No known qualifiers?");
1442
1443 S.Diag(Loc, diag::warn_qual_return_type)
1444 << QualStr << NumQuals
1445 << ConstFixIt << VolatileFixIt << RestrictFixIt;
1446}
1447
Mike Stump98eb8a72009-02-04 22:31:32 +00001448/// GetTypeForDeclarator - Convert the type for the specified
Sebastian Redl8ce35b02009-10-25 21:45:37 +00001449/// declarator to Type instances.
Douglas Gregor402abb52009-05-28 23:31:59 +00001450///
1451/// If OwnedDecl is non-NULL, and this declarator's decl-specifier-seq
1452/// owns the declaration of a type (e.g., the definition of a struct
1453/// type), then *OwnedDecl will receive the owned declaration.
John McCallbf1a0282010-06-04 23:28:52 +00001454///
1455/// The result of this call will never be null, but the associated
1456/// type may be a null type if there's an unrecoverable error.
1457TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
Richard Smith34b41d92011-02-20 03:19:35 +00001458 TagDecl **OwnedDecl,
1459 bool AutoAllowedInTypeName) {
Douglas Gregor930d8b52009-01-30 22:09:00 +00001460 // Determine the type of the declarator. Not all forms of declarator
1461 // have a type.
1462 QualType T;
Douglas Gregor05baacb2010-04-12 23:19:01 +00001463 TypeSourceInfo *ReturnTypeInfo = 0;
John McCall711c52b2011-01-05 12:14:39 +00001464
1465 TypeProcessingState state(*this, D);
John McCall04a67a62010-02-05 21:31:56 +00001466
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001467 switch (D.getName().getKind()) {
1468 case UnqualifiedId::IK_Identifier:
1469 case UnqualifiedId::IK_OperatorFunctionId:
Sean Hunt0486d742009-11-28 04:44:28 +00001470 case UnqualifiedId::IK_LiteralOperatorId:
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001471 case UnqualifiedId::IK_TemplateId:
John McCall711c52b2011-01-05 12:14:39 +00001472 T = ConvertDeclSpecToType(*this, state);
Chris Lattner5db2bb12009-10-25 18:21:37 +00001473
Douglas Gregor591bd3c2010-02-08 22:07:33 +00001474 if (!D.isInvalidType() && D.getDeclSpec().isTypeSpecOwned()) {
John McCallb3d87482010-08-24 05:47:05 +00001475 TagDecl* Owned = cast<TagDecl>(D.getDeclSpec().getRepAsDecl());
Douglas Gregorb37b6482010-02-12 17:40:34 +00001476 // Owned is embedded if it was defined here, or if it is the
1477 // very first (i.e., canonical) declaration of this tag type.
1478 Owned->setEmbeddedInDeclarator(Owned->isDefinition() ||
1479 Owned->isCanonicalDecl());
Douglas Gregor591bd3c2010-02-08 22:07:33 +00001480 if (OwnedDecl) *OwnedDecl = Owned;
1481 }
Douglas Gregor930d8b52009-01-30 22:09:00 +00001482 break;
1483
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001484 case UnqualifiedId::IK_ConstructorName:
Douglas Gregor0efc2c12010-01-13 17:31:36 +00001485 case UnqualifiedId::IK_ConstructorTemplateId:
Douglas Gregor3f9a0562009-11-03 01:35:08 +00001486 case UnqualifiedId::IK_DestructorName:
Douglas Gregor930d8b52009-01-30 22:09:00 +00001487 // Constructors and destructors don't have return types. Use
Douglas Gregor48026d22010-01-11 18:40:55 +00001488 // "void" instead.
Douglas Gregor930d8b52009-01-30 22:09:00 +00001489 T = Context.VoidTy;
1490 break;
Douglas Gregor48026d22010-01-11 18:40:55 +00001491
1492 case UnqualifiedId::IK_ConversionFunctionId:
1493 // The result type of a conversion function is the type that it
1494 // converts to.
Douglas Gregor05baacb2010-04-12 23:19:01 +00001495 T = GetTypeFromParser(D.getName().ConversionFunctionId,
John McCallbf1a0282010-06-04 23:28:52 +00001496 &ReturnTypeInfo);
Douglas Gregor48026d22010-01-11 18:40:55 +00001497 break;
Douglas Gregor930d8b52009-01-30 22:09:00 +00001498 }
Douglas Gregordab60ad2010-10-01 18:44:50 +00001499
John McCall711c52b2011-01-05 12:14:39 +00001500 if (D.getAttributes())
1501 distributeTypeAttrsFromDeclarator(state, T);
1502
Richard Smithe7397c62011-02-22 00:36:53 +00001503 // C++0x [dcl.spec.auto]p5: reject 'auto' if it is not in an allowed context.
Richard Smith8110f042011-02-22 01:22:29 +00001504 // In C++0x, a function declarator using 'auto' must have a trailing return
1505 // type (this is checked later) and we can skip this. In other languages
1506 // using auto, we need to check regardless.
Richard Smith34b41d92011-02-20 03:19:35 +00001507 if (D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_auto &&
Richard Smith8110f042011-02-22 01:22:29 +00001508 (!getLangOptions().CPlusPlus0x || !D.isFunctionDeclarator())) {
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001509 int Error = -1;
Mike Stump1eb44332009-09-09 15:08:12 +00001510
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001511 switch (D.getContext()) {
1512 case Declarator::KNRTypeListContext:
1513 assert(0 && "K&R type lists aren't allowed in C++");
1514 break;
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001515 case Declarator::PrototypeContext:
1516 Error = 0; // Function prototype
1517 break;
1518 case Declarator::MemberContext:
1519 switch (cast<TagDecl>(CurContext)->getTagKind()) {
Abramo Bagnara465d41b2010-05-11 21:36:43 +00001520 case TTK_Enum: assert(0 && "unhandled tag kind"); break;
1521 case TTK_Struct: Error = 1; /* Struct member */ break;
1522 case TTK_Union: Error = 2; /* Union member */ break;
1523 case TTK_Class: Error = 3; /* Class member */ break;
Mike Stump1eb44332009-09-09 15:08:12 +00001524 }
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001525 break;
1526 case Declarator::CXXCatchContext:
1527 Error = 4; // Exception declaration
1528 break;
1529 case Declarator::TemplateParamContext:
1530 Error = 5; // Template parameter
1531 break;
1532 case Declarator::BlockLiteralContext:
Richard Smith34b41d92011-02-20 03:19:35 +00001533 Error = 6; // Block literal
1534 break;
1535 case Declarator::TemplateTypeArgContext:
1536 Error = 7; // Template type argument
1537 break;
1538 case Declarator::TypeNameContext:
1539 if (!AutoAllowedInTypeName)
Richard Smith8110f042011-02-22 01:22:29 +00001540 Error = 10; // Generic
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001541 break;
1542 case Declarator::FileContext:
1543 case Declarator::BlockContext:
1544 case Declarator::ForContext:
1545 case Declarator::ConditionContext:
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001546 break;
1547 }
1548
Richard Smithddc83f92011-02-21 23:18:00 +00001549 if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef)
1550 Error = 8;
1551
Richard Smith8110f042011-02-22 01:22:29 +00001552 // In Objective-C it is an error to use 'auto' on a function declarator.
1553 if (D.isFunctionDeclarator())
1554 Error = 9;
1555
Richard Smithe7397c62011-02-22 00:36:53 +00001556 // C++0x [dcl.spec.auto]p2: 'auto' is always fine if the declarator
1557 // contains a trailing return type. That is only legal at the outermost
1558 // level. Check all declarator chunks (outermost first) anyway, to give
1559 // better diagnostics.
Richard Smith8110f042011-02-22 01:22:29 +00001560 if (getLangOptions().CPlusPlus0x && Error != -1) {
Richard Smithe7397c62011-02-22 00:36:53 +00001561 for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
1562 unsigned chunkIndex = e - i - 1;
1563 state.setCurrentChunkIndex(chunkIndex);
1564 DeclaratorChunk &DeclType = D.getTypeObject(chunkIndex);
1565 if (DeclType.Kind == DeclaratorChunk::Function) {
1566 const DeclaratorChunk::FunctionTypeInfo &FTI = DeclType.Fun;
1567 if (FTI.TrailingReturnType) {
1568 Error = -1;
1569 break;
1570 }
1571 }
1572 }
1573 }
1574
Anders Carlssonbaf45d32009-06-26 22:18:59 +00001575 if (Error != -1) {
1576 Diag(D.getDeclSpec().getTypeSpecTypeLoc(), diag::err_auto_not_allowed)
1577 << Error;
1578 T = Context.IntTy;
1579 D.setInvalidType(true);
1580 }
1581 }
Richard Smithe7397c62011-02-22 00:36:53 +00001582
Richard Smith34b41d92011-02-20 03:19:35 +00001583 if (T.isNull())
1584 return Context.getNullTypeSourceInfo();
1585
Douglas Gregorcd281c32009-02-28 00:25:32 +00001586 // The name we're declaring, if any.
1587 DeclarationName Name;
1588 if (D.getIdentifier())
1589 Name = D.getIdentifier();
Mike Stump1eb44332009-09-09 15:08:12 +00001590
Mike Stump98eb8a72009-02-04 22:31:32 +00001591 // Walk the DeclTypeInfo, building the recursive type as we go.
1592 // DeclTypeInfos are ordered from the identifier out, which is
1593 // opposite of what we want :).
Sebastian Redl8ce35b02009-10-25 21:45:37 +00001594 for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
John McCall711c52b2011-01-05 12:14:39 +00001595 unsigned chunkIndex = e - i - 1;
1596 state.setCurrentChunkIndex(chunkIndex);
1597 DeclaratorChunk &DeclType = D.getTypeObject(chunkIndex);
Reid Spencer5f016e22007-07-11 17:01:13 +00001598 switch (DeclType.Kind) {
1599 default: assert(0 && "Unknown decltype!");
Abramo Bagnara075f8f12010-12-10 16:29:40 +00001600 case DeclaratorChunk::Paren:
1601 T = BuildParenType(T);
1602 break;
Steve Naroff5618bd42008-08-27 16:04:49 +00001603 case DeclaratorChunk::BlockPointer:
Chris Lattner9af55002009-03-27 04:18:06 +00001604 // If blocks are disabled, emit an error.
1605 if (!LangOpts.Blocks)
1606 Diag(DeclType.Loc, diag::err_blocks_disable);
Mike Stump1eb44332009-09-09 15:08:12 +00001607
John McCall28654742010-06-05 06:41:15 +00001608 T = BuildBlockPointerType(T, D.getIdentifierLoc(), Name);
1609 if (DeclType.Cls.TypeQuals)
1610 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Cls.TypeQuals);
Steve Naroff5618bd42008-08-27 16:04:49 +00001611 break;
Reid Spencer5f016e22007-07-11 17:01:13 +00001612 case DeclaratorChunk::Pointer:
Sebastian Redl6a7330c2009-05-29 15:01:05 +00001613 // Verify that we're not building a pointer to pointer to function with
1614 // exception specification.
1615 if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
1616 Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
1617 D.setInvalidType(true);
1618 // Build the type anyway.
1619 }
John McCallc12c5bb2010-05-15 11:32:37 +00001620 if (getLangOptions().ObjC1 && T->getAs<ObjCObjectType>()) {
1621 T = Context.getObjCObjectPointerType(T);
John McCall28654742010-06-05 06:41:15 +00001622 if (DeclType.Ptr.TypeQuals)
1623 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
Steve Naroff14108da2009-07-10 23:34:53 +00001624 break;
1625 }
John McCall28654742010-06-05 06:41:15 +00001626 T = BuildPointerType(T, DeclType.Loc, Name);
1627 if (DeclType.Ptr.TypeQuals)
1628 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Ptr.TypeQuals);
John McCall711c52b2011-01-05 12:14:39 +00001629
Reid Spencer5f016e22007-07-11 17:01:13 +00001630 break;
John McCall0953e762009-09-24 19:53:00 +00001631 case DeclaratorChunk::Reference: {
Sebastian Redl6a7330c2009-05-29 15:01:05 +00001632 // Verify that we're not building a reference to pointer to function with
1633 // exception specification.
1634 if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
1635 Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
1636 D.setInvalidType(true);
1637 // Build the type anyway.
1638 }
John McCall28654742010-06-05 06:41:15 +00001639 T = BuildReferenceType(T, DeclType.Ref.LValueRef, DeclType.Loc, Name);
1640
1641 Qualifiers Quals;
1642 if (DeclType.Ref.HasRestrict)
1643 T = BuildQualifiedType(T, DeclType.Loc, Qualifiers::Restrict);
Reid Spencer5f016e22007-07-11 17:01:13 +00001644 break;
John McCall0953e762009-09-24 19:53:00 +00001645 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001646 case DeclaratorChunk::Array: {
Sebastian Redl6a7330c2009-05-29 15:01:05 +00001647 // Verify that we're not building an array of pointers to function with
1648 // exception specification.
1649 if (getLangOptions().CPlusPlus && CheckDistantExceptionSpec(T)) {
1650 Diag(D.getIdentifierLoc(), diag::err_distant_exception_spec);
1651 D.setInvalidType(true);
1652 // Build the type anyway.
1653 }
Chris Lattnerfd89bc82008-04-02 01:05:10 +00001654 DeclaratorChunk::ArrayTypeInfo &ATI = DeclType.Arr;
Chris Lattner94f81fd2007-08-28 16:54:00 +00001655 Expr *ArraySize = static_cast<Expr*>(ATI.NumElts);
Reid Spencer5f016e22007-07-11 17:01:13 +00001656 ArrayType::ArraySizeModifier ASM;
1657 if (ATI.isStar)
1658 ASM = ArrayType::Star;
1659 else if (ATI.hasStatic)
1660 ASM = ArrayType::Static;
1661 else
1662 ASM = ArrayType::Normal;
Eli Friedmanf91f5c82009-04-26 21:57:51 +00001663 if (ASM == ArrayType::Star &&
1664 D.getContext() != Declarator::PrototypeContext) {
1665 // FIXME: This check isn't quite right: it allows star in prototypes
1666 // for function definitions, and disallows some edge cases detailed
1667 // in http://gcc.gnu.org/ml/gcc-patches/2009-02/msg00133.html
1668 Diag(DeclType.Loc, diag::err_array_star_outside_prototype);
1669 ASM = ArrayType::Normal;
1670 D.setInvalidType(true);
1671 }
John McCall0953e762009-09-24 19:53:00 +00001672 T = BuildArrayType(T, ASM, ArraySize,
1673 Qualifiers::fromCVRMask(ATI.TypeQuals),
Douglas Gregor7e7eb3d2009-07-06 15:59:29 +00001674 SourceRange(DeclType.Loc, DeclType.EndLoc), Name);
Reid Spencer5f016e22007-07-11 17:01:13 +00001675 break;
1676 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001677 case DeclaratorChunk::Function: {
Reid Spencer5f016e22007-07-11 17:01:13 +00001678 // If the function declarator has a prototype (i.e. it is not () and
1679 // does not have a K&R-style identifier list), then the arguments are part
1680 // of the type, otherwise the argument list is ().
1681 const DeclaratorChunk::FunctionTypeInfo &FTI = DeclType.Fun;
Sebastian Redl3cc97262009-05-31 11:47:27 +00001682
Richard Smithe7397c62011-02-22 00:36:53 +00001683 // Check for auto functions and trailing return type and adjust the
1684 // return type accordingly.
1685 if (!D.isInvalidType()) {
1686 // trailing-return-type is only required if we're declaring a function,
1687 // and not, for instance, a pointer to a function.
1688 if (D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_auto &&
1689 !FTI.TrailingReturnType && chunkIndex == 0) {
1690 Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
1691 diag::err_auto_missing_trailing_return);
1692 T = Context.IntTy;
1693 D.setInvalidType(true);
1694 } else if (FTI.TrailingReturnType) {
1695 // T must be exactly 'auto' at this point. See CWG issue 681.
1696 if (isa<ParenType>(T)) {
1697 Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
1698 diag::err_trailing_return_in_parens)
1699 << T << D.getDeclSpec().getSourceRange();
1700 D.setInvalidType(true);
1701 } else if (T.hasQualifiers() || !isa<AutoType>(T)) {
1702 Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
1703 diag::err_trailing_return_without_auto)
1704 << T << D.getDeclSpec().getSourceRange();
1705 D.setInvalidType(true);
1706 }
1707
1708 T = GetTypeFromParser(
1709 ParsedType::getFromOpaquePtr(FTI.TrailingReturnType),
1710 &ReturnTypeInfo);
1711 }
1712 }
1713
Chris Lattnercd881292007-12-19 05:31:29 +00001714 // C99 6.7.5.3p1: The return type may not be a function or array type.
Douglas Gregor58408bc2010-01-11 18:46:21 +00001715 // For conversion functions, we'll diagnose this particular error later.
Douglas Gregor48026d22010-01-11 18:40:55 +00001716 if ((T->isArrayType() || T->isFunctionType()) &&
1717 (D.getName().getKind() != UnqualifiedId::IK_ConversionFunctionId)) {
Argyrios Kyrtzidis98650442011-01-25 23:16:33 +00001718 unsigned diagID = diag::err_func_returning_array_function;
Argyrios Kyrtzidisa4356ad2011-01-26 01:26:44 +00001719 // Last processing chunk in block context means this function chunk
1720 // represents the block.
1721 if (chunkIndex == 0 &&
1722 D.getContext() == Declarator::BlockLiteralContext)
Argyrios Kyrtzidis98650442011-01-25 23:16:33 +00001723 diagID = diag::err_block_returning_array_function;
1724 Diag(DeclType.Loc, diagID) << T->isFunctionType() << T;
Chris Lattnercd881292007-12-19 05:31:29 +00001725 T = Context.IntTy;
1726 D.setInvalidType(true);
1727 }
Sebastian Redl465226e2009-05-27 22:11:52 +00001728
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001729 // cv-qualifiers on return types are pointless except when the type is a
1730 // class type in C++.
Chandler Carruthd067c072011-02-23 18:51:59 +00001731 if (T->isPointerType() && T.getCVRQualifiers() &&
1732 (!getLangOptions().CPlusPlus || !T->isDependentType())) {
1733 assert(chunkIndex + 1 < e && "No DeclaratorChunk for the return type?");
1734 DeclaratorChunk ReturnTypeChunk = D.getTypeObject(chunkIndex + 1);
1735 assert(ReturnTypeChunk.Kind == DeclaratorChunk::Pointer);
1736
1737 DeclaratorChunk::PointerTypeInfo &PTI = ReturnTypeChunk.Ptr;
1738
1739 DiagnoseIgnoredQualifiers(PTI.TypeQuals,
1740 SourceLocation::getFromRawEncoding(PTI.ConstQualLoc),
1741 SourceLocation::getFromRawEncoding(PTI.VolatileQualLoc),
1742 SourceLocation::getFromRawEncoding(PTI.RestrictQualLoc),
1743 *this);
1744
1745 } else if (T.getCVRQualifiers() && D.getDeclSpec().getTypeQualifiers() &&
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001746 (!getLangOptions().CPlusPlus ||
1747 (!T->isDependentType() && !T->isRecordType()))) {
Chandler Carruthd067c072011-02-23 18:51:59 +00001748
1749 DiagnoseIgnoredQualifiers(D.getDeclSpec().getTypeQualifiers(),
1750 D.getDeclSpec().getConstSpecLoc(),
1751 D.getDeclSpec().getVolatileSpecLoc(),
1752 D.getDeclSpec().getRestrictSpecLoc(),
1753 *this);
Douglas Gregor5291c3c2010-07-13 08:18:22 +00001754 }
Chandler Carruthd067c072011-02-23 18:51:59 +00001755
Douglas Gregor402abb52009-05-28 23:31:59 +00001756 if (getLangOptions().CPlusPlus && D.getDeclSpec().isTypeSpecOwned()) {
1757 // C++ [dcl.fct]p6:
1758 // Types shall not be defined in return or parameter types.
John McCallb3d87482010-08-24 05:47:05 +00001759 TagDecl *Tag = cast<TagDecl>(D.getDeclSpec().getRepAsDecl());
Douglas Gregor402abb52009-05-28 23:31:59 +00001760 if (Tag->isDefinition())
1761 Diag(Tag->getLocation(), diag::err_type_defined_in_result_type)
1762 << Context.getTypeDeclType(Tag);
1763 }
1764
Sebastian Redl3cc97262009-05-31 11:47:27 +00001765 // Exception specs are not allowed in typedefs. Complain, but add it
1766 // anyway.
1767 if (FTI.hasExceptionSpec &&
1768 D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef)
1769 Diag(FTI.getThrowLoc(), diag::err_exception_spec_in_typedef);
1770
John McCall28654742010-06-05 06:41:15 +00001771 if (!FTI.NumArgs && !FTI.isVariadic && !getLangOptions().CPlusPlus) {
1772 // Simple void foo(), where the incoming T is the result type.
1773 T = Context.getFunctionNoProtoType(T);
1774 } else {
1775 // We allow a zero-parameter variadic function in C if the
1776 // function is marked with the "overloadable" attribute. Scan
1777 // for this attribute now.
1778 if (!FTI.NumArgs && FTI.isVariadic && !getLangOptions().CPlusPlus) {
Douglas Gregor965acbb2009-02-18 07:07:28 +00001779 bool Overloadable = false;
1780 for (const AttributeList *Attrs = D.getAttributes();
1781 Attrs; Attrs = Attrs->getNext()) {
1782 if (Attrs->getKind() == AttributeList::AT_overloadable) {
1783 Overloadable = true;
1784 break;
1785 }
1786 }
1787
1788 if (!Overloadable)
1789 Diag(FTI.getEllipsisLoc(), diag::err_ellipsis_first_arg);
Argyrios Kyrtzidisc6f73452008-10-16 17:31:08 +00001790 }
John McCall28654742010-06-05 06:41:15 +00001791
1792 if (FTI.NumArgs && FTI.ArgInfo[0].Param == 0) {
Chris Lattner788b0fd2010-06-23 06:00:24 +00001793 // C99 6.7.5.3p3: Reject int(x,y,z) when it's not a function
1794 // definition.
John McCall28654742010-06-05 06:41:15 +00001795 Diag(FTI.ArgInfo[0].IdentLoc, diag::err_ident_list_in_fn_declaration);
1796 D.setInvalidType(true);
1797 break;
1798 }
1799
John McCalle23cf432010-12-14 08:05:40 +00001800 FunctionProtoType::ExtProtoInfo EPI;
1801 EPI.Variadic = FTI.isVariadic;
1802 EPI.TypeQuals = FTI.TypeQuals;
Douglas Gregorc938c162011-01-26 05:01:58 +00001803 EPI.RefQualifier = !FTI.hasRefQualifier()? RQ_None
1804 : FTI.RefQualifierIsLValueRef? RQ_LValue
1805 : RQ_RValue;
1806
Reid Spencer5f016e22007-07-11 17:01:13 +00001807 // Otherwise, we have a function with an argument list that is
1808 // potentially variadic.
1809 llvm::SmallVector<QualType, 16> ArgTys;
John McCall28654742010-06-05 06:41:15 +00001810 ArgTys.reserve(FTI.NumArgs);
Mike Stump1eb44332009-09-09 15:08:12 +00001811
Reid Spencer5f016e22007-07-11 17:01:13 +00001812 for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) {
John McCalld226f652010-08-21 09:40:31 +00001813 ParmVarDecl *Param = cast<ParmVarDecl>(FTI.ArgInfo[i].Param);
Chris Lattner8123a952008-04-10 02:22:51 +00001814 QualType ArgTy = Param->getType();
Chris Lattner78c75fb2007-07-21 05:30:18 +00001815 assert(!ArgTy.isNull() && "Couldn't parse type?");
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001816
1817 // Adjust the parameter type.
Douglas Gregorbeb58cb2009-03-23 23:17:00 +00001818 assert((ArgTy == adjustParameterType(ArgTy)) && "Unadjusted type?");
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001819
Reid Spencer5f016e22007-07-11 17:01:13 +00001820 // Look for 'void'. void is allowed only as a single argument to a
1821 // function with no other parameters (C99 6.7.5.3p10). We record
Douglas Gregor72564e72009-02-26 23:50:07 +00001822 // int(void) as a FunctionProtoType with an empty argument list.
Douglas Gregor2dc0e642009-03-23 23:06:20 +00001823 if (ArgTy->isVoidType()) {
Reid Spencer5f016e22007-07-11 17:01:13 +00001824 // If this is something like 'float(int, void)', reject it. 'void'
1825 // is an incomplete type (C99 6.2.5p19) and function decls cannot
1826 // have arguments of incomplete type.
1827 if (FTI.NumArgs != 1 || FTI.isVariadic) {
1828 Diag(DeclType.Loc, diag::err_void_only_param);
Chris Lattner2ff54262007-07-21 05:18:12 +00001829 ArgTy = Context.IntTy;
Chris Lattner8123a952008-04-10 02:22:51 +00001830 Param->setType(ArgTy);
Chris Lattner2ff54262007-07-21 05:18:12 +00001831 } else if (FTI.ArgInfo[i].Ident) {
1832 // Reject, but continue to parse 'int(void abc)'.
Reid Spencer5f016e22007-07-11 17:01:13 +00001833 Diag(FTI.ArgInfo[i].IdentLoc,
Chris Lattner4565d4e2007-07-21 05:26:43 +00001834 diag::err_param_with_void_type);
Chris Lattner2ff54262007-07-21 05:18:12 +00001835 ArgTy = Context.IntTy;
Chris Lattner8123a952008-04-10 02:22:51 +00001836 Param->setType(ArgTy);
Chris Lattner2ff54262007-07-21 05:18:12 +00001837 } else {
1838 // Reject, but continue to parse 'float(const void)'.
John McCall0953e762009-09-24 19:53:00 +00001839 if (ArgTy.hasQualifiers())
Chris Lattner2ff54262007-07-21 05:18:12 +00001840 Diag(DeclType.Loc, diag::err_void_param_qualified);
Mike Stump1eb44332009-09-09 15:08:12 +00001841
Chris Lattner2ff54262007-07-21 05:18:12 +00001842 // Do not add 'void' to the ArgTys list.
1843 break;
1844 }
Eli Friedmaneb4b7052008-08-25 21:31:01 +00001845 } else if (!FTI.hasPrototype) {
1846 if (ArgTy->isPromotableIntegerType()) {
Eli Friedmana95d7572009-08-19 07:44:53 +00001847 ArgTy = Context.getPromotedIntegerType(ArgTy);
John McCall183700f2009-09-21 23:43:11 +00001848 } else if (const BuiltinType* BTy = ArgTy->getAs<BuiltinType>()) {
Eli Friedmaneb4b7052008-08-25 21:31:01 +00001849 if (BTy->getKind() == BuiltinType::Float)
1850 ArgTy = Context.DoubleTy;
1851 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001852 }
Fariborz Jahanian56a965c2010-09-08 21:36:35 +00001853
John McCall54e14c42009-10-22 22:37:11 +00001854 ArgTys.push_back(ArgTy);
Reid Spencer5f016e22007-07-11 17:01:13 +00001855 }
Sebastian Redl465226e2009-05-27 22:11:52 +00001856
1857 llvm::SmallVector<QualType, 4> Exceptions;
John McCalle23cf432010-12-14 08:05:40 +00001858 if (FTI.hasExceptionSpec) {
1859 EPI.HasExceptionSpec = FTI.hasExceptionSpec;
1860 EPI.HasAnyExceptionSpec = FTI.hasAnyExceptionSpec;
John McCalle23cf432010-12-14 08:05:40 +00001861 Exceptions.reserve(FTI.NumExceptions);
1862 for (unsigned ei = 0, ee = FTI.NumExceptions; ei != ee; ++ei) {
1863 // FIXME: Preserve type source info.
1864 QualType ET = GetTypeFromParser(FTI.Exceptions[ei].Ty);
1865 // Check that the type is valid for an exception spec, and
1866 // drop it if not.
1867 if (!CheckSpecifiedExceptionType(ET, FTI.Exceptions[ei].Range))
1868 Exceptions.push_back(ET);
1869 }
John McCall373920b2010-12-14 16:45:57 +00001870 EPI.NumExceptions = Exceptions.size();
John McCalle23cf432010-12-14 08:05:40 +00001871 EPI.Exceptions = Exceptions.data();
Sebastian Redlef65f062009-05-29 18:02:33 +00001872 }
Sebastian Redl465226e2009-05-27 22:11:52 +00001873
John McCalle23cf432010-12-14 08:05:40 +00001874 T = Context.getFunctionType(T, ArgTys.data(), ArgTys.size(), EPI);
Reid Spencer5f016e22007-07-11 17:01:13 +00001875 }
John McCall04a67a62010-02-05 21:31:56 +00001876
Reid Spencer5f016e22007-07-11 17:01:13 +00001877 break;
1878 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001879 case DeclaratorChunk::MemberPointer:
1880 // The scope spec must refer to a class, or be dependent.
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001881 CXXScopeSpec &SS = DeclType.Mem.Scope();
Sebastian Redlf30208a2009-01-24 21:16:55 +00001882 QualType ClsType;
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001883 if (SS.isInvalid()) {
Jeffrey Yasskinedc28772010-04-07 23:29:58 +00001884 // Avoid emitting extra errors if we already errored on the scope.
1885 D.setInvalidType(true);
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001886 } else if (isDependentScopeSpecifier(SS) ||
1887 dyn_cast_or_null<CXXRecordDecl>(computeDeclContext(SS))) {
Mike Stump1eb44332009-09-09 15:08:12 +00001888 NestedNameSpecifier *NNS
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001889 = static_cast<NestedNameSpecifier*>(SS.getScopeRep());
Douglas Gregor87c12c42009-11-04 16:49:01 +00001890 NestedNameSpecifier *NNSPrefix = NNS->getPrefix();
1891 switch (NNS->getKind()) {
1892 case NestedNameSpecifier::Identifier:
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001893 ClsType = Context.getDependentNameType(ETK_None, NNSPrefix,
Douglas Gregor4a2023f2010-03-31 20:19:30 +00001894 NNS->getAsIdentifier());
Douglas Gregor87c12c42009-11-04 16:49:01 +00001895 break;
1896
1897 case NestedNameSpecifier::Namespace:
Douglas Gregor14aba762011-02-24 02:36:08 +00001898 case NestedNameSpecifier::NamespaceAlias:
Douglas Gregor87c12c42009-11-04 16:49:01 +00001899 case NestedNameSpecifier::Global:
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +00001900 llvm_unreachable("Nested-name-specifier must name a type");
Douglas Gregor87c12c42009-11-04 16:49:01 +00001901 break;
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001902
Douglas Gregor87c12c42009-11-04 16:49:01 +00001903 case NestedNameSpecifier::TypeSpec:
1904 case NestedNameSpecifier::TypeSpecWithTemplate:
1905 ClsType = QualType(NNS->getAsType(), 0);
Abramo Bagnara7bd06762010-08-13 12:56:25 +00001906 // Note: if NNS is dependent, then its prefix (if any) is already
1907 // included in ClsType; this does not hold if the NNS is
1908 // nondependent: in this case (if there is indeed a prefix)
1909 // ClsType needs to be wrapped into an elaborated type.
1910 if (NNSPrefix && !NNS->isDependent())
1911 ClsType = Context.getElaboratedType(ETK_None, NNSPrefix, ClsType);
Douglas Gregor87c12c42009-11-04 16:49:01 +00001912 break;
1913 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001914 } else {
Douglas Gregor949bf692009-06-09 22:17:39 +00001915 Diag(DeclType.Mem.Scope().getBeginLoc(),
1916 diag::err_illegal_decl_mempointer_in_nonclass)
1917 << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name")
1918 << DeclType.Mem.Scope().getRange();
Sebastian Redlf30208a2009-01-24 21:16:55 +00001919 D.setInvalidType(true);
Sebastian Redlf30208a2009-01-24 21:16:55 +00001920 }
1921
Douglas Gregor949bf692009-06-09 22:17:39 +00001922 if (!ClsType.isNull())
John McCall28654742010-06-05 06:41:15 +00001923 T = BuildMemberPointerType(T, ClsType, DeclType.Loc, D.getIdentifier());
Douglas Gregor949bf692009-06-09 22:17:39 +00001924 if (T.isNull()) {
1925 T = Context.IntTy;
Sebastian Redlf30208a2009-01-24 21:16:55 +00001926 D.setInvalidType(true);
John McCall28654742010-06-05 06:41:15 +00001927 } else if (DeclType.Mem.TypeQuals) {
1928 T = BuildQualifiedType(T, DeclType.Loc, DeclType.Mem.TypeQuals);
Sebastian Redlf30208a2009-01-24 21:16:55 +00001929 }
Sebastian Redlf30208a2009-01-24 21:16:55 +00001930 break;
1931 }
1932
Douglas Gregorcd281c32009-02-28 00:25:32 +00001933 if (T.isNull()) {
1934 D.setInvalidType(true);
1935 T = Context.IntTy;
1936 }
1937
Chris Lattnerc9b346d2008-06-29 00:50:08 +00001938 // See if there are any attributes on this declarator chunk.
John McCall711c52b2011-01-05 12:14:39 +00001939 if (AttributeList *attrs = const_cast<AttributeList*>(DeclType.getAttrs()))
1940 processTypeAttrs(state, T, false, attrs);
Reid Spencer5f016e22007-07-11 17:01:13 +00001941 }
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001942
1943 if (getLangOptions().CPlusPlus && T->isFunctionType()) {
John McCall183700f2009-09-21 23:43:11 +00001944 const FunctionProtoType *FnTy = T->getAs<FunctionProtoType>();
Chris Lattner778ed742009-10-25 17:36:50 +00001945 assert(FnTy && "Why oh why is there not a FunctionProtoType here?");
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001946
Douglas Gregor708f3b82010-10-14 22:03:51 +00001947 // C++ 8.3.5p4:
1948 // A cv-qualifier-seq shall only be part of the function type
1949 // for a nonstatic member function, the function type to which a pointer
1950 // to member refers, or the top-level function type of a function typedef
1951 // declaration.
Douglas Gregor683a81f2011-01-31 16:09:46 +00001952 //
1953 // Core issue 547 also allows cv-qualifiers on function types that are
1954 // top-level template type arguments.
John McCall613ef3d2010-10-19 01:54:45 +00001955 bool FreeFunction;
1956 if (!D.getCXXScopeSpec().isSet()) {
1957 FreeFunction = (D.getContext() != Declarator::MemberContext ||
1958 D.getDeclSpec().isFriendSpecified());
1959 } else {
1960 DeclContext *DC = computeDeclContext(D.getCXXScopeSpec());
1961 FreeFunction = (DC && !DC->isRecord());
1962 }
1963
Douglas Gregorc938c162011-01-26 05:01:58 +00001964 // C++0x [dcl.fct]p6:
1965 // A ref-qualifier shall only be part of the function type for a
1966 // non-static member function, the function type to which a pointer to
1967 // member refers, or the top-level function type of a function typedef
1968 // declaration.
1969 if ((FnTy->getTypeQuals() != 0 || FnTy->getRefQualifier()) &&
Douglas Gregor683a81f2011-01-31 16:09:46 +00001970 !(D.getContext() == Declarator::TemplateTypeArgContext &&
1971 !D.isFunctionDeclarator()) &&
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001972 D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
Sebastian Redlc61bb202010-07-09 21:26:08 +00001973 (FreeFunction ||
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00001974 D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static)) {
Douglas Gregor683a81f2011-01-31 16:09:46 +00001975 if (D.getContext() == Declarator::TemplateTypeArgContext) {
1976 // Accept qualified function types as template type arguments as a GNU
1977 // extension. This is also the subject of C++ core issue 547.
1978 std::string Quals;
1979 if (FnTy->getTypeQuals() != 0)
1980 Quals = Qualifiers::fromCVRMask(FnTy->getTypeQuals()).getAsString();
1981
1982 switch (FnTy->getRefQualifier()) {
1983 case RQ_None:
1984 break;
1985
1986 case RQ_LValue:
1987 if (!Quals.empty())
1988 Quals += ' ';
1989 Quals += '&';
1990 break;
Douglas Gregorc938c162011-01-26 05:01:58 +00001991
Douglas Gregor683a81f2011-01-31 16:09:46 +00001992 case RQ_RValue:
1993 if (!Quals.empty())
1994 Quals += ' ';
1995 Quals += "&&";
1996 break;
Douglas Gregorc938c162011-01-26 05:01:58 +00001997 }
Douglas Gregor683a81f2011-01-31 16:09:46 +00001998
1999 Diag(D.getIdentifierLoc(),
2000 diag::ext_qualified_function_type_template_arg)
2001 << Quals;
2002 } else {
2003 if (FnTy->getTypeQuals() != 0) {
2004 if (D.isFunctionDeclarator())
2005 Diag(D.getIdentifierLoc(),
2006 diag::err_invalid_qualified_function_type);
2007 else
2008 Diag(D.getIdentifierLoc(),
2009 diag::err_invalid_qualified_typedef_function_type_use)
2010 << FreeFunction;
2011 }
2012
2013 if (FnTy->getRefQualifier()) {
2014 if (D.isFunctionDeclarator()) {
2015 SourceLocation Loc = D.getIdentifierLoc();
2016 for (unsigned I = 0, N = D.getNumTypeObjects(); I != N; ++I) {
2017 const DeclaratorChunk &Chunk = D.getTypeObject(N-I-1);
2018 if (Chunk.Kind == DeclaratorChunk::Function &&
2019 Chunk.Fun.hasRefQualifier()) {
2020 Loc = Chunk.Fun.getRefQualifierLoc();
2021 break;
2022 }
2023 }
2024
2025 Diag(Loc, diag::err_invalid_ref_qualifier_function_type)
2026 << (FnTy->getRefQualifier() == RQ_LValue)
2027 << FixItHint::CreateRemoval(Loc);
2028 } else {
2029 Diag(D.getIdentifierLoc(),
2030 diag::err_invalid_ref_qualifier_typedef_function_type_use)
2031 << FreeFunction
2032 << (FnTy->getRefQualifier() == RQ_LValue);
2033 }
2034 }
2035
2036 // Strip the cv-qualifiers and ref-qualifiers from the type.
2037 FunctionProtoType::ExtProtoInfo EPI = FnTy->getExtProtoInfo();
2038 EPI.TypeQuals = 0;
2039 EPI.RefQualifier = RQ_None;
2040
2041 T = Context.getFunctionType(FnTy->getResultType(),
2042 FnTy->arg_type_begin(),
2043 FnTy->getNumArgs(), EPI);
Douglas Gregorc938c162011-01-26 05:01:58 +00002044 }
Argyrios Kyrtzidis971c4fa2008-10-24 21:46:40 +00002045 }
2046 }
Mike Stump1eb44332009-09-09 15:08:12 +00002047
John McCall711c52b2011-01-05 12:14:39 +00002048 // Apply any undistributed attributes from the declarator.
2049 if (!T.isNull())
2050 if (AttributeList *attrs = D.getAttributes())
2051 processTypeAttrs(state, T, false, attrs);
2052
2053 // Diagnose any ignored type attributes.
2054 if (!T.isNull()) state.diagnoseIgnoredTypeAttrs(T);
2055
Sebastian Redl73780122010-06-09 21:19:43 +00002056 // If there's a constexpr specifier, treat it as a top-level const.
2057 if (D.getDeclSpec().isConstexprSpecified()) {
2058 T.addConst();
2059 }
2060
Douglas Gregora8bc8c92010-12-23 22:44:42 +00002061 // If there was an ellipsis in the declarator, the declaration declares a
2062 // parameter pack whose type may be a pack expansion type.
2063 if (D.hasEllipsis() && !T.isNull()) {
2064 // C++0x [dcl.fct]p13:
2065 // A declarator-id or abstract-declarator containing an ellipsis shall
2066 // only be used in a parameter-declaration. Such a parameter-declaration
2067 // is a parameter pack (14.5.3). [...]
2068 switch (D.getContext()) {
2069 case Declarator::PrototypeContext:
2070 // C++0x [dcl.fct]p13:
2071 // [...] When it is part of a parameter-declaration-clause, the
2072 // parameter pack is a function parameter pack (14.5.3). The type T
2073 // of the declarator-id of the function parameter pack shall contain
2074 // a template parameter pack; each template parameter pack in T is
2075 // expanded by the function parameter pack.
2076 //
2077 // We represent function parameter packs as function parameters whose
2078 // type is a pack expansion.
2079 if (!T->containsUnexpandedParameterPack()) {
2080 Diag(D.getEllipsisLoc(),
2081 diag::err_function_parameter_pack_without_parameter_packs)
2082 << T << D.getSourceRange();
2083 D.setEllipsisLoc(SourceLocation());
2084 } else {
Douglas Gregorcded4f62011-01-14 17:04:44 +00002085 T = Context.getPackExpansionType(T, llvm::Optional<unsigned>());
Douglas Gregora8bc8c92010-12-23 22:44:42 +00002086 }
2087 break;
2088
2089 case Declarator::TemplateParamContext:
2090 // C++0x [temp.param]p15:
2091 // If a template-parameter is a [...] is a parameter-declaration that
2092 // declares a parameter pack (8.3.5), then the template-parameter is a
2093 // template parameter pack (14.5.3).
2094 //
2095 // Note: core issue 778 clarifies that, if there are any unexpanded
2096 // parameter packs in the type of the non-type template parameter, then
2097 // it expands those parameter packs.
2098 if (T->containsUnexpandedParameterPack())
Douglas Gregorcded4f62011-01-14 17:04:44 +00002099 T = Context.getPackExpansionType(T, llvm::Optional<unsigned>());
Douglas Gregor10738d32010-12-23 23:51:58 +00002100 else if (!getLangOptions().CPlusPlus0x)
Douglas Gregor5ce5f522011-01-19 21:59:15 +00002101 Diag(D.getEllipsisLoc(), diag::ext_variadic_templates);
Douglas Gregora8bc8c92010-12-23 22:44:42 +00002102 break;
2103
2104 case Declarator::FileContext:
2105 case Declarator::KNRTypeListContext:
2106 case Declarator::TypeNameContext:
2107 case Declarator::MemberContext:
2108 case Declarator::BlockContext:
2109 case Declarator::ForContext:
2110 case Declarator::ConditionContext:
2111 case Declarator::CXXCatchContext:
2112 case Declarator::BlockLiteralContext:
Douglas Gregor683a81f2011-01-31 16:09:46 +00002113 case Declarator::TemplateTypeArgContext:
Douglas Gregora8bc8c92010-12-23 22:44:42 +00002114 // FIXME: We may want to allow parameter packs in block-literal contexts
2115 // in the future.
2116 Diag(D.getEllipsisLoc(), diag::err_ellipsis_in_declarator_not_parameter);
2117 D.setEllipsisLoc(SourceLocation());
2118 break;
2119 }
2120 }
Richard Smithe7397c62011-02-22 00:36:53 +00002121
John McCallbf1a0282010-06-04 23:28:52 +00002122 if (T.isNull())
2123 return Context.getNullTypeSourceInfo();
2124 else if (D.isInvalidType())
2125 return Context.getTrivialTypeSourceInfo(T);
2126 return GetTypeSourceInfoForDeclarator(D, T, ReturnTypeInfo);
Reid Spencer5f016e22007-07-11 17:01:13 +00002127}
2128
John McCall51bd8032009-10-18 01:05:36 +00002129namespace {
2130 class TypeSpecLocFiller : public TypeLocVisitor<TypeSpecLocFiller> {
Douglas Gregorc21c7e92011-01-25 19:13:18 +00002131 ASTContext &Context;
John McCall51bd8032009-10-18 01:05:36 +00002132 const DeclSpec &DS;
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00002133
John McCall51bd8032009-10-18 01:05:36 +00002134 public:
Douglas Gregorc21c7e92011-01-25 19:13:18 +00002135 TypeSpecLocFiller(ASTContext &Context, const DeclSpec &DS)
2136 : Context(Context), DS(DS) {}
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00002137
John McCall51bd8032009-10-18 01:05:36 +00002138 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
2139 Visit(TL.getUnqualifiedLoc());
2140 }
2141 void VisitTypedefTypeLoc(TypedefTypeLoc TL) {
2142 TL.setNameLoc(DS.getTypeSpecTypeLoc());
2143 }
2144 void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
2145 TL.setNameLoc(DS.getTypeSpecTypeLoc());
John McCallc12c5bb2010-05-15 11:32:37 +00002146 }
2147 void VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
2148 // Handle the base type, which might not have been written explicitly.
2149 if (DS.getTypeSpecType() == DeclSpec::TST_unspecified) {
2150 TL.setHasBaseTypeAsWritten(false);
Douglas Gregorc21c7e92011-01-25 19:13:18 +00002151 TL.getBaseLoc().initialize(Context, SourceLocation());
John McCallc12c5bb2010-05-15 11:32:37 +00002152 } else {
2153 TL.setHasBaseTypeAsWritten(true);
2154 Visit(TL.getBaseLoc());
2155 }
Argyrios Kyrtzidiseb667592009-09-29 19:45:22 +00002156
John McCallc12c5bb2010-05-15 11:32:37 +00002157 // Protocol qualifiers.
John McCall54e14c42009-10-22 22:37:11 +00002158 if (DS.getProtocolQualifiers()) {
2159 assert(TL.getNumProtocols() > 0);
2160 assert(TL.getNumProtocols() == DS.getNumProtocolQualifiers());
2161 TL.setLAngleLoc(DS.getProtocolLAngleLoc());
2162 TL.setRAngleLoc(DS.getSourceRange().getEnd());
2163 for (unsigned i = 0, e = DS.getNumProtocolQualifiers(); i != e; ++i)
2164 TL.setProtocolLoc(i, DS.getProtocolLocs()[i]);
2165 } else {
2166 assert(TL.getNumProtocols() == 0);
2167 TL.setLAngleLoc(SourceLocation());
2168 TL.setRAngleLoc(SourceLocation());
2169 }
2170 }
2171 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
John McCall54e14c42009-10-22 22:37:11 +00002172 TL.setStarLoc(SourceLocation());
John McCallc12c5bb2010-05-15 11:32:37 +00002173 Visit(TL.getPointeeLoc());
John McCall51bd8032009-10-18 01:05:36 +00002174 }
John McCall833ca992009-10-29 08:12:44 +00002175 void VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
John McCalla93c9342009-12-07 02:54:59 +00002176 TypeSourceInfo *TInfo = 0;
John McCallb3d87482010-08-24 05:47:05 +00002177 Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
John McCall833ca992009-10-29 08:12:44 +00002178
2179 // If we got no declarator info from previous Sema routines,
2180 // just fill with the typespec loc.
John McCalla93c9342009-12-07 02:54:59 +00002181 if (!TInfo) {
Douglas Gregorc21c7e92011-01-25 19:13:18 +00002182 TL.initialize(Context, DS.getTypeSpecTypeLoc());
John McCall833ca992009-10-29 08:12:44 +00002183 return;
2184 }
2185
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002186 TypeLoc OldTL = TInfo->getTypeLoc();
2187 if (TInfo->getType()->getAs<ElaboratedType>()) {
2188 ElaboratedTypeLoc ElabTL = cast<ElaboratedTypeLoc>(OldTL);
2189 TemplateSpecializationTypeLoc NamedTL =
2190 cast<TemplateSpecializationTypeLoc>(ElabTL.getNamedTypeLoc());
2191 TL.copy(NamedTL);
2192 }
2193 else
2194 TL.copy(cast<TemplateSpecializationTypeLoc>(OldTL));
John McCall833ca992009-10-29 08:12:44 +00002195 }
John McCallcfb708c2010-01-13 20:03:27 +00002196 void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
2197 assert(DS.getTypeSpecType() == DeclSpec::TST_typeofExpr);
2198 TL.setTypeofLoc(DS.getTypeSpecTypeLoc());
2199 TL.setParensRange(DS.getTypeofParensRange());
2200 }
2201 void VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
2202 assert(DS.getTypeSpecType() == DeclSpec::TST_typeofType);
2203 TL.setTypeofLoc(DS.getTypeSpecTypeLoc());
2204 TL.setParensRange(DS.getTypeofParensRange());
John McCallb3d87482010-08-24 05:47:05 +00002205 assert(DS.getRepAsType());
John McCallcfb708c2010-01-13 20:03:27 +00002206 TypeSourceInfo *TInfo = 0;
John McCallb3d87482010-08-24 05:47:05 +00002207 Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
John McCallcfb708c2010-01-13 20:03:27 +00002208 TL.setUnderlyingTInfo(TInfo);
2209 }
Douglas Gregorddf889a2010-01-18 18:04:31 +00002210 void VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
2211 // By default, use the source location of the type specifier.
2212 TL.setBuiltinLoc(DS.getTypeSpecTypeLoc());
2213 if (TL.needsExtraLocalData()) {
2214 // Set info for the written builtin specifiers.
2215 TL.getWrittenBuiltinSpecs() = DS.getWrittenBuiltinSpecs();
2216 // Try to have a meaningful source location.
2217 if (TL.getWrittenSignSpec() != TSS_unspecified)
2218 // Sign spec loc overrides the others (e.g., 'unsigned long').
2219 TL.setBuiltinLoc(DS.getTypeSpecSignLoc());
2220 else if (TL.getWrittenWidthSpec() != TSW_unspecified)
2221 // Width spec loc overrides type spec loc (e.g., 'short int').
2222 TL.setBuiltinLoc(DS.getTypeSpecWidthLoc());
2223 }
2224 }
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002225 void VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
2226 ElaboratedTypeKeyword Keyword
2227 = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
Nico Weber253e80b2010-11-22 10:30:56 +00002228 if (DS.getTypeSpecType() == TST_typename) {
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002229 TypeSourceInfo *TInfo = 0;
John McCallb3d87482010-08-24 05:47:05 +00002230 Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002231 if (TInfo) {
2232 TL.copy(cast<ElaboratedTypeLoc>(TInfo->getTypeLoc()));
2233 return;
2234 }
2235 }
2236 TL.setKeywordLoc(Keyword != ETK_None
2237 ? DS.getTypeSpecTypeLoc()
2238 : SourceLocation());
2239 const CXXScopeSpec& SS = DS.getTypeSpecScope();
Douglas Gregor239cbb02011-03-01 03:11:17 +00002240 TL.setQualifierLoc(SS.getWithLocInContext(Context));
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002241 Visit(TL.getNextTypeLoc().getUnqualifiedLoc());
2242 }
2243 void VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
2244 ElaboratedTypeKeyword Keyword
2245 = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
Nico Weber253e80b2010-11-22 10:30:56 +00002246 if (DS.getTypeSpecType() == TST_typename) {
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002247 TypeSourceInfo *TInfo = 0;
John McCallb3d87482010-08-24 05:47:05 +00002248 Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002249 if (TInfo) {
2250 TL.copy(cast<DependentNameTypeLoc>(TInfo->getTypeLoc()));
2251 return;
2252 }
2253 }
2254 TL.setKeywordLoc(Keyword != ETK_None
2255 ? DS.getTypeSpecTypeLoc()
2256 : SourceLocation());
2257 const CXXScopeSpec& SS = DS.getTypeSpecScope();
Douglas Gregor2494dd02011-03-01 01:34:45 +00002258 TL.setQualifierLoc(SS.getWithLocInContext(Context));
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002259 TL.setNameLoc(DS.getTypeSpecTypeLoc());
2260 }
John McCall33500952010-06-11 00:33:02 +00002261 void VisitDependentTemplateSpecializationTypeLoc(
2262 DependentTemplateSpecializationTypeLoc TL) {
2263 ElaboratedTypeKeyword Keyword
2264 = TypeWithKeyword::getKeywordForTypeSpec(DS.getTypeSpecType());
2265 if (Keyword == ETK_Typename) {
2266 TypeSourceInfo *TInfo = 0;
John McCallb3d87482010-08-24 05:47:05 +00002267 Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
John McCall33500952010-06-11 00:33:02 +00002268 if (TInfo) {
2269 TL.copy(cast<DependentTemplateSpecializationTypeLoc>(
2270 TInfo->getTypeLoc()));
2271 return;
2272 }
2273 }
Douglas Gregorc21c7e92011-01-25 19:13:18 +00002274 TL.initializeLocal(Context, SourceLocation());
John McCall33500952010-06-11 00:33:02 +00002275 TL.setKeywordLoc(Keyword != ETK_None
2276 ? DS.getTypeSpecTypeLoc()
2277 : SourceLocation());
2278 const CXXScopeSpec& SS = DS.getTypeSpecScope();
2279 TL.setQualifierRange(SS.isEmpty() ? SourceRange() : SS.getRange());
2280 // FIXME: load appropriate source location.
2281 TL.setNameLoc(DS.getTypeSpecTypeLoc());
2282 }
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00002283
John McCall51bd8032009-10-18 01:05:36 +00002284 void VisitTypeLoc(TypeLoc TL) {
2285 // FIXME: add other typespec types and change this to an assert.
Douglas Gregorc21c7e92011-01-25 19:13:18 +00002286 TL.initialize(Context, DS.getTypeSpecTypeLoc());
John McCall51bd8032009-10-18 01:05:36 +00002287 }
2288 };
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00002289
John McCall51bd8032009-10-18 01:05:36 +00002290 class DeclaratorLocFiller : public TypeLocVisitor<DeclaratorLocFiller> {
2291 const DeclaratorChunk &Chunk;
2292
2293 public:
2294 DeclaratorLocFiller(const DeclaratorChunk &Chunk) : Chunk(Chunk) {}
2295
2296 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +00002297 llvm_unreachable("qualified type locs not expected here!");
John McCall51bd8032009-10-18 01:05:36 +00002298 }
2299
2300 void VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
2301 assert(Chunk.Kind == DeclaratorChunk::BlockPointer);
2302 TL.setCaretLoc(Chunk.Loc);
2303 }
2304 void VisitPointerTypeLoc(PointerTypeLoc TL) {
2305 assert(Chunk.Kind == DeclaratorChunk::Pointer);
2306 TL.setStarLoc(Chunk.Loc);
2307 }
2308 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
2309 assert(Chunk.Kind == DeclaratorChunk::Pointer);
2310 TL.setStarLoc(Chunk.Loc);
2311 }
2312 void VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
2313 assert(Chunk.Kind == DeclaratorChunk::MemberPointer);
2314 TL.setStarLoc(Chunk.Loc);
2315 // FIXME: nested name specifier
2316 }
2317 void VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
2318 assert(Chunk.Kind == DeclaratorChunk::Reference);
John McCall54e14c42009-10-22 22:37:11 +00002319 // 'Amp' is misleading: this might have been originally
2320 /// spelled with AmpAmp.
John McCall51bd8032009-10-18 01:05:36 +00002321 TL.setAmpLoc(Chunk.Loc);
2322 }
2323 void VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
2324 assert(Chunk.Kind == DeclaratorChunk::Reference);
2325 assert(!Chunk.Ref.LValueRef);
2326 TL.setAmpAmpLoc(Chunk.Loc);
2327 }
2328 void VisitArrayTypeLoc(ArrayTypeLoc TL) {
2329 assert(Chunk.Kind == DeclaratorChunk::Array);
2330 TL.setLBracketLoc(Chunk.Loc);
2331 TL.setRBracketLoc(Chunk.EndLoc);
2332 TL.setSizeExpr(static_cast<Expr*>(Chunk.Arr.NumElts));
2333 }
2334 void VisitFunctionTypeLoc(FunctionTypeLoc TL) {
2335 assert(Chunk.Kind == DeclaratorChunk::Function);
2336 TL.setLParenLoc(Chunk.Loc);
2337 TL.setRParenLoc(Chunk.EndLoc);
Douglas Gregordab60ad2010-10-01 18:44:50 +00002338 TL.setTrailingReturn(!!Chunk.Fun.TrailingReturnType);
John McCall51bd8032009-10-18 01:05:36 +00002339
2340 const DeclaratorChunk::FunctionTypeInfo &FTI = Chunk.Fun;
John McCall54e14c42009-10-22 22:37:11 +00002341 for (unsigned i = 0, e = TL.getNumArgs(), tpi = 0; i != e; ++i) {
John McCalld226f652010-08-21 09:40:31 +00002342 ParmVarDecl *Param = cast<ParmVarDecl>(FTI.ArgInfo[i].Param);
John McCall54e14c42009-10-22 22:37:11 +00002343 TL.setArg(tpi++, Param);
John McCall51bd8032009-10-18 01:05:36 +00002344 }
2345 // FIXME: exception specs
2346 }
Abramo Bagnara075f8f12010-12-10 16:29:40 +00002347 void VisitParenTypeLoc(ParenTypeLoc TL) {
2348 assert(Chunk.Kind == DeclaratorChunk::Paren);
2349 TL.setLParenLoc(Chunk.Loc);
2350 TL.setRParenLoc(Chunk.EndLoc);
2351 }
John McCall51bd8032009-10-18 01:05:36 +00002352
2353 void VisitTypeLoc(TypeLoc TL) {
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +00002354 llvm_unreachable("unsupported TypeLoc kind in declarator!");
John McCall51bd8032009-10-18 01:05:36 +00002355 }
2356 };
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00002357}
2358
John McCalla93c9342009-12-07 02:54:59 +00002359/// \brief Create and instantiate a TypeSourceInfo with type source information.
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00002360///
2361/// \param T QualType referring to the type as written in source code.
Douglas Gregor05baacb2010-04-12 23:19:01 +00002362///
2363/// \param ReturnTypeInfo For declarators whose return type does not show
2364/// up in the normal place in the declaration specifiers (such as a C++
2365/// conversion function), this pointer will refer to a type source information
2366/// for that return type.
John McCalla93c9342009-12-07 02:54:59 +00002367TypeSourceInfo *
Douglas Gregor05baacb2010-04-12 23:19:01 +00002368Sema::GetTypeSourceInfoForDeclarator(Declarator &D, QualType T,
2369 TypeSourceInfo *ReturnTypeInfo) {
John McCalla93c9342009-12-07 02:54:59 +00002370 TypeSourceInfo *TInfo = Context.CreateTypeSourceInfo(T);
2371 UnqualTypeLoc CurrTL = TInfo->getTypeLoc().getUnqualifiedLoc();
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00002372
Douglas Gregora8bc8c92010-12-23 22:44:42 +00002373 // Handle parameter packs whose type is a pack expansion.
2374 if (isa<PackExpansionType>(T)) {
2375 cast<PackExpansionTypeLoc>(CurrTL).setEllipsisLoc(D.getEllipsisLoc());
2376 CurrTL = CurrTL.getNextTypeLoc().getUnqualifiedLoc();
2377 }
2378
Sebastian Redl8ce35b02009-10-25 21:45:37 +00002379 for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
John McCall51bd8032009-10-18 01:05:36 +00002380 DeclaratorLocFiller(D.getTypeObject(i)).Visit(CurrTL);
2381 CurrTL = CurrTL.getNextTypeLoc().getUnqualifiedLoc();
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00002382 }
Argyrios Kyrtzidisf352bdd2009-09-29 19:43:35 +00002383
John McCallb3d87482010-08-24 05:47:05 +00002384 // If we have different source information for the return type, use
2385 // that. This really only applies to C++ conversion functions.
2386 if (ReturnTypeInfo) {
Douglas Gregor05baacb2010-04-12 23:19:01 +00002387 TypeLoc TL = ReturnTypeInfo->getTypeLoc();
2388 assert(TL.getFullDataSize() == CurrTL.getFullDataSize());
2389 memcpy(CurrTL.getOpaqueData(), TL.getOpaqueData(), TL.getFullDataSize());
John McCallb3d87482010-08-24 05:47:05 +00002390 } else {
Douglas Gregorc21c7e92011-01-25 19:13:18 +00002391 TypeSpecLocFiller(Context, D.getDeclSpec()).Visit(CurrTL);
Douglas Gregor05baacb2010-04-12 23:19:01 +00002392 }
2393
John McCalla93c9342009-12-07 02:54:59 +00002394 return TInfo;
Argyrios Kyrtzidis4adab7f2009-08-19 01:28:06 +00002395}
2396
John McCalla93c9342009-12-07 02:54:59 +00002397/// \brief Create a LocInfoType to hold the given QualType and TypeSourceInfo.
John McCallb3d87482010-08-24 05:47:05 +00002398ParsedType Sema::CreateParsedType(QualType T, TypeSourceInfo *TInfo) {
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00002399 // FIXME: LocInfoTypes are "transient", only needed for passing to/from Parser
2400 // and Sema during declaration parsing. Try deallocating/caching them when
2401 // it's appropriate, instead of allocating them and keeping them around.
Douglas Gregoreb0eb492010-12-10 08:12:03 +00002402 LocInfoType *LocT = (LocInfoType*)BumpAlloc.Allocate(sizeof(LocInfoType),
2403 TypeAlignment);
John McCalla93c9342009-12-07 02:54:59 +00002404 new (LocT) LocInfoType(T, TInfo);
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00002405 assert(LocT->getTypeClass() != T->getTypeClass() &&
2406 "LocInfoType's TypeClass conflicts with an existing Type class");
John McCallb3d87482010-08-24 05:47:05 +00002407 return ParsedType::make(QualType(LocT, 0));
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00002408}
2409
2410void LocInfoType::getAsStringInternal(std::string &Str,
2411 const PrintingPolicy &Policy) const {
Argyrios Kyrtzidis35d44e52009-08-19 01:46:06 +00002412 assert(false && "LocInfoType leaked into the type system; an opaque TypeTy*"
2413 " was used directly instead of getting the QualType through"
2414 " GetTypeFromParser");
Argyrios Kyrtzidis1bb8a452009-08-19 01:28:17 +00002415}
2416
John McCallf312b1e2010-08-26 23:41:50 +00002417TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) {
Reid Spencer5f016e22007-07-11 17:01:13 +00002418 // C99 6.7.6: Type names have no identifier. This is already validated by
2419 // the parser.
2420 assert(D.getIdentifier() == 0 && "Type name should have no identifier!");
Mike Stump1eb44332009-09-09 15:08:12 +00002421
Douglas Gregor402abb52009-05-28 23:31:59 +00002422 TagDecl *OwnedTag = 0;
John McCallbf1a0282010-06-04 23:28:52 +00002423 TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedTag);
2424 QualType T = TInfo->getType();
Chris Lattner5153ee62009-04-25 08:47:54 +00002425 if (D.isInvalidType())
Douglas Gregor809070a2009-02-18 17:45:20 +00002426 return true;
Steve Naroff5912a352007-08-28 20:14:24 +00002427
Douglas Gregor402abb52009-05-28 23:31:59 +00002428 if (getLangOptions().CPlusPlus) {
2429 // Check that there are no default arguments (C++ only).
Douglas Gregor6d6eb572008-05-07 04:49:29 +00002430 CheckExtraCXXDefaultArguments(D);
2431
Douglas Gregor402abb52009-05-28 23:31:59 +00002432 // C++0x [dcl.type]p3:
2433 // A type-specifier-seq shall not define a class or enumeration
2434 // unless it appears in the type-id of an alias-declaration
2435 // (7.1.3).
2436 if (OwnedTag && OwnedTag->isDefinition())
2437 Diag(OwnedTag->getLocation(), diag::err_type_defined_in_type_specifier)
2438 << Context.getTypeDeclType(OwnedTag);
2439 }
2440
John McCallb3d87482010-08-24 05:47:05 +00002441 return CreateParsedType(T, TInfo);
Reid Spencer5f016e22007-07-11 17:01:13 +00002442}
2443
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002444
2445
2446//===----------------------------------------------------------------------===//
2447// Type Attribute Processing
2448//===----------------------------------------------------------------------===//
2449
2450/// HandleAddressSpaceTypeAttribute - Process an address_space attribute on the
2451/// specified type. The attribute contains 1 argument, the id of the address
2452/// space for the type.
Mike Stump1eb44332009-09-09 15:08:12 +00002453static void HandleAddressSpaceTypeAttribute(QualType &Type,
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002454 const AttributeList &Attr, Sema &S){
John McCall0953e762009-09-24 19:53:00 +00002455
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002456 // If this type is already address space qualified, reject it.
2457 // Clause 6.7.3 - Type qualifiers: "No type shall be qualified by qualifiers
2458 // for two or more different address spaces."
2459 if (Type.getAddressSpace()) {
2460 S.Diag(Attr.getLoc(), diag::err_attribute_address_multiple_qualifiers);
Abramo Bagnarae215f722010-04-30 13:10:51 +00002461 Attr.setInvalid();
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002462 return;
2463 }
Mike Stump1eb44332009-09-09 15:08:12 +00002464
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002465 // Check the attribute arguments.
2466 if (Attr.getNumArgs() != 1) {
Chris Lattnerf3a41af2008-11-20 06:38:18 +00002467 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
Abramo Bagnarae215f722010-04-30 13:10:51 +00002468 Attr.setInvalid();
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002469 return;
2470 }
2471 Expr *ASArgExpr = static_cast<Expr *>(Attr.getArg(0));
2472 llvm::APSInt addrSpace(32);
Douglas Gregorac06a0e2010-05-18 23:01:22 +00002473 if (ASArgExpr->isTypeDependent() || ASArgExpr->isValueDependent() ||
2474 !ASArgExpr->isIntegerConstantExpr(addrSpace, S.Context)) {
Chris Lattnerdcd5ef12008-11-19 05:27:50 +00002475 S.Diag(Attr.getLoc(), diag::err_attribute_address_space_not_int)
2476 << ASArgExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002477 Attr.setInvalid();
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002478 return;
2479 }
2480
John McCallefadb772009-07-28 06:52:18 +00002481 // Bounds checking.
2482 if (addrSpace.isSigned()) {
2483 if (addrSpace.isNegative()) {
2484 S.Diag(Attr.getLoc(), diag::err_attribute_address_space_negative)
2485 << ASArgExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002486 Attr.setInvalid();
John McCallefadb772009-07-28 06:52:18 +00002487 return;
2488 }
2489 addrSpace.setIsSigned(false);
2490 }
2491 llvm::APSInt max(addrSpace.getBitWidth());
John McCall0953e762009-09-24 19:53:00 +00002492 max = Qualifiers::MaxAddressSpace;
John McCallefadb772009-07-28 06:52:18 +00002493 if (addrSpace > max) {
2494 S.Diag(Attr.getLoc(), diag::err_attribute_address_space_too_high)
John McCall0953e762009-09-24 19:53:00 +00002495 << Qualifiers::MaxAddressSpace << ASArgExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002496 Attr.setInvalid();
John McCallefadb772009-07-28 06:52:18 +00002497 return;
2498 }
2499
Mike Stump1eb44332009-09-09 15:08:12 +00002500 unsigned ASIdx = static_cast<unsigned>(addrSpace.getZExtValue());
Fariborz Jahanianf11284a2009-02-17 18:27:45 +00002501 Type = S.Context.getAddrSpaceQualType(Type, ASIdx);
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002502}
2503
John McCall711c52b2011-01-05 12:14:39 +00002504/// handleObjCGCTypeAttr - Process the __attribute__((objc_gc)) type
2505/// attribute on the specified type. Returns true to indicate that
2506/// the attribute was handled, false to indicate that the type does
2507/// not permit the attribute.
2508static bool handleObjCGCTypeAttr(TypeProcessingState &state,
2509 AttributeList &attr,
2510 QualType &type) {
2511 Sema &S = state.getSema();
2512
2513 // Delay if this isn't some kind of pointer.
2514 if (!type->isPointerType() &&
2515 !type->isObjCObjectPointerType() &&
2516 !type->isBlockPointerType())
2517 return false;
2518
2519 if (type.getObjCGCAttr() != Qualifiers::GCNone) {
2520 S.Diag(attr.getLoc(), diag::err_attribute_multiple_objc_gc);
2521 attr.setInvalid();
2522 return true;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002523 }
Mike Stump1eb44332009-09-09 15:08:12 +00002524
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002525 // Check the attribute arguments.
John McCall711c52b2011-01-05 12:14:39 +00002526 if (!attr.getParameterName()) {
2527 S.Diag(attr.getLoc(), diag::err_attribute_argument_n_not_string)
Fariborz Jahanianba372b82009-02-18 17:52:36 +00002528 << "objc_gc" << 1;
John McCall711c52b2011-01-05 12:14:39 +00002529 attr.setInvalid();
2530 return true;
Fariborz Jahanianba372b82009-02-18 17:52:36 +00002531 }
John McCall0953e762009-09-24 19:53:00 +00002532 Qualifiers::GC GCAttr;
John McCall711c52b2011-01-05 12:14:39 +00002533 if (attr.getNumArgs() != 0) {
2534 S.Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
2535 attr.setInvalid();
2536 return true;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002537 }
John McCall711c52b2011-01-05 12:14:39 +00002538 if (attr.getParameterName()->isStr("weak"))
John McCall0953e762009-09-24 19:53:00 +00002539 GCAttr = Qualifiers::Weak;
John McCall711c52b2011-01-05 12:14:39 +00002540 else if (attr.getParameterName()->isStr("strong"))
John McCall0953e762009-09-24 19:53:00 +00002541 GCAttr = Qualifiers::Strong;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002542 else {
John McCall711c52b2011-01-05 12:14:39 +00002543 S.Diag(attr.getLoc(), diag::warn_attribute_type_not_supported)
2544 << "objc_gc" << attr.getParameterName();
2545 attr.setInvalid();
2546 return true;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002547 }
Mike Stump1eb44332009-09-09 15:08:12 +00002548
John McCall711c52b2011-01-05 12:14:39 +00002549 type = S.Context.getObjCGCQualType(type, GCAttr);
2550 return true;
Fariborz Jahaniand33d9c02009-02-18 05:09:49 +00002551}
2552
John McCalle6a365d2010-12-19 02:44:49 +00002553namespace {
2554 /// A helper class to unwrap a type down to a function for the
2555 /// purposes of applying attributes there.
2556 ///
2557 /// Use:
2558 /// FunctionTypeUnwrapper unwrapped(SemaRef, T);
2559 /// if (unwrapped.isFunctionType()) {
2560 /// const FunctionType *fn = unwrapped.get();
2561 /// // change fn somehow
2562 /// T = unwrapped.wrap(fn);
2563 /// }
2564 struct FunctionTypeUnwrapper {
2565 enum WrapKind {
2566 Desugar,
2567 Parens,
2568 Pointer,
2569 BlockPointer,
2570 Reference,
2571 MemberPointer
2572 };
2573
2574 QualType Original;
2575 const FunctionType *Fn;
2576 llvm::SmallVector<unsigned char /*WrapKind*/, 8> Stack;
2577
2578 FunctionTypeUnwrapper(Sema &S, QualType T) : Original(T) {
2579 while (true) {
2580 const Type *Ty = T.getTypePtr();
2581 if (isa<FunctionType>(Ty)) {
2582 Fn = cast<FunctionType>(Ty);
2583 return;
2584 } else if (isa<ParenType>(Ty)) {
2585 T = cast<ParenType>(Ty)->getInnerType();
2586 Stack.push_back(Parens);
2587 } else if (isa<PointerType>(Ty)) {
2588 T = cast<PointerType>(Ty)->getPointeeType();
2589 Stack.push_back(Pointer);
2590 } else if (isa<BlockPointerType>(Ty)) {
2591 T = cast<BlockPointerType>(Ty)->getPointeeType();
2592 Stack.push_back(BlockPointer);
2593 } else if (isa<MemberPointerType>(Ty)) {
2594 T = cast<MemberPointerType>(Ty)->getPointeeType();
2595 Stack.push_back(MemberPointer);
2596 } else if (isa<ReferenceType>(Ty)) {
2597 T = cast<ReferenceType>(Ty)->getPointeeType();
2598 Stack.push_back(Reference);
2599 } else {
2600 const Type *DTy = Ty->getUnqualifiedDesugaredType();
2601 if (Ty == DTy) {
2602 Fn = 0;
2603 return;
2604 }
2605
2606 T = QualType(DTy, 0);
2607 Stack.push_back(Desugar);
2608 }
2609 }
2610 }
2611
2612 bool isFunctionType() const { return (Fn != 0); }
2613 const FunctionType *get() const { return Fn; }
2614
2615 QualType wrap(Sema &S, const FunctionType *New) {
2616 // If T wasn't modified from the unwrapped type, do nothing.
2617 if (New == get()) return Original;
2618
2619 Fn = New;
2620 return wrap(S.Context, Original, 0);
2621 }
2622
2623 private:
2624 QualType wrap(ASTContext &C, QualType Old, unsigned I) {
2625 if (I == Stack.size())
2626 return C.getQualifiedType(Fn, Old.getQualifiers());
2627
2628 // Build up the inner type, applying the qualifiers from the old
2629 // type to the new type.
2630 SplitQualType SplitOld = Old.split();
2631
2632 // As a special case, tail-recurse if there are no qualifiers.
2633 if (SplitOld.second.empty())
2634 return wrap(C, SplitOld.first, I);
2635 return C.getQualifiedType(wrap(C, SplitOld.first, I), SplitOld.second);
2636 }
2637
2638 QualType wrap(ASTContext &C, const Type *Old, unsigned I) {
2639 if (I == Stack.size()) return QualType(Fn, 0);
2640
2641 switch (static_cast<WrapKind>(Stack[I++])) {
2642 case Desugar:
2643 // This is the point at which we potentially lose source
2644 // information.
2645 return wrap(C, Old->getUnqualifiedDesugaredType(), I);
2646
2647 case Parens: {
2648 QualType New = wrap(C, cast<ParenType>(Old)->getInnerType(), I);
2649 return C.getParenType(New);
2650 }
2651
2652 case Pointer: {
2653 QualType New = wrap(C, cast<PointerType>(Old)->getPointeeType(), I);
2654 return C.getPointerType(New);
2655 }
2656
2657 case BlockPointer: {
2658 QualType New = wrap(C, cast<BlockPointerType>(Old)->getPointeeType(),I);
2659 return C.getBlockPointerType(New);
2660 }
2661
2662 case MemberPointer: {
2663 const MemberPointerType *OldMPT = cast<MemberPointerType>(Old);
2664 QualType New = wrap(C, OldMPT->getPointeeType(), I);
2665 return C.getMemberPointerType(New, OldMPT->getClass());
2666 }
2667
2668 case Reference: {
2669 const ReferenceType *OldRef = cast<ReferenceType>(Old);
2670 QualType New = wrap(C, OldRef->getPointeeType(), I);
2671 if (isa<LValueReferenceType>(OldRef))
2672 return C.getLValueReferenceType(New, OldRef->isSpelledAsLValue());
2673 else
2674 return C.getRValueReferenceType(New);
2675 }
2676 }
2677
2678 llvm_unreachable("unknown wrapping kind");
2679 return QualType();
2680 }
2681 };
2682}
2683
John McCall711c52b2011-01-05 12:14:39 +00002684/// Process an individual function attribute. Returns true to
2685/// indicate that the attribute was handled, false if it wasn't.
2686static bool handleFunctionTypeAttr(TypeProcessingState &state,
2687 AttributeList &attr,
2688 QualType &type) {
2689 Sema &S = state.getSema();
John McCalle6a365d2010-12-19 02:44:49 +00002690
John McCall711c52b2011-01-05 12:14:39 +00002691 FunctionTypeUnwrapper unwrapped(S, type);
Mike Stump24556362009-07-25 21:26:53 +00002692
John McCall711c52b2011-01-05 12:14:39 +00002693 if (attr.getKind() == AttributeList::AT_noreturn) {
2694 if (S.CheckNoReturnAttr(attr))
John McCall04a67a62010-02-05 21:31:56 +00002695 return true;
John McCalle6a365d2010-12-19 02:44:49 +00002696
John McCall711c52b2011-01-05 12:14:39 +00002697 // Delay if this is not a function type.
2698 if (!unwrapped.isFunctionType())
2699 return false;
2700
John McCall04a67a62010-02-05 21:31:56 +00002701 // Otherwise we can process right away.
John McCall711c52b2011-01-05 12:14:39 +00002702 FunctionType::ExtInfo EI = unwrapped.get()->getExtInfo().withNoReturn(true);
2703 type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
2704 return true;
John McCall04a67a62010-02-05 21:31:56 +00002705 }
Mike Stump24556362009-07-25 21:26:53 +00002706
John McCall711c52b2011-01-05 12:14:39 +00002707 if (attr.getKind() == AttributeList::AT_regparm) {
2708 unsigned value;
2709 if (S.CheckRegparmAttr(attr, value))
Rafael Espindola425ef722010-03-30 22:15:11 +00002710 return true;
2711
John McCall711c52b2011-01-05 12:14:39 +00002712 // Delay if this is not a function type.
2713 if (!unwrapped.isFunctionType())
Rafael Espindola425ef722010-03-30 22:15:11 +00002714 return false;
2715
Argyrios Kyrtzidisce955662011-01-25 23:16:40 +00002716 // Diagnose regparm with fastcall.
2717 const FunctionType *fn = unwrapped.get();
2718 CallingConv CC = fn->getCallConv();
2719 if (CC == CC_X86FastCall) {
2720 S.Diag(attr.getLoc(), diag::err_attributes_are_not_compatible)
2721 << FunctionType::getNameForCallConv(CC)
2722 << "regparm";
2723 attr.setInvalid();
2724 return true;
2725 }
2726
John McCalle6a365d2010-12-19 02:44:49 +00002727 FunctionType::ExtInfo EI =
John McCall711c52b2011-01-05 12:14:39 +00002728 unwrapped.get()->getExtInfo().withRegParm(value);
2729 type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
2730 return true;
Rafael Espindola425ef722010-03-30 22:15:11 +00002731 }
2732
John McCall04a67a62010-02-05 21:31:56 +00002733 // Otherwise, a calling convention.
John McCall711c52b2011-01-05 12:14:39 +00002734 CallingConv CC;
2735 if (S.CheckCallingConvAttr(attr, CC))
2736 return true;
John McCallf82b4e82010-02-04 05:44:44 +00002737
John McCall04a67a62010-02-05 21:31:56 +00002738 // Delay if the type didn't work out to a function.
John McCall711c52b2011-01-05 12:14:39 +00002739 if (!unwrapped.isFunctionType()) return false;
John McCall04a67a62010-02-05 21:31:56 +00002740
John McCall711c52b2011-01-05 12:14:39 +00002741 const FunctionType *fn = unwrapped.get();
2742 CallingConv CCOld = fn->getCallConv();
Charles Davis064f7db2010-02-23 06:13:55 +00002743 if (S.Context.getCanonicalCallConv(CC) ==
Abramo Bagnarae215f722010-04-30 13:10:51 +00002744 S.Context.getCanonicalCallConv(CCOld)) {
Argyrios Kyrtzidisce955662011-01-25 23:16:40 +00002745 FunctionType::ExtInfo EI= unwrapped.get()->getExtInfo().withCallingConv(CC);
2746 type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
John McCall711c52b2011-01-05 12:14:39 +00002747 return true;
Abramo Bagnarae215f722010-04-30 13:10:51 +00002748 }
John McCall04a67a62010-02-05 21:31:56 +00002749
2750 if (CCOld != CC_Default) {
2751 // Should we diagnose reapplications of the same convention?
John McCall711c52b2011-01-05 12:14:39 +00002752 S.Diag(attr.getLoc(), diag::err_attributes_are_not_compatible)
John McCall04a67a62010-02-05 21:31:56 +00002753 << FunctionType::getNameForCallConv(CC)
2754 << FunctionType::getNameForCallConv(CCOld);
John McCall711c52b2011-01-05 12:14:39 +00002755 attr.setInvalid();
2756 return true;
John McCall04a67a62010-02-05 21:31:56 +00002757 }
2758
2759 // Diagnose the use of X86 fastcall on varargs or unprototyped functions.
2760 if (CC == CC_X86FastCall) {
John McCall711c52b2011-01-05 12:14:39 +00002761 if (isa<FunctionNoProtoType>(fn)) {
2762 S.Diag(attr.getLoc(), diag::err_cconv_knr)
John McCall04a67a62010-02-05 21:31:56 +00002763 << FunctionType::getNameForCallConv(CC);
John McCall711c52b2011-01-05 12:14:39 +00002764 attr.setInvalid();
2765 return true;
John McCall04a67a62010-02-05 21:31:56 +00002766 }
2767
John McCall711c52b2011-01-05 12:14:39 +00002768 const FunctionProtoType *FnP = cast<FunctionProtoType>(fn);
John McCall04a67a62010-02-05 21:31:56 +00002769 if (FnP->isVariadic()) {
John McCall711c52b2011-01-05 12:14:39 +00002770 S.Diag(attr.getLoc(), diag::err_cconv_varargs)
John McCall04a67a62010-02-05 21:31:56 +00002771 << FunctionType::getNameForCallConv(CC);
John McCall711c52b2011-01-05 12:14:39 +00002772 attr.setInvalid();
2773 return true;
John McCall04a67a62010-02-05 21:31:56 +00002774 }
Argyrios Kyrtzidisce955662011-01-25 23:16:40 +00002775
2776 // Also diagnose fastcall with regparm.
2777 if (fn->getRegParmType()) {
2778 S.Diag(attr.getLoc(), diag::err_attributes_are_not_compatible)
2779 << "regparm"
2780 << FunctionType::getNameForCallConv(CC);
2781 attr.setInvalid();
2782 return true;
2783 }
John McCall04a67a62010-02-05 21:31:56 +00002784 }
2785
John McCall711c52b2011-01-05 12:14:39 +00002786 FunctionType::ExtInfo EI = unwrapped.get()->getExtInfo().withCallingConv(CC);
2787 type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
2788 return true;
John McCallf82b4e82010-02-04 05:44:44 +00002789}
2790
John Thompson6e132aa2009-12-04 21:51:28 +00002791/// HandleVectorSizeAttribute - this attribute is only applicable to integral
2792/// and float scalars, although arrays, pointers, and function return values are
2793/// allowed in conjunction with this construct. Aggregates with this attribute
2794/// are invalid, even if they are of the same size as a corresponding scalar.
2795/// The raw attribute should contain precisely 1 argument, the vector size for
2796/// the variable, measured in bytes. If curType and rawAttr are well formed,
2797/// this routine will return a new vector type.
Chris Lattner788b0fd2010-06-23 06:00:24 +00002798static void HandleVectorSizeAttr(QualType& CurType, const AttributeList &Attr,
2799 Sema &S) {
Bob Wilson56affbc2010-11-16 00:32:16 +00002800 // Check the attribute arguments.
John Thompson6e132aa2009-12-04 21:51:28 +00002801 if (Attr.getNumArgs() != 1) {
2802 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
Abramo Bagnarae215f722010-04-30 13:10:51 +00002803 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00002804 return;
2805 }
2806 Expr *sizeExpr = static_cast<Expr *>(Attr.getArg(0));
2807 llvm::APSInt vecSize(32);
Douglas Gregorac06a0e2010-05-18 23:01:22 +00002808 if (sizeExpr->isTypeDependent() || sizeExpr->isValueDependent() ||
2809 !sizeExpr->isIntegerConstantExpr(vecSize, S.Context)) {
John Thompson6e132aa2009-12-04 21:51:28 +00002810 S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
2811 << "vector_size" << sizeExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002812 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00002813 return;
2814 }
2815 // the base type must be integer or float, and can't already be a vector.
Douglas Gregorf6094622010-07-23 15:58:24 +00002816 if (!CurType->isIntegerType() && !CurType->isRealFloatingType()) {
John Thompson6e132aa2009-12-04 21:51:28 +00002817 S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
Abramo Bagnarae215f722010-04-30 13:10:51 +00002818 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00002819 return;
2820 }
2821 unsigned typeSize = static_cast<unsigned>(S.Context.getTypeSize(CurType));
2822 // vecSize is specified in bytes - convert to bits.
2823 unsigned vectorSize = static_cast<unsigned>(vecSize.getZExtValue() * 8);
2824
2825 // the vector size needs to be an integral multiple of the type size.
2826 if (vectorSize % typeSize) {
2827 S.Diag(Attr.getLoc(), diag::err_attribute_invalid_size)
2828 << sizeExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002829 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00002830 return;
2831 }
2832 if (vectorSize == 0) {
2833 S.Diag(Attr.getLoc(), diag::err_attribute_zero_size)
2834 << sizeExpr->getSourceRange();
Abramo Bagnarae215f722010-04-30 13:10:51 +00002835 Attr.setInvalid();
John Thompson6e132aa2009-12-04 21:51:28 +00002836 return;
2837 }
2838
2839 // Success! Instantiate the vector type, the number of elements is > 0, and
2840 // not required to be a power of 2, unlike GCC.
Chris Lattner788b0fd2010-06-23 06:00:24 +00002841 CurType = S.Context.getVectorType(CurType, vectorSize/typeSize,
Bob Wilsone86d78c2010-11-10 21:56:12 +00002842 VectorType::GenericVector);
John Thompson6e132aa2009-12-04 21:51:28 +00002843}
2844
Bob Wilson4211bb62010-11-16 00:32:24 +00002845/// HandleNeonVectorTypeAttr - The "neon_vector_type" and
2846/// "neon_polyvector_type" attributes are used to create vector types that
2847/// are mangled according to ARM's ABI. Otherwise, these types are identical
2848/// to those created with the "vector_size" attribute. Unlike "vector_size"
2849/// the argument to these Neon attributes is the number of vector elements,
2850/// not the vector size in bytes. The vector width and element type must
2851/// match one of the standard Neon vector types.
2852static void HandleNeonVectorTypeAttr(QualType& CurType,
2853 const AttributeList &Attr, Sema &S,
2854 VectorType::VectorKind VecKind,
2855 const char *AttrName) {
2856 // Check the attribute arguments.
2857 if (Attr.getNumArgs() != 1) {
2858 S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
2859 Attr.setInvalid();
2860 return;
2861 }
2862 // The number of elements must be an ICE.
2863 Expr *numEltsExpr = static_cast<Expr *>(Attr.getArg(0));
2864 llvm::APSInt numEltsInt(32);
2865 if (numEltsExpr->isTypeDependent() || numEltsExpr->isValueDependent() ||
2866 !numEltsExpr->isIntegerConstantExpr(numEltsInt, S.Context)) {
2867 S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
2868 << AttrName << numEltsExpr->getSourceRange();
2869 Attr.setInvalid();
2870 return;
2871 }
2872 // Only certain element types are supported for Neon vectors.
2873 const BuiltinType* BTy = CurType->getAs<BuiltinType>();
2874 if (!BTy ||
2875 (VecKind == VectorType::NeonPolyVector &&
2876 BTy->getKind() != BuiltinType::SChar &&
2877 BTy->getKind() != BuiltinType::Short) ||
2878 (BTy->getKind() != BuiltinType::SChar &&
2879 BTy->getKind() != BuiltinType::UChar &&
2880 BTy->getKind() != BuiltinType::Short &&
2881 BTy->getKind() != BuiltinType::UShort &&
2882 BTy->getKind() != BuiltinType::Int &&
2883 BTy->getKind() != BuiltinType::UInt &&
2884 BTy->getKind() != BuiltinType::LongLong &&
2885 BTy->getKind() != BuiltinType::ULongLong &&
2886 BTy->getKind() != BuiltinType::Float)) {
2887 S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) <<CurType;
2888 Attr.setInvalid();
2889 return;
2890 }
2891 // The total size of the vector must be 64 or 128 bits.
2892 unsigned typeSize = static_cast<unsigned>(S.Context.getTypeSize(CurType));
2893 unsigned numElts = static_cast<unsigned>(numEltsInt.getZExtValue());
2894 unsigned vecSize = typeSize * numElts;
2895 if (vecSize != 64 && vecSize != 128) {
2896 S.Diag(Attr.getLoc(), diag::err_attribute_bad_neon_vector_size) << CurType;
2897 Attr.setInvalid();
2898 return;
2899 }
2900
2901 CurType = S.Context.getVectorType(CurType, numElts, VecKind);
2902}
2903
John McCall711c52b2011-01-05 12:14:39 +00002904static void processTypeAttrs(TypeProcessingState &state, QualType &type,
2905 bool isDeclSpec, AttributeList *attrs) {
Chris Lattner232e8822008-02-21 01:08:11 +00002906 // Scan through and apply attributes to this type where it makes sense. Some
2907 // attributes (such as __address_space__, __vector_size__, etc) apply to the
2908 // type, but others can be present in the type specifiers even though they
Chris Lattnerfca0ddd2008-06-26 06:27:57 +00002909 // apply to the decl. Here we apply type attributes and ignore the rest.
John McCall711c52b2011-01-05 12:14:39 +00002910
2911 AttributeList *next;
2912 do {
2913 AttributeList &attr = *attrs;
2914 next = attr.getNext();
2915
Abramo Bagnarae215f722010-04-30 13:10:51 +00002916 // Skip attributes that were marked to be invalid.
John McCall711c52b2011-01-05 12:14:39 +00002917 if (attr.isInvalid())
Abramo Bagnarae215f722010-04-30 13:10:51 +00002918 continue;
2919
Abramo Bagnarab1f1b262010-04-30 09:13:03 +00002920 // If this is an attribute we can handle, do so now,
2921 // otherwise, add it to the FnAttrs list for rechaining.
John McCall711c52b2011-01-05 12:14:39 +00002922 switch (attr.getKind()) {
Chris Lattner232e8822008-02-21 01:08:11 +00002923 default: break;
John McCall04a67a62010-02-05 21:31:56 +00002924
Chris Lattner232e8822008-02-21 01:08:11 +00002925 case AttributeList::AT_address_space:
John McCall711c52b2011-01-05 12:14:39 +00002926 HandleAddressSpaceTypeAttribute(type, attr, state.getSema());
Chris Lattnerc9b346d2008-06-29 00:50:08 +00002927 break;
John McCall711c52b2011-01-05 12:14:39 +00002928 OBJC_POINTER_TYPE_ATTRS_CASELIST:
2929 if (!handleObjCPointerTypeAttr(state, attr, type))
2930 distributeObjCPointerTypeAttr(state, attr, type);
Mike Stump24556362009-07-25 21:26:53 +00002931 break;
John Thompson6e132aa2009-12-04 21:51:28 +00002932 case AttributeList::AT_vector_size:
John McCall711c52b2011-01-05 12:14:39 +00002933 HandleVectorSizeAttr(type, attr, state.getSema());
John McCall04a67a62010-02-05 21:31:56 +00002934 break;
Bob Wilson4211bb62010-11-16 00:32:24 +00002935 case AttributeList::AT_neon_vector_type:
John McCall711c52b2011-01-05 12:14:39 +00002936 HandleNeonVectorTypeAttr(type, attr, state.getSema(),
2937 VectorType::NeonVector, "neon_vector_type");
Bob Wilson4211bb62010-11-16 00:32:24 +00002938 break;
2939 case AttributeList::AT_neon_polyvector_type:
John McCall711c52b2011-01-05 12:14:39 +00002940 HandleNeonVectorTypeAttr(type, attr, state.getSema(),
2941 VectorType::NeonPolyVector,
Bob Wilson4211bb62010-11-16 00:32:24 +00002942 "neon_polyvector_type");
2943 break;
John McCall04a67a62010-02-05 21:31:56 +00002944
John McCall711c52b2011-01-05 12:14:39 +00002945 FUNCTION_TYPE_ATTRS_CASELIST:
2946 // Never process function type attributes as part of the
2947 // declaration-specifiers.
2948 if (isDeclSpec)
2949 distributeFunctionTypeAttrFromDeclSpec(state, attr, type);
2950
2951 // Otherwise, handle the possible delays.
2952 else if (!handleFunctionTypeAttr(state, attr, type))
2953 distributeFunctionTypeAttr(state, attr, type);
John Thompson6e132aa2009-12-04 21:51:28 +00002954 break;
Chris Lattner232e8822008-02-21 01:08:11 +00002955 }
John McCall711c52b2011-01-05 12:14:39 +00002956 } while ((attrs = next));
Chris Lattner232e8822008-02-21 01:08:11 +00002957}
2958
Mike Stump1eb44332009-09-09 15:08:12 +00002959/// @brief Ensure that the type T is a complete type.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002960///
2961/// This routine checks whether the type @p T is complete in any
2962/// context where a complete type is required. If @p T is a complete
Douglas Gregor86447ec2009-03-09 16:13:40 +00002963/// type, returns false. If @p T is a class template specialization,
2964/// this routine then attempts to perform class template
2965/// instantiation. If instantiation fails, or if @p T is incomplete
2966/// and cannot be completed, issues the diagnostic @p diag (giving it
2967/// the type @p T) and returns true.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002968///
2969/// @param Loc The location in the source that the incomplete type
2970/// diagnostic should refer to.
2971///
2972/// @param T The type that this routine is examining for completeness.
2973///
Mike Stump1eb44332009-09-09 15:08:12 +00002974/// @param PD The partial diagnostic that will be printed out if T is not a
Anders Carlssonb7906612009-08-26 23:45:07 +00002975/// complete type.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002976///
2977/// @returns @c true if @p T is incomplete and a diagnostic was emitted,
2978/// @c false otherwise.
Anders Carlsson91a0cc92009-08-26 22:33:56 +00002979bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
Anders Carlsson8c8d9192009-10-09 23:51:55 +00002980 const PartialDiagnostic &PD,
2981 std::pair<SourceLocation,
2982 PartialDiagnostic> Note) {
Anders Carlsson91a0cc92009-08-26 22:33:56 +00002983 unsigned diag = PD.getDiagID();
Mike Stump1eb44332009-09-09 15:08:12 +00002984
Douglas Gregor573d9c32009-10-21 23:19:44 +00002985 // FIXME: Add this assertion to make sure we always get instantiation points.
2986 // assert(!Loc.isInvalid() && "Invalid location in RequireCompleteType");
Douglas Gregor690dc7f2009-05-21 23:48:18 +00002987 // FIXME: Add this assertion to help us flush out problems with
2988 // checking for dependent types and type-dependent expressions.
2989 //
Mike Stump1eb44332009-09-09 15:08:12 +00002990 // assert(!T->isDependentType() &&
Douglas Gregor690dc7f2009-05-21 23:48:18 +00002991 // "Can't ask whether a dependent type is complete");
2992
Douglas Gregor4ec339f2009-01-19 19:26:10 +00002993 // If we have a complete type, we're done.
2994 if (!T->isIncompleteType())
2995 return false;
Eli Friedman3c0eb162008-05-27 03:33:27 +00002996
Douglas Gregord475b8d2009-03-25 21:17:03 +00002997 // If we have a class template specialization or a class member of a
Sebastian Redl923d56d2009-11-05 15:52:31 +00002998 // class template specialization, or an array with known size of such,
2999 // try to instantiate it.
3000 QualType MaybeTemplate = T;
Douglas Gregor89c49f02009-11-09 22:08:55 +00003001 if (const ConstantArrayType *Array = Context.getAsConstantArrayType(T))
Sebastian Redl923d56d2009-11-05 15:52:31 +00003002 MaybeTemplate = Array->getElementType();
3003 if (const RecordType *Record = MaybeTemplate->getAs<RecordType>()) {
Douglas Gregor2943aed2009-03-03 04:44:36 +00003004 if (ClassTemplateSpecializationDecl *ClassTemplateSpec
Douglas Gregord475b8d2009-03-25 21:17:03 +00003005 = dyn_cast<ClassTemplateSpecializationDecl>(Record->getDecl())) {
Douglas Gregor972e6ce2009-10-27 06:26:26 +00003006 if (ClassTemplateSpec->getSpecializationKind() == TSK_Undeclared)
3007 return InstantiateClassTemplateSpecialization(Loc, ClassTemplateSpec,
Douglas Gregord0e3daf2009-09-04 22:48:11 +00003008 TSK_ImplicitInstantiation,
Douglas Gregor5842ba92009-08-24 15:23:48 +00003009 /*Complain=*/diag != 0);
Mike Stump1eb44332009-09-09 15:08:12 +00003010 } else if (CXXRecordDecl *Rec
Douglas Gregord475b8d2009-03-25 21:17:03 +00003011 = dyn_cast<CXXRecordDecl>(Record->getDecl())) {
3012 if (CXXRecordDecl *Pattern = Rec->getInstantiatedFromMemberClass()) {
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00003013 MemberSpecializationInfo *MSInfo = Rec->getMemberSpecializationInfo();
3014 assert(MSInfo && "Missing member specialization information?");
Douglas Gregor357bbd02009-08-28 20:50:45 +00003015 // This record was instantiated from a class within a template.
Douglas Gregorb3ae4fc2009-10-12 20:18:28 +00003016 if (MSInfo->getTemplateSpecializationKind()
Douglas Gregor972e6ce2009-10-27 06:26:26 +00003017 != TSK_ExplicitSpecialization)
Douglas Gregorf6b11852009-10-08 15:14:33 +00003018 return InstantiateClass(Loc, Rec, Pattern,
3019 getTemplateInstantiationArgs(Rec),
3020 TSK_ImplicitInstantiation,
3021 /*Complain=*/diag != 0);
Douglas Gregord475b8d2009-03-25 21:17:03 +00003022 }
3023 }
3024 }
Douglas Gregor2943aed2009-03-03 04:44:36 +00003025
Douglas Gregor5842ba92009-08-24 15:23:48 +00003026 if (diag == 0)
3027 return true;
Mike Stump1eb44332009-09-09 15:08:12 +00003028
John McCall916c8702010-11-16 01:44:35 +00003029 const TagType *Tag = T->getAs<TagType>();
Rafael Espindola01620702010-03-21 22:56:43 +00003030
3031 // Avoid diagnosing invalid decls as incomplete.
3032 if (Tag && Tag->getDecl()->isInvalidDecl())
3033 return true;
3034
John McCall916c8702010-11-16 01:44:35 +00003035 // Give the external AST source a chance to complete the type.
3036 if (Tag && Tag->getDecl()->hasExternalLexicalStorage()) {
3037 Context.getExternalSource()->CompleteType(Tag->getDecl());
3038 if (!Tag->isIncompleteType())
3039 return false;
3040 }
3041
Douglas Gregor4ec339f2009-01-19 19:26:10 +00003042 // We have an incomplete type. Produce a diagnostic.
Anders Carlsson91a0cc92009-08-26 22:33:56 +00003043 Diag(Loc, PD) << T;
Douglas Gregor4ec339f2009-01-19 19:26:10 +00003044
Anders Carlsson8c8d9192009-10-09 23:51:55 +00003045 // If we have a note, produce it.
3046 if (!Note.first.isInvalid())
3047 Diag(Note.first, Note.second);
3048
Douglas Gregor4ec339f2009-01-19 19:26:10 +00003049 // If the type was a forward declaration of a class/struct/union
Rafael Espindola01620702010-03-21 22:56:43 +00003050 // type, produce a note.
Douglas Gregor4ec339f2009-01-19 19:26:10 +00003051 if (Tag && !Tag->getDecl()->isInvalidDecl())
Mike Stump1eb44332009-09-09 15:08:12 +00003052 Diag(Tag->getDecl()->getLocation(),
Douglas Gregor4ec339f2009-01-19 19:26:10 +00003053 Tag->isBeingDefined() ? diag::note_type_being_defined
3054 : diag::note_forward_declaration)
3055 << QualType(Tag, 0);
3056
3057 return true;
3058}
Douglas Gregore6258932009-03-19 00:39:20 +00003059
Douglas Gregorfe6b2d42010-03-29 23:34:08 +00003060bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
3061 const PartialDiagnostic &PD) {
3062 return RequireCompleteType(Loc, T, PD,
3063 std::make_pair(SourceLocation(), PDiag(0)));
3064}
3065
3066bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
3067 unsigned DiagID) {
3068 return RequireCompleteType(Loc, T, PDiag(DiagID),
3069 std::make_pair(SourceLocation(), PDiag(0)));
3070}
3071
Abramo Bagnara465d41b2010-05-11 21:36:43 +00003072/// \brief Retrieve a version of the type 'T' that is elaborated by Keyword
3073/// and qualified by the nested-name-specifier contained in SS.
3074QualType Sema::getElaboratedType(ElaboratedTypeKeyword Keyword,
3075 const CXXScopeSpec &SS, QualType T) {
3076 if (T.isNull())
Douglas Gregore6258932009-03-19 00:39:20 +00003077 return T;
Abramo Bagnara465d41b2010-05-11 21:36:43 +00003078 NestedNameSpecifier *NNS;
Abramo Bagnarae4da7a02010-05-19 21:37:53 +00003079 if (SS.isValid())
Abramo Bagnara465d41b2010-05-11 21:36:43 +00003080 NNS = static_cast<NestedNameSpecifier *>(SS.getScopeRep());
3081 else {
3082 if (Keyword == ETK_None)
3083 return T;
3084 NNS = 0;
3085 }
3086 return Context.getElaboratedType(Keyword, NNS, T);
Douglas Gregore6258932009-03-19 00:39:20 +00003087}
Anders Carlssonaf017e62009-06-29 22:58:55 +00003088
John McCall2a984ca2010-10-12 00:20:44 +00003089QualType Sema::BuildTypeofExprType(Expr *E, SourceLocation Loc) {
3090 ExprResult ER = CheckPlaceholderExpr(E, Loc);
3091 if (ER.isInvalid()) return QualType();
3092 E = ER.take();
3093
Fariborz Jahanian2b1d51b2010-10-05 23:24:00 +00003094 if (!E->isTypeDependent()) {
3095 QualType T = E->getType();
Fariborz Jahanianaca7f7b2010-10-06 00:23:25 +00003096 if (const TagType *TT = T->getAs<TagType>())
3097 DiagnoseUseOfDecl(TT->getDecl(), E->getExprLoc());
Fariborz Jahanian2b1d51b2010-10-05 23:24:00 +00003098 }
Anders Carlssonaf017e62009-06-29 22:58:55 +00003099 return Context.getTypeOfExprType(E);
3100}
3101
John McCall2a984ca2010-10-12 00:20:44 +00003102QualType Sema::BuildDecltypeType(Expr *E, SourceLocation Loc) {
3103 ExprResult ER = CheckPlaceholderExpr(E, Loc);
3104 if (ER.isInvalid()) return QualType();
3105 E = ER.take();
Douglas Gregor4b52e252009-12-21 23:17:24 +00003106
Anders Carlssonaf017e62009-06-29 22:58:55 +00003107 return Context.getDecltypeType(E);
3108}