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