SemaType.cpp revision 98eb8a7a702b95183ed015706b1f1c66f5cb27a4
1//===--- SemaType.cpp - Semantic Analysis for Types -----------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file implements type-related semantic analysis.
11//
12//===----------------------------------------------------------------------===//
13
14#include "Sema.h"
15#include "clang/AST/ASTContext.h"
16#include "clang/AST/DeclObjC.h"
17#include "clang/AST/Expr.h"
18#include "clang/Parse/DeclSpec.h"
19using namespace clang;
20
21/// \brief Convert the specified declspec to the appropriate type
22/// object.
23/// \param DS  the declaration specifiers
24/// \returns The type described by the declaration specifiers, or NULL
25/// if there was an error.
26QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS) {
27  // FIXME: Should move the logic from DeclSpec::Finish to here for validity
28  // checking.
29  QualType Result;
30
31  switch (DS.getTypeSpecType()) {
32  default: assert(0 && "Unknown TypeSpecType!");
33  case DeclSpec::TST_void:
34    Result = Context.VoidTy;
35    break;
36  case DeclSpec::TST_char:
37    if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified)
38      Result = Context.CharTy;
39    else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed)
40      Result = Context.SignedCharTy;
41    else {
42      assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned &&
43             "Unknown TSS value");
44      Result = Context.UnsignedCharTy;
45    }
46    break;
47  case DeclSpec::TST_wchar:
48    if (DS.getTypeSpecSign() == DeclSpec::TSS_unspecified)
49      Result = Context.WCharTy;
50    else if (DS.getTypeSpecSign() == DeclSpec::TSS_signed) {
51      Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec)
52        << DS.getSpecifierName(DS.getTypeSpecType());
53      Result = Context.getSignedWCharType();
54    } else {
55      assert(DS.getTypeSpecSign() == DeclSpec::TSS_unsigned &&
56        "Unknown TSS value");
57      Diag(DS.getTypeSpecSignLoc(), diag::ext_invalid_sign_spec)
58        << DS.getSpecifierName(DS.getTypeSpecType());
59      Result = Context.getUnsignedWCharType();
60    }
61    break;
62  case DeclSpec::TST_unspecified:
63    // "<proto1,proto2>" is an objc qualified ID with a missing id.
64    if (DeclSpec::ProtocolQualifierListTy PQ = DS.getProtocolQualifiers()) {
65      Result = Context.getObjCQualifiedIdType((ObjCProtocolDecl**)PQ,
66                                              DS.getNumProtocolQualifiers());
67      break;
68    }
69
70    // Unspecified typespec defaults to int in C90.  However, the C90 grammar
71    // [C90 6.5] only allows a decl-spec if there was *some* type-specifier,
72    // type-qualifier, or storage-class-specifier.  If not, emit an extwarn.
73    // Note that the one exception to this is function definitions, which are
74    // allowed to be completely missing a declspec.  This is handled in the
75    // parser already though by it pretending to have seen an 'int' in this
76    // case.
77    if (getLangOptions().ImplicitInt) {
78      if ((DS.getParsedSpecifiers() & (DeclSpec::PQ_StorageClassSpecifier |
79                                       DeclSpec::PQ_TypeSpecifier |
80                                       DeclSpec::PQ_TypeQualifier)) == 0)
81        Diag(DS.getSourceRange().getBegin(), diag::ext_missing_declspec);
82    } else {
83      // C99 and C++ require a type specifier.  For example, C99 6.7.2p2 says:
84      // "At least one type specifier shall be given in the declaration
85      // specifiers in each declaration, and in the specifier-qualifier list in
86      // each struct declaration and type name."
87      // FIXME: this should be a hard error in C++
88      if (!DS.hasTypeSpecifier())
89        Diag(DS.getSourceRange().getBegin(), diag::ext_missing_type_specifier);
90    }
91
92    // FALL THROUGH.
93  case DeclSpec::TST_int: {
94    if (DS.getTypeSpecSign() != DeclSpec::TSS_unsigned) {
95      switch (DS.getTypeSpecWidth()) {
96      case DeclSpec::TSW_unspecified: Result = Context.IntTy; break;
97      case DeclSpec::TSW_short:       Result = Context.ShortTy; break;
98      case DeclSpec::TSW_long:        Result = Context.LongTy; break;
99      case DeclSpec::TSW_longlong:    Result = Context.LongLongTy; break;
100      }
101    } else {
102      switch (DS.getTypeSpecWidth()) {
103      case DeclSpec::TSW_unspecified: Result = Context.UnsignedIntTy; break;
104      case DeclSpec::TSW_short:       Result = Context.UnsignedShortTy; break;
105      case DeclSpec::TSW_long:        Result = Context.UnsignedLongTy; break;
106      case DeclSpec::TSW_longlong:    Result =Context.UnsignedLongLongTy; break;
107      }
108    }
109    break;
110  }
111  case DeclSpec::TST_float: Result = Context.FloatTy; break;
112  case DeclSpec::TST_double:
113    if (DS.getTypeSpecWidth() == DeclSpec::TSW_long)
114      Result = Context.LongDoubleTy;
115    else
116      Result = Context.DoubleTy;
117    break;
118  case DeclSpec::TST_bool: Result = Context.BoolTy; break; // _Bool or bool
119  case DeclSpec::TST_decimal32:    // _Decimal32
120  case DeclSpec::TST_decimal64:    // _Decimal64
121  case DeclSpec::TST_decimal128:   // _Decimal128
122    assert(0 && "FIXME: GNU decimal extensions not supported yet!");
123  case DeclSpec::TST_class:
124  case DeclSpec::TST_enum:
125  case DeclSpec::TST_union:
126  case DeclSpec::TST_struct: {
127    Decl *D = static_cast<Decl *>(DS.getTypeRep());
128    assert(D && "Didn't get a decl for a class/enum/union/struct?");
129    assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 &&
130           DS.getTypeSpecSign() == 0 &&
131           "Can't handle qualifiers on typedef names yet!");
132    // TypeQuals handled by caller.
133    Result = Context.getTypeDeclType(cast<TypeDecl>(D));
134    break;
135  }
136  case DeclSpec::TST_typedef: {
137    Decl *D = static_cast<Decl *>(DS.getTypeRep());
138    assert(D && "Didn't get a decl for a typedef?");
139    assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 &&
140           DS.getTypeSpecSign() == 0 &&
141           "Can't handle qualifiers on typedef names yet!");
142    DeclSpec::ProtocolQualifierListTy PQ = DS.getProtocolQualifiers();
143
144    // FIXME: Adding a TST_objcInterface clause doesn't seem ideal, so
145    // we have this "hack" for now...
146    if (ObjCInterfaceDecl *ObjCIntDecl = dyn_cast<ObjCInterfaceDecl>(D)) {
147      if (PQ == 0) {
148        Result = Context.getObjCInterfaceType(ObjCIntDecl);
149        break;
150      }
151
152      Result = Context.getObjCQualifiedInterfaceType(ObjCIntDecl,
153                                                     (ObjCProtocolDecl**)PQ,
154                                                 DS.getNumProtocolQualifiers());
155      break;
156    } else if (TypedefDecl *typeDecl = dyn_cast<TypedefDecl>(D)) {
157      if (Context.getObjCIdType() == Context.getTypedefType(typeDecl) && PQ) {
158        // id<protocol-list>
159        Result = Context.getObjCQualifiedIdType((ObjCProtocolDecl**)PQ,
160                                                DS.getNumProtocolQualifiers());
161        break;
162      }
163    }
164    // TypeQuals handled by caller.
165    Result = Context.getTypeDeclType(dyn_cast<TypeDecl>(D));
166    break;
167  }
168  case DeclSpec::TST_typeofType:
169    Result = QualType::getFromOpaquePtr(DS.getTypeRep());
170    assert(!Result.isNull() && "Didn't get a type for typeof?");
171    // TypeQuals handled by caller.
172    Result = Context.getTypeOfType(Result);
173    break;
174  case DeclSpec::TST_typeofExpr: {
175    Expr *E = static_cast<Expr *>(DS.getTypeRep());
176    assert(E && "Didn't get an expression for typeof?");
177    // TypeQuals handled by caller.
178    Result = Context.getTypeOfExpr(E);
179    break;
180  }
181  }
182
183  // Handle complex types.
184  if (DS.getTypeSpecComplex() == DeclSpec::TSC_complex)
185    Result = Context.getComplexType(Result);
186
187  assert(DS.getTypeSpecComplex() != DeclSpec::TSC_imaginary &&
188         "FIXME: imaginary types not supported yet!");
189
190  // See if there are any attributes on the declspec that apply to the type (as
191  // opposed to the decl).
192  if (const AttributeList *AL = DS.getAttributes())
193    ProcessTypeAttributeList(Result, AL);
194
195  // Apply const/volatile/restrict qualifiers to T.
196  if (unsigned TypeQuals = DS.getTypeQualifiers()) {
197
198    // Enforce C99 6.7.3p2: "Types other than pointer types derived from object
199    // or incomplete types shall not be restrict-qualified."  C++ also allows
200    // restrict-qualified references.
201    if (TypeQuals & QualType::Restrict) {
202      if (const PointerLikeType *PT = Result->getAsPointerLikeType()) {
203        QualType EltTy = PT->getPointeeType();
204
205        // If we have a pointer or reference, the pointee must have an object or
206        // incomplete type.
207        if (!EltTy->isIncompleteOrObjectType()) {
208          Diag(DS.getRestrictSpecLoc(),
209               diag::err_typecheck_invalid_restrict_invalid_pointee)
210            << EltTy << DS.getSourceRange();
211          TypeQuals &= ~QualType::Restrict; // Remove the restrict qualifier.
212        }
213      } else {
214        Diag(DS.getRestrictSpecLoc(),
215             diag::err_typecheck_invalid_restrict_not_pointer)
216          << Result << DS.getSourceRange();
217        TypeQuals &= ~QualType::Restrict; // Remove the restrict qualifier.
218      }
219    }
220
221    // Warn about CV qualifiers on functions: C99 6.7.3p8: "If the specification
222    // of a function type includes any type qualifiers, the behavior is
223    // undefined."
224    if (Result->isFunctionType() && TypeQuals) {
225      // Get some location to point at, either the C or V location.
226      SourceLocation Loc;
227      if (TypeQuals & QualType::Const)
228        Loc = DS.getConstSpecLoc();
229      else {
230        assert((TypeQuals & QualType::Volatile) &&
231               "Has CV quals but not C or V?");
232        Loc = DS.getVolatileSpecLoc();
233      }
234      Diag(Loc, diag::warn_typecheck_function_qualifiers)
235        << Result << DS.getSourceRange();
236    }
237
238    // C++ [dcl.ref]p1:
239    //   Cv-qualified references are ill-formed except when the
240    //   cv-qualifiers are introduced through the use of a typedef
241    //   (7.1.3) or of a template type argument (14.3), in which
242    //   case the cv-qualifiers are ignored.
243    if (DS.getTypeSpecType() == DeclSpec::TST_typedef &&
244        TypeQuals && Result->isReferenceType()) {
245      TypeQuals &= ~QualType::Const;
246      TypeQuals &= ~QualType::Volatile;
247    }
248
249    Result = Result.getQualifiedType(TypeQuals);
250  }
251  return Result;
252}
253
254/// GetTypeForDeclarator - Convert the type for the specified
255/// declarator to Type instances. Skip the outermost Skip type
256/// objects.
257QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S, unsigned Skip) {
258  bool OmittedReturnType = false;
259
260  if (D.getContext() == Declarator::BlockLiteralContext
261      && Skip == 0
262      && !D.getDeclSpec().hasTypeSpecifier()
263      && (D.getNumTypeObjects() == 0
264          || (D.getNumTypeObjects() == 1
265              && D.getTypeObject(0).Kind == DeclaratorChunk::Function)))
266    OmittedReturnType = true;
267
268  // long long is a C99 feature.
269  if (!getLangOptions().C99 && !getLangOptions().CPlusPlus0x &&
270      D.getDeclSpec().getTypeSpecWidth() == DeclSpec::TSW_longlong)
271    Diag(D.getDeclSpec().getTypeSpecWidthLoc(), diag::ext_longlong);
272
273  // Determine the type of the declarator. Not all forms of declarator
274  // have a type.
275  QualType T;
276  switch (D.getKind()) {
277  case Declarator::DK_Abstract:
278  case Declarator::DK_Normal:
279  case Declarator::DK_Operator: {
280    const DeclSpec& DS = D.getDeclSpec();
281    if (OmittedReturnType)
282      // We default to a dependent type initially.  Can be modified by
283      // the first return statement.
284      T = Context.DependentTy;
285    else
286      T = ConvertDeclSpecToType(DS);
287    break;
288  }
289
290  case Declarator::DK_Constructor:
291  case Declarator::DK_Destructor:
292  case Declarator::DK_Conversion:
293    // Constructors and destructors don't have return types. Use
294    // "void" instead. Conversion operators will check their return
295    // types separately.
296    T = Context.VoidTy;
297    break;
298  }
299
300  // Walk the DeclTypeInfo, building the recursive type as we go.
301  // DeclTypeInfos are ordered from the identifier out, which is
302  // opposite of what we want :).
303  for (unsigned i = Skip, e = D.getNumTypeObjects(); i != e; ++i) {
304    DeclaratorChunk &DeclType = D.getTypeObject(e-i-1+Skip);
305    switch (DeclType.Kind) {
306    default: assert(0 && "Unknown decltype!");
307    case DeclaratorChunk::BlockPointer:
308      if (DeclType.Cls.TypeQuals)
309        Diag(D.getIdentifierLoc(), diag::err_qualified_block_pointer_type);
310      if (!T.getTypePtr()->isFunctionType())
311        Diag(D.getIdentifierLoc(), diag::err_nonfunction_block_type);
312      else
313        T = Context.getBlockPointerType(T);
314      break;
315    case DeclaratorChunk::Pointer:
316      if (T->isReferenceType()) {
317        // C++ 8.3.2p4: There shall be no ... pointers to references ...
318        Diag(DeclType.Loc, diag::err_illegal_decl_pointer_to_reference)
319         << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name");
320        D.setInvalidType(true);
321        T = Context.IntTy;
322      }
323
324      // Enforce C99 6.7.3p2: "Types other than pointer types derived from
325      // object or incomplete types shall not be restrict-qualified."
326      if ((DeclType.Ptr.TypeQuals & QualType::Restrict) &&
327          !T->isIncompleteOrObjectType()) {
328        Diag(DeclType.Loc, diag::err_typecheck_invalid_restrict_invalid_pointee)
329          << T;
330        DeclType.Ptr.TypeQuals &= ~QualType::Restrict;
331      }
332
333      // Apply the pointer typequals to the pointer object.
334      T = Context.getPointerType(T).getQualifiedType(DeclType.Ptr.TypeQuals);
335      break;
336    case DeclaratorChunk::Reference: {
337      // Whether we should suppress the creation of the reference.
338      bool SuppressReference = false;
339      if (T->isReferenceType()) {
340        // C++ [dcl.ref]p4: There shall be no references to references.
341        //
342        // According to C++ DR 106, references to references are only
343        // diagnosed when they are written directly (e.g., "int & &"),
344        // but not when they happen via a typedef:
345        //
346        //   typedef int& intref;
347        //   typedef intref& intref2;
348        //
349        // Parser::ParserDeclaratorInternal diagnoses the case where
350        // references are written directly; here, we handle the
351        // collapsing of references-to-references as described in C++
352        // DR 106 and amended by C++ DR 540.
353        SuppressReference = true;
354      }
355
356      // C++ [dcl.ref]p1:
357      //   A declarator that specifies the type “reference to cv void”
358      //   is ill-formed.
359      if (T->isVoidType()) {
360        Diag(DeclType.Loc, diag::err_reference_to_void);
361        D.setInvalidType(true);
362        T = Context.IntTy;
363      }
364
365      // Enforce C99 6.7.3p2: "Types other than pointer types derived from
366      // object or incomplete types shall not be restrict-qualified."
367      if (DeclType.Ref.HasRestrict &&
368          !T->isIncompleteOrObjectType()) {
369        Diag(DeclType.Loc, diag::err_typecheck_invalid_restrict_invalid_pointee)
370          << T;
371        DeclType.Ref.HasRestrict = false;
372      }
373
374      if (!SuppressReference)
375        T = Context.getReferenceType(T);
376
377      // Handle restrict on references.
378      if (DeclType.Ref.HasRestrict)
379        T.addRestrict();
380      break;
381    }
382    case DeclaratorChunk::Array: {
383      DeclaratorChunk::ArrayTypeInfo &ATI = DeclType.Arr;
384      Expr *ArraySize = static_cast<Expr*>(ATI.NumElts);
385      ArrayType::ArraySizeModifier ASM;
386      if (ATI.isStar)
387        ASM = ArrayType::Star;
388      else if (ATI.hasStatic)
389        ASM = ArrayType::Static;
390      else
391        ASM = ArrayType::Normal;
392
393      // C99 6.7.5.2p1: If the element type is an incomplete or function type,
394      // reject it (e.g. void ary[7], struct foo ary[7], void ary[7]())
395      if (DiagnoseIncompleteType(D.getIdentifierLoc(), T,
396                                 diag::err_illegal_decl_array_incomplete_type)) {
397        T = Context.IntTy;
398        D.setInvalidType(true);
399      } else if (T->isFunctionType()) {
400        Diag(D.getIdentifierLoc(), diag::err_illegal_decl_array_of_functions)
401          << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name");
402        T = Context.getPointerType(T);
403        D.setInvalidType(true);
404      } else if (const ReferenceType *RT = T->getAsReferenceType()) {
405        // C++ 8.3.2p4: There shall be no ... arrays of references ...
406        Diag(D.getIdentifierLoc(), diag::err_illegal_decl_array_of_references)
407          << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name");
408        T = RT->getPointeeType();
409        D.setInvalidType(true);
410      } else if (const RecordType *EltTy = T->getAsRecordType()) {
411        // If the element type is a struct or union that contains a variadic
412        // array, reject it: C99 6.7.2.1p2.
413        if (EltTy->getDecl()->hasFlexibleArrayMember()) {
414          Diag(DeclType.Loc, diag::err_flexible_array_in_array) << T;
415          T = Context.IntTy;
416          D.setInvalidType(true);
417        }
418      } else if (T->isObjCInterfaceType()) {
419        Diag(DeclType.Loc, diag::warn_objc_array_of_interfaces) << T;
420      }
421
422      // C99 6.7.5.2p1: The size expression shall have integer type.
423      if (ArraySize && !ArraySize->getType()->isIntegerType()) {
424        Diag(ArraySize->getLocStart(), diag::err_array_size_non_int)
425          << ArraySize->getType() << ArraySize->getSourceRange();
426        D.setInvalidType(true);
427        delete ArraySize;
428        ATI.NumElts = ArraySize = 0;
429      }
430      llvm::APSInt ConstVal(32);
431      if (!ArraySize) {
432        T = Context.getIncompleteArrayType(T, ASM, ATI.TypeQuals);
433      } else if (ArraySize->isValueDependent()) {
434        T = Context.getDependentSizedArrayType(T, ArraySize, ASM, ATI.TypeQuals);
435      } else if (!ArraySize->isIntegerConstantExpr(ConstVal, Context) ||
436                 !T->isConstantSizeType()) {
437        // Per C99, a variable array is an array with either a non-constant
438        // size or an element type that has a non-constant-size
439        T = Context.getVariableArrayType(T, ArraySize, ASM, ATI.TypeQuals);
440      } else {
441        // C99 6.7.5.2p1: If the expression is a constant expression, it shall
442        // have a value greater than zero.
443        if (ConstVal.isSigned()) {
444          if (ConstVal.isNegative()) {
445            Diag(ArraySize->getLocStart(),
446                 diag::err_typecheck_negative_array_size)
447              << ArraySize->getSourceRange();
448            D.setInvalidType(true);
449          } else if (ConstVal == 0) {
450            // GCC accepts zero sized static arrays.
451            Diag(ArraySize->getLocStart(), diag::ext_typecheck_zero_array_size)
452              << ArraySize->getSourceRange();
453          }
454        }
455        T = Context.getConstantArrayType(T, ConstVal, ASM, ATI.TypeQuals);
456      }
457      // If this is not C99, extwarn about VLA's and C99 array size modifiers.
458      if (!getLangOptions().C99) {
459        if (ArraySize && !ArraySize->isValueDependent() &&
460            !ArraySize->isIntegerConstantExpr(Context))
461          Diag(D.getIdentifierLoc(), diag::ext_vla);
462        else if (ASM != ArrayType::Normal || ATI.TypeQuals != 0)
463          Diag(D.getIdentifierLoc(), diag::ext_c99_array_usage);
464      }
465      break;
466    }
467    case DeclaratorChunk::Function: {
468      // If the function declarator has a prototype (i.e. it is not () and
469      // does not have a K&R-style identifier list), then the arguments are part
470      // of the type, otherwise the argument list is ().
471      const DeclaratorChunk::FunctionTypeInfo &FTI = DeclType.Fun;
472
473      // C99 6.7.5.3p1: The return type may not be a function or array type.
474      if (T->isArrayType() || T->isFunctionType()) {
475        Diag(DeclType.Loc, diag::err_func_returning_array_function) << T;
476        T = Context.IntTy;
477        D.setInvalidType(true);
478      }
479
480      if (FTI.NumArgs == 0) {
481        if (getLangOptions().CPlusPlus) {
482          // C++ 8.3.5p2: If the parameter-declaration-clause is empty, the
483          // function takes no arguments.
484          T = Context.getFunctionType(T, NULL, 0, FTI.isVariadic,FTI.TypeQuals);
485        } else {
486          // Simple void foo(), where the incoming T is the result type.
487          T = Context.getFunctionTypeNoProto(T);
488        }
489      } else if (FTI.ArgInfo[0].Param == 0) {
490        // C99 6.7.5.3p3: Reject int(x,y,z) when it's not a function definition.
491        Diag(FTI.ArgInfo[0].IdentLoc, diag::err_ident_list_in_fn_declaration);
492      } else {
493        // Otherwise, we have a function with an argument list that is
494        // potentially variadic.
495        llvm::SmallVector<QualType, 16> ArgTys;
496
497        for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) {
498          ParmVarDecl *Param = (ParmVarDecl *)FTI.ArgInfo[i].Param;
499          QualType ArgTy = Param->getType();
500          assert(!ArgTy.isNull() && "Couldn't parse type?");
501          //
502          // Perform the default function/array conversion (C99 6.7.5.3p[7,8]).
503          // This matches the conversion that is done in
504          // Sema::ActOnParamDeclarator(). Without this conversion, the
505          // argument type in the function prototype *will not* match the
506          // type in ParmVarDecl (which makes the code generator unhappy).
507          //
508          // FIXME: We still apparently need the conversion in
509          // Sema::ActOnParamDeclarator(). This doesn't make any sense, since
510          // it should be driving off the type being created here.
511          //
512          // FIXME: If a source translation tool needs to see the original type,
513          // then we need to consider storing both types somewhere...
514          //
515          if (ArgTy->isArrayType()) {
516            ArgTy = Context.getArrayDecayedType(ArgTy);
517          } else if (ArgTy->isFunctionType())
518            ArgTy = Context.getPointerType(ArgTy);
519
520          // Look for 'void'.  void is allowed only as a single argument to a
521          // function with no other parameters (C99 6.7.5.3p10).  We record
522          // int(void) as a FunctionTypeProto with an empty argument list.
523          else if (ArgTy->isVoidType()) {
524            // If this is something like 'float(int, void)', reject it.  'void'
525            // is an incomplete type (C99 6.2.5p19) and function decls cannot
526            // have arguments of incomplete type.
527            if (FTI.NumArgs != 1 || FTI.isVariadic) {
528              Diag(DeclType.Loc, diag::err_void_only_param);
529              ArgTy = Context.IntTy;
530              Param->setType(ArgTy);
531            } else if (FTI.ArgInfo[i].Ident) {
532              // Reject, but continue to parse 'int(void abc)'.
533              Diag(FTI.ArgInfo[i].IdentLoc,
534                   diag::err_param_with_void_type);
535              ArgTy = Context.IntTy;
536              Param->setType(ArgTy);
537            } else {
538              // Reject, but continue to parse 'float(const void)'.
539              if (ArgTy.getCVRQualifiers())
540                Diag(DeclType.Loc, diag::err_void_param_qualified);
541
542              // Do not add 'void' to the ArgTys list.
543              break;
544            }
545          } else if (!FTI.hasPrototype) {
546            if (ArgTy->isPromotableIntegerType()) {
547              ArgTy = Context.IntTy;
548            } else if (const BuiltinType* BTy = ArgTy->getAsBuiltinType()) {
549              if (BTy->getKind() == BuiltinType::Float)
550                ArgTy = Context.DoubleTy;
551            }
552          }
553
554          ArgTys.push_back(ArgTy);
555        }
556        T = Context.getFunctionType(T, &ArgTys[0], ArgTys.size(),
557                                    FTI.isVariadic, FTI.TypeQuals);
558      }
559      break;
560    }
561    case DeclaratorChunk::MemberPointer:
562      // The scope spec must refer to a class, or be dependent.
563      DeclContext *DC = static_cast<DeclContext*>(
564        DeclType.Mem.Scope().getScopeRep());
565      QualType ClsType;
566      // FIXME: Extend for dependent types when it's actually supported.
567      // See ActOnCXXNestedNameSpecifier.
568      if (CXXRecordDecl *RD = dyn_cast_or_null<CXXRecordDecl>(DC)) {
569        ClsType = Context.getTagDeclType(RD);
570      } else {
571        if (DC) {
572          Diag(DeclType.Mem.Scope().getBeginLoc(),
573               diag::err_illegal_decl_mempointer_in_nonclass)
574            << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name")
575            << DeclType.Mem.Scope().getRange();
576        }
577        D.setInvalidType(true);
578        ClsType = Context.IntTy;
579      }
580
581      // C++ 8.3.3p3: A pointer to member shall not pointer to ... a member
582      //   with reference type, or "cv void."
583      if (T->isReferenceType()) {
584        Diag(DeclType.Loc, diag::err_illegal_decl_pointer_to_reference)
585          << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name");
586        D.setInvalidType(true);
587        T = Context.IntTy;
588      }
589      if (T->isVoidType()) {
590        Diag(DeclType.Loc, diag::err_illegal_decl_mempointer_to_void)
591          << (D.getIdentifier() ? D.getIdentifier()->getName() : "type name");
592        T = Context.IntTy;
593      }
594
595      // Enforce C99 6.7.3p2: "Types other than pointer types derived from
596      // object or incomplete types shall not be restrict-qualified."
597      if ((DeclType.Mem.TypeQuals & QualType::Restrict) &&
598          !T->isIncompleteOrObjectType()) {
599        Diag(DeclType.Loc, diag::err_typecheck_invalid_restrict_invalid_pointee)
600          << T;
601        DeclType.Mem.TypeQuals &= ~QualType::Restrict;
602      }
603
604      T = Context.getMemberPointerType(T, ClsType.getTypePtr()).
605                    getQualifiedType(DeclType.Mem.TypeQuals);
606
607      break;
608    }
609
610    // See if there are any attributes on this declarator chunk.
611    if (const AttributeList *AL = DeclType.getAttrs())
612      ProcessTypeAttributeList(T, AL);
613  }
614
615  if (getLangOptions().CPlusPlus && T->isFunctionType()) {
616    const FunctionTypeProto *FnTy = T->getAsFunctionTypeProto();
617    assert(FnTy && "Why oh why is there not a FunctionTypeProto here ?");
618
619    // C++ 8.3.5p4: A cv-qualifier-seq shall only be part of the function type
620    // for a nonstatic member function, the function type to which a pointer
621    // to member refers, or the top-level function type of a function typedef
622    // declaration.
623    if (FnTy->getTypeQuals() != 0 &&
624        D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
625        ((D.getContext() != Declarator::MemberContext &&
626          (!D.getCXXScopeSpec().isSet() ||
627           !static_cast<DeclContext*>(D.getCXXScopeSpec().getScopeRep())
628              ->isRecord())) ||
629         D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static)) {
630      if (D.isFunctionDeclarator())
631        Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_function_type);
632      else
633        Diag(D.getIdentifierLoc(),
634             diag::err_invalid_qualified_typedef_function_type_use);
635
636      // Strip the cv-quals from the type.
637      T = Context.getFunctionType(FnTy->getResultType(), FnTy->arg_type_begin(),
638                                  FnTy->getNumArgs(), FnTy->isVariadic(), 0);
639    }
640  }
641
642  // If there were any type attributes applied to the decl itself (not the
643  // type, apply the type attribute to the type!)
644  if (const AttributeList *Attrs = D.getAttributes())
645    ProcessTypeAttributeList(T, Attrs);
646
647  return T;
648}
649
650/// ObjCGetTypeForMethodDefinition - Builds the type for a method definition
651/// declarator
652QualType Sema::ObjCGetTypeForMethodDefinition(DeclTy *D) {
653  ObjCMethodDecl *MDecl = dyn_cast<ObjCMethodDecl>(static_cast<Decl *>(D));
654  QualType T = MDecl->getResultType();
655  llvm::SmallVector<QualType, 16> ArgTys;
656
657  // Add the first two invisible argument types for self and _cmd.
658  if (MDecl->isInstanceMethod()) {
659    QualType selfTy = Context.getObjCInterfaceType(MDecl->getClassInterface());
660    selfTy = Context.getPointerType(selfTy);
661    ArgTys.push_back(selfTy);
662  }
663  else
664    ArgTys.push_back(Context.getObjCIdType());
665  ArgTys.push_back(Context.getObjCSelType());
666
667  for (int i = 0, e = MDecl->getNumParams(); i != e; ++i) {
668    ParmVarDecl *PDecl = MDecl->getParamDecl(i);
669    QualType ArgTy = PDecl->getType();
670    assert(!ArgTy.isNull() && "Couldn't parse type?");
671    // Perform the default function/array conversion (C99 6.7.5.3p[7,8]).
672    // This matches the conversion that is done in
673    // Sema::ActOnParamDeclarator().
674    if (ArgTy->isArrayType())
675      ArgTy = Context.getArrayDecayedType(ArgTy);
676    else if (ArgTy->isFunctionType())
677      ArgTy = Context.getPointerType(ArgTy);
678    ArgTys.push_back(ArgTy);
679  }
680  T = Context.getFunctionType(T, &ArgTys[0], ArgTys.size(),
681                              MDecl->isVariadic(), 0);
682  return T;
683}
684
685/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types  that
686/// may be similar (C++ 4.4), replaces T1 and T2 with the type that
687/// they point to and return true. If T1 and T2 aren't pointer types
688/// or pointer-to-member types, or if they are not similar at this
689/// level, returns false and leaves T1 and T2 unchanged. Top-level
690/// qualifiers on T1 and T2 are ignored. This function will typically
691/// be called in a loop that successively "unwraps" pointer and
692/// pointer-to-member types to compare them at each level.
693bool Sema::UnwrapSimilarPointerTypes(QualType& T1, QualType& T2)
694{
695  const PointerType *T1PtrType = T1->getAsPointerType(),
696                    *T2PtrType = T2->getAsPointerType();
697  if (T1PtrType && T2PtrType) {
698    T1 = T1PtrType->getPointeeType();
699    T2 = T2PtrType->getPointeeType();
700    return true;
701  }
702
703  const MemberPointerType *T1MPType = T1->getAsMemberPointerType(),
704                          *T2MPType = T2->getAsMemberPointerType();
705  if (T1MPType && T2MPType &&
706      Context.getCanonicalType(T1MPType->getClass()) ==
707      Context.getCanonicalType(T2MPType->getClass())) {
708    T1 = T1MPType->getPointeeType();
709    T2 = T2MPType->getPointeeType();
710    return true;
711  }
712  return false;
713}
714
715Sema::TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) {
716  // C99 6.7.6: Type names have no identifier.  This is already validated by
717  // the parser.
718  assert(D.getIdentifier() == 0 && "Type name should have no identifier!");
719
720  QualType T = GetTypeForDeclarator(D, S);
721
722  assert(!T.isNull() && "GetTypeForDeclarator() returned null type");
723
724  // Check that there are no default arguments (C++ only).
725  if (getLangOptions().CPlusPlus)
726    CheckExtraCXXDefaultArguments(D);
727
728  // In this context, we *do not* check D.getInvalidType(). If the declarator
729  // type was invalid, GetTypeForDeclarator() still returns a "valid" type,
730  // though it will not reflect the user specified type.
731  return T.getAsOpaquePtr();
732}
733
734
735
736//===----------------------------------------------------------------------===//
737// Type Attribute Processing
738//===----------------------------------------------------------------------===//
739
740/// HandleAddressSpaceTypeAttribute - Process an address_space attribute on the
741/// specified type.  The attribute contains 1 argument, the id of the address
742/// space for the type.
743static void HandleAddressSpaceTypeAttribute(QualType &Type,
744                                            const AttributeList &Attr, Sema &S){
745  // If this type is already address space qualified, reject it.
746  // Clause 6.7.3 - Type qualifiers: "No type shall be qualified by qualifiers
747  // for two or more different address spaces."
748  if (Type.getAddressSpace()) {
749    S.Diag(Attr.getLoc(), diag::err_attribute_address_multiple_qualifiers);
750    return;
751  }
752
753  // Check the attribute arguments.
754  if (Attr.getNumArgs() != 1) {
755    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
756    return;
757  }
758  Expr *ASArgExpr = static_cast<Expr *>(Attr.getArg(0));
759  llvm::APSInt addrSpace(32);
760  if (!ASArgExpr->isIntegerConstantExpr(addrSpace, S.Context)) {
761    S.Diag(Attr.getLoc(), diag::err_attribute_address_space_not_int)
762      << ASArgExpr->getSourceRange();
763    return;
764  }
765
766  unsigned ASIdx = static_cast<unsigned>(addrSpace.getZExtValue());
767  Type = S.Context.getASQualType(Type, ASIdx);
768}
769
770void Sema::ProcessTypeAttributeList(QualType &Result, const AttributeList *AL) {
771  // Scan through and apply attributes to this type where it makes sense.  Some
772  // attributes (such as __address_space__, __vector_size__, etc) apply to the
773  // type, but others can be present in the type specifiers even though they
774  // apply to the decl.  Here we apply type attributes and ignore the rest.
775  for (; AL; AL = AL->getNext()) {
776    // If this is an attribute we can handle, do so now, otherwise, add it to
777    // the LeftOverAttrs list for rechaining.
778    switch (AL->getKind()) {
779    default: break;
780    case AttributeList::AT_address_space:
781      HandleAddressSpaceTypeAttribute(Result, *AL, *this);
782      break;
783    }
784  }
785}
786
787/// @brief If the type T is incomplete and cannot be completed,
788/// produce a suitable diagnostic.
789///
790/// This routine checks whether the type @p T is complete in any
791/// context where a complete type is required. If @p T is a complete
792/// type, returns false. If @p T is incomplete, issues the diagnostic
793/// @p diag (giving it the type @p T) and returns true.
794///
795/// @param Loc  The location in the source that the incomplete type
796/// diagnostic should refer to.
797///
798/// @param T  The type that this routine is examining for completeness.
799///
800/// @param diag The diagnostic value (e.g.,
801/// @c diag::err_typecheck_decl_incomplete_type) that will be used
802/// for the error message if @p T is incomplete.
803///
804/// @param Range1  An optional range in the source code that will be a
805/// part of the "incomplete type" error message.
806///
807/// @param Range2  An optional range in the source code that will be a
808/// part of the "incomplete type" error message.
809///
810/// @param PrintType If non-NULL, the type that should be printed
811/// instead of @p T. This parameter should be used when the type that
812/// we're checking for incompleteness isn't the type that should be
813/// displayed to the user, e.g., when T is a type and PrintType is a
814/// pointer to T.
815///
816/// @returns @c true if @p T is incomplete and a diagnostic was emitted,
817/// @c false otherwise.
818///
819/// @todo When Clang gets proper support for C++ templates, this
820/// routine will also be able perform template instantiation when @p T
821/// is a class template specialization.
822bool Sema::DiagnoseIncompleteType(SourceLocation Loc, QualType T, unsigned diag,
823                                  SourceRange Range1, SourceRange Range2,
824                                  QualType PrintType) {
825  // If we have a complete type, we're done.
826  if (!T->isIncompleteType())
827    return false;
828
829  if (PrintType.isNull())
830    PrintType = T;
831
832  // We have an incomplete type. Produce a diagnostic.
833  Diag(Loc, diag) << PrintType << Range1 << Range2;
834
835  // If the type was a forward declaration of a class/struct/union
836  // type, produce
837  const TagType *Tag = 0;
838  if (const RecordType *Record = T->getAsRecordType())
839    Tag = Record;
840  else if (const EnumType *Enum = T->getAsEnumType())
841    Tag = Enum;
842
843  if (Tag && !Tag->getDecl()->isInvalidDecl())
844    Diag(Tag->getDecl()->getLocation(),
845         Tag->isBeingDefined() ? diag::note_type_being_defined
846                               : diag::note_forward_declaration)
847        << QualType(Tag, 0);
848
849  return true;
850}
851