Sema.cpp revision 04d50da8b699861aa7c631e1dd6b40376bd36690
1//===--- Sema.cpp - AST Builder and Semantic Analysis Implementation ------===//
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 the actions class which performs semantic analysis and
11// builds an AST out of a parse stream.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Sema/Sema.h"
16#include "TargetAttributesSema.h"
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/SmallSet.h"
19#include "llvm/ADT/APFloat.h"
20#include "clang/Sema/ExternalSemaSource.h"
21#include "clang/Sema/SemaConsumer.h"
22#include "clang/AST/ASTContext.h"
23#include "clang/AST/ASTDiagnostic.h"
24#include "clang/AST/DeclObjC.h"
25#include "clang/AST/Expr.h"
26#include "clang/Lex/Preprocessor.h"
27#include "clang/Basic/PartialDiagnostic.h"
28#include "clang/Basic/TargetInfo.h"
29using namespace clang;
30
31FunctionScopeInfo::~FunctionScopeInfo() { }
32
33void FunctionScopeInfo::Clear(unsigned NumErrors) {
34  HasBranchProtectedScope = false;
35  HasBranchIntoScope = false;
36  HasIndirectGoto = false;
37
38  LabelMap.clear();
39  SwitchStack.clear();
40  Returns.clear();
41  NumErrorsAtStartOfFunction = NumErrors;
42}
43
44BlockScopeInfo::~BlockScopeInfo() { }
45
46void Sema::ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) {
47  TUScope = S;
48  PushDeclContext(S, Context.getTranslationUnitDecl());
49
50  VAListTagName = PP.getIdentifierInfo("__va_list_tag");
51
52  if (!Context.isInt128Installed() && // May be set by PCHReader.
53      PP.getTargetInfo().getPointerWidth(0) >= 64) {
54    TypeSourceInfo *TInfo;
55
56    // Install [u]int128_t for 64-bit targets.
57    TInfo = Context.getTrivialTypeSourceInfo(Context.Int128Ty);
58    PushOnScopeChains(TypedefDecl::Create(Context, CurContext,
59                                          SourceLocation(),
60                                          &Context.Idents.get("__int128_t"),
61                                          TInfo), TUScope);
62
63    TInfo = Context.getTrivialTypeSourceInfo(Context.UnsignedInt128Ty);
64    PushOnScopeChains(TypedefDecl::Create(Context, CurContext,
65                                          SourceLocation(),
66                                          &Context.Idents.get("__uint128_t"),
67                                          TInfo), TUScope);
68    Context.setInt128Installed();
69  }
70
71
72  if (!PP.getLangOptions().ObjC1) return;
73
74  // Built-in ObjC types may already be set by PCHReader (hence isNull checks).
75  if (Context.getObjCSelType().isNull()) {
76    // Create the built-in typedef for 'SEL'.
77    QualType SelT = Context.getPointerType(Context.ObjCBuiltinSelTy);
78    TypeSourceInfo *SelInfo = Context.getTrivialTypeSourceInfo(SelT);
79    TypedefDecl *SelTypedef
80      = TypedefDecl::Create(Context, CurContext, SourceLocation(),
81                            &Context.Idents.get("SEL"), SelInfo);
82    PushOnScopeChains(SelTypedef, TUScope);
83    Context.setObjCSelType(Context.getTypeDeclType(SelTypedef));
84    Context.ObjCSelRedefinitionType = Context.getObjCSelType();
85  }
86
87  // Synthesize "@class Protocol;
88  if (Context.getObjCProtoType().isNull()) {
89    ObjCInterfaceDecl *ProtocolDecl =
90      ObjCInterfaceDecl::Create(Context, CurContext, SourceLocation(),
91                                &Context.Idents.get("Protocol"),
92                                SourceLocation(), true);
93    Context.setObjCProtoType(Context.getObjCInterfaceType(ProtocolDecl));
94    PushOnScopeChains(ProtocolDecl, TUScope, false);
95  }
96  // Create the built-in typedef for 'id'.
97  if (Context.getObjCIdType().isNull()) {
98    QualType T = Context.getObjCObjectType(Context.ObjCBuiltinIdTy, 0, 0);
99    T = Context.getObjCObjectPointerType(T);
100    TypeSourceInfo *IdInfo = Context.getTrivialTypeSourceInfo(T);
101    TypedefDecl *IdTypedef
102      = TypedefDecl::Create(Context, CurContext, SourceLocation(),
103                            &Context.Idents.get("id"), IdInfo);
104    PushOnScopeChains(IdTypedef, TUScope);
105    Context.setObjCIdType(Context.getTypeDeclType(IdTypedef));
106    Context.ObjCIdRedefinitionType = Context.getObjCIdType();
107  }
108  // Create the built-in typedef for 'Class'.
109  if (Context.getObjCClassType().isNull()) {
110    QualType T = Context.getObjCObjectType(Context.ObjCBuiltinClassTy, 0, 0);
111    T = Context.getObjCObjectPointerType(T);
112    TypeSourceInfo *ClassInfo = Context.getTrivialTypeSourceInfo(T);
113    TypedefDecl *ClassTypedef
114      = TypedefDecl::Create(Context, CurContext, SourceLocation(),
115                            &Context.Idents.get("Class"), ClassInfo);
116    PushOnScopeChains(ClassTypedef, TUScope);
117    Context.setObjCClassType(Context.getTypeDeclType(ClassTypedef));
118    Context.ObjCClassRedefinitionType = Context.getObjCClassType();
119  }
120}
121
122Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
123           bool CompleteTranslationUnit,
124           CodeCompleteConsumer *CodeCompleter)
125  : TheTargetAttributesSema(0),
126    LangOpts(pp.getLangOptions()), PP(pp), Context(ctxt), Consumer(consumer),
127    Diags(PP.getDiagnostics()), SourceMgr(PP.getSourceManager()),
128    ExternalSource(0), CodeCompleter(CodeCompleter), CurContext(0),
129    PackContext(0), VisContext(0), TopFunctionScope(0), ParsingDeclDepth(0),
130    IdResolver(pp.getLangOptions()), GlobalNewDeleteDeclared(false),
131    CompleteTranslationUnit(CompleteTranslationUnit),
132    NumSFINAEErrors(0), SuppressAccessChecking(false),
133    NonInstantiationEntries(0), CurrentInstantiationScope(0), TyposCorrected(0),
134    AnalysisWarnings(*this)
135{
136  TUScope = 0;
137  if (getLangOptions().CPlusPlus)
138    FieldCollector.reset(new CXXFieldCollector());
139
140  // Tell diagnostics how to render things from the AST library.
141  PP.getDiagnostics().SetArgToStringFn(&FormatASTNodeDiagnosticArgument,
142                                       &Context);
143
144  ExprEvalContexts.push_back(
145                  ExpressionEvaluationContextRecord(PotentiallyEvaluated, 0));
146}
147
148void Sema::Initialize() {
149  // Tell the AST consumer about this Sema object.
150  Consumer.Initialize(Context);
151
152  // FIXME: Isn't this redundant with the initialization above?
153  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
154    SC->InitializeSema(*this);
155
156  // Tell the external Sema source about this Sema object.
157  if (ExternalSemaSource *ExternalSema
158      = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
159    ExternalSema->InitializeSema(*this);
160}
161
162Sema::~Sema() {
163  if (PackContext) FreePackedContext();
164  if (VisContext) FreeVisContext();
165  delete TheTargetAttributesSema;
166  while (!FunctionScopes.empty())
167    PopFunctionOrBlockScope();
168
169  // Tell the SemaConsumer to forget about us; we're going out of scope.
170  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
171    SC->ForgetSema();
172
173  // Detach from the external Sema source.
174  if (ExternalSemaSource *ExternalSema
175        = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
176    ExternalSema->ForgetSema();
177}
178
179/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
180/// If there is already an implicit cast, merge into the existing one.
181/// The result is of the given category.
182void Sema::ImpCastExprToType(Expr *&Expr, QualType Ty,
183                             CastExpr::CastKind Kind,
184                             ImplicitCastExpr::ResultCategory Category,
185                             const CXXCastPath *BasePath) {
186  QualType ExprTy = Context.getCanonicalType(Expr->getType());
187  QualType TypeTy = Context.getCanonicalType(Ty);
188
189  if (ExprTy == TypeTy)
190    return;
191
192  if (Expr->getType()->isPointerType() && Ty->isPointerType()) {
193    QualType ExprBaseType = cast<PointerType>(ExprTy)->getPointeeType();
194    QualType BaseType = cast<PointerType>(TypeTy)->getPointeeType();
195    if (ExprBaseType.getAddressSpace() != BaseType.getAddressSpace()) {
196      Diag(Expr->getExprLoc(), diag::err_implicit_pointer_address_space_cast)
197        << Expr->getSourceRange();
198    }
199  }
200
201  // If this is a derived-to-base cast to a through a virtual base, we
202  // need a vtable.
203  if (Kind == CastExpr::CK_DerivedToBase &&
204      BasePathInvolvesVirtualBase(*BasePath)) {
205    QualType T = Expr->getType();
206    if (const PointerType *Pointer = T->getAs<PointerType>())
207      T = Pointer->getPointeeType();
208    if (const RecordType *RecordTy = T->getAs<RecordType>())
209      MarkVTableUsed(Expr->getLocStart(),
210                     cast<CXXRecordDecl>(RecordTy->getDecl()));
211  }
212
213  if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(Expr)) {
214    if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {
215      ImpCast->setType(Ty);
216      ImpCast->setCategory(Category);
217      return;
218    }
219  }
220
221  Expr = ImplicitCastExpr::Create(Context, Ty, Kind, Expr, BasePath, Category);
222}
223
224ImplicitCastExpr::ResultCategory Sema::CastCategory(Expr *E) {
225  Expr::Classification Classification = E->Classify(Context);
226  return Classification.isRValue() ?
227      ImplicitCastExpr::RValue :
228      (Classification.isLValue() ?
229          ImplicitCastExpr::LValue :
230          ImplicitCastExpr::XValue);
231}
232
233void Sema::DeleteExpr(ExprTy *E) {
234}
235void Sema::DeleteStmt(StmtTy *S) {
236}
237
238/// \brief Used to prune the decls of Sema's UnusedFileScopedDecls vector.
239static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) {
240  if (D->isUsed())
241    return true;
242
243  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
244    // For functions, UnusedFileScopedDecls stores the first declaration.
245    // Later redecls may add new information resulting in not having to warn,
246    // so check again.
247    const FunctionDecl *DeclToCheck;
248    if (!FD->hasBody(DeclToCheck))
249      DeclToCheck = FD->getMostRecentDeclaration();
250    if (DeclToCheck != FD)
251      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
252  }
253  return false;
254}
255
256/// ActOnEndOfTranslationUnit - This is called at the very end of the
257/// translation unit when EOF is reached and all but the top-level scope is
258/// popped.
259void Sema::ActOnEndOfTranslationUnit() {
260  // At PCH writing, implicit instantiations and VTable handling info are
261  // stored and performed when the PCH is included.
262  if (CompleteTranslationUnit)
263    while (1) {
264      // C++: Perform implicit template instantiations.
265      //
266      // FIXME: When we perform these implicit instantiations, we do not
267      // carefully keep track of the point of instantiation (C++ [temp.point]).
268      // This means that name lookup that occurs within the template
269      // instantiation will always happen at the end of the translation unit,
270      // so it will find some names that should not be found. Although this is
271      // common behavior for C++ compilers, it is technically wrong. In the
272      // future, we either need to be able to filter the results of name lookup
273      // or we need to perform template instantiations earlier.
274      PerformPendingImplicitInstantiations();
275
276      /// If DefinedUsedVTables ends up marking any virtual member
277      /// functions it might lead to more pending template
278      /// instantiations, which is why we need to loop here.
279      if (!DefineUsedVTables())
280        break;
281    }
282
283  // Remove file scoped decls that turned out to be used.
284  UnusedFileScopedDecls.erase(std::remove_if(UnusedFileScopedDecls.begin(),
285                                             UnusedFileScopedDecls.end(),
286                              std::bind1st(std::ptr_fun(ShouldRemoveFromUnused),
287                                           this)),
288                              UnusedFileScopedDecls.end());
289
290  if (!CompleteTranslationUnit)
291    return;
292
293  // Check for #pragma weak identifiers that were never declared
294  // FIXME: This will cause diagnostics to be emitted in a non-determinstic
295  // order!  Iterating over a densemap like this is bad.
296  for (llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator
297       I = WeakUndeclaredIdentifiers.begin(),
298       E = WeakUndeclaredIdentifiers.end(); I != E; ++I) {
299    if (I->second.getUsed()) continue;
300
301    Diag(I->second.getLocation(), diag::warn_weak_identifier_undeclared)
302      << I->first;
303  }
304
305  // C99 6.9.2p2:
306  //   A declaration of an identifier for an object that has file
307  //   scope without an initializer, and without a storage-class
308  //   specifier or with the storage-class specifier static,
309  //   constitutes a tentative definition. If a translation unit
310  //   contains one or more tentative definitions for an identifier,
311  //   and the translation unit contains no external definition for
312  //   that identifier, then the behavior is exactly as if the
313  //   translation unit contains a file scope declaration of that
314  //   identifier, with the composite type as of the end of the
315  //   translation unit, with an initializer equal to 0.
316  llvm::SmallSet<VarDecl *, 32> Seen;
317  for (unsigned i = 0, e = TentativeDefinitions.size(); i != e; ++i) {
318    VarDecl *VD = TentativeDefinitions[i]->getActingDefinition();
319
320    // If the tentative definition was completed, getActingDefinition() returns
321    // null. If we've already seen this variable before, insert()'s second
322    // return value is false.
323    if (VD == 0 || VD->isInvalidDecl() || !Seen.insert(VD))
324      continue;
325
326    if (const IncompleteArrayType *ArrayT
327        = Context.getAsIncompleteArrayType(VD->getType())) {
328      if (RequireCompleteType(VD->getLocation(),
329                              ArrayT->getElementType(),
330                              diag::err_tentative_def_incomplete_type_arr)) {
331        VD->setInvalidDecl();
332        continue;
333      }
334
335      // Set the length of the array to 1 (C99 6.9.2p5).
336      Diag(VD->getLocation(), diag::warn_tentative_incomplete_array);
337      llvm::APInt One(Context.getTypeSize(Context.getSizeType()), true);
338      QualType T = Context.getConstantArrayType(ArrayT->getElementType(),
339                                                One, ArrayType::Normal, 0);
340      VD->setType(T);
341    } else if (RequireCompleteType(VD->getLocation(), VD->getType(),
342                                   diag::err_tentative_def_incomplete_type))
343      VD->setInvalidDecl();
344
345    // Notify the consumer that we've completed a tentative definition.
346    if (!VD->isInvalidDecl())
347      Consumer.CompleteTentativeDefinition(VD);
348
349  }
350
351  // Output warning for unused file scoped decls.
352  for (std::vector<const DeclaratorDecl*>::iterator
353         I = UnusedFileScopedDecls.begin(),
354         E = UnusedFileScopedDecls.end(); I != E; ++I) {
355    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
356      const FunctionDecl *DiagD;
357      if (!FD->hasBody(DiagD))
358        DiagD = FD;
359      Diag(DiagD->getLocation(), diag::warn_unused_function)
360            << DiagD->getDeclName();
361    } else
362      Diag((*I)->getLocation(), diag::warn_unused_variable)
363            << cast<VarDecl>(*I)->getDeclName();
364  }
365}
366
367
368//===----------------------------------------------------------------------===//
369// Helper functions.
370//===----------------------------------------------------------------------===//
371
372DeclContext *Sema::getFunctionLevelDeclContext() {
373  DeclContext *DC = CurContext;
374
375  while (isa<BlockDecl>(DC) || isa<EnumDecl>(DC))
376    DC = DC->getParent();
377
378  return DC;
379}
380
381/// getCurFunctionDecl - If inside of a function body, this returns a pointer
382/// to the function decl for the function being parsed.  If we're currently
383/// in a 'block', this returns the containing context.
384FunctionDecl *Sema::getCurFunctionDecl() {
385  DeclContext *DC = getFunctionLevelDeclContext();
386  return dyn_cast<FunctionDecl>(DC);
387}
388
389ObjCMethodDecl *Sema::getCurMethodDecl() {
390  DeclContext *DC = getFunctionLevelDeclContext();
391  return dyn_cast<ObjCMethodDecl>(DC);
392}
393
394NamedDecl *Sema::getCurFunctionOrMethodDecl() {
395  DeclContext *DC = getFunctionLevelDeclContext();
396  if (isa<ObjCMethodDecl>(DC) || isa<FunctionDecl>(DC))
397    return cast<NamedDecl>(DC);
398  return 0;
399}
400
401Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() {
402  if (!this->Emit())
403    return;
404
405  // If this is not a note, and we're in a template instantiation
406  // that is different from the last template instantiation where
407  // we emitted an error, print a template instantiation
408  // backtrace.
409  if (!SemaRef.Diags.isBuiltinNote(DiagID) &&
410      !SemaRef.ActiveTemplateInstantiations.empty() &&
411      SemaRef.ActiveTemplateInstantiations.back()
412        != SemaRef.LastTemplateInstantiationErrorContext) {
413    SemaRef.PrintInstantiationStack();
414    SemaRef.LastTemplateInstantiationErrorContext
415      = SemaRef.ActiveTemplateInstantiations.back();
416  }
417}
418
419Sema::SemaDiagnosticBuilder Sema::Diag(SourceLocation Loc, unsigned DiagID) {
420  if (isSFINAEContext()) {
421    switch (Diagnostic::getDiagnosticSFINAEResponse(DiagID)) {
422    case Diagnostic::SFINAE_Report:
423      // Fall through; we'll report the diagnostic below.
424      break;
425
426    case Diagnostic::SFINAE_SubstitutionFailure:
427      // Count this failure so that we know that template argument deduction
428      // has failed.
429      ++NumSFINAEErrors;
430      // Fall through
431
432    case Diagnostic::SFINAE_Suppress:
433      // Suppress this diagnostic.
434      Diags.setLastDiagnosticIgnored();
435      return SemaDiagnosticBuilder(*this);
436    }
437  }
438
439  DiagnosticBuilder DB = Diags.Report(FullSourceLoc(Loc, SourceMgr), DiagID);
440  return SemaDiagnosticBuilder(DB, *this, DiagID);
441}
442
443Sema::SemaDiagnosticBuilder
444Sema::Diag(SourceLocation Loc, const PartialDiagnostic& PD) {
445  SemaDiagnosticBuilder Builder(Diag(Loc, PD.getDiagID()));
446  PD.Emit(Builder);
447
448  return Builder;
449}
450
451/// \brief Determines the active Scope associated with the given declaration
452/// context.
453///
454/// This routine maps a declaration context to the active Scope object that
455/// represents that declaration context in the parser. It is typically used
456/// from "scope-less" code (e.g., template instantiation, lazy creation of
457/// declarations) that injects a name for name-lookup purposes and, therefore,
458/// must update the Scope.
459///
460/// \returns The scope corresponding to the given declaraion context, or NULL
461/// if no such scope is open.
462Scope *Sema::getScopeForContext(DeclContext *Ctx) {
463
464  if (!Ctx)
465    return 0;
466
467  Ctx = Ctx->getPrimaryContext();
468  for (Scope *S = getCurScope(); S; S = S->getParent()) {
469    // Ignore scopes that cannot have declarations. This is important for
470    // out-of-line definitions of static class members.
471    if (S->getFlags() & (Scope::DeclScope | Scope::TemplateParamScope))
472      if (DeclContext *Entity = static_cast<DeclContext *> (S->getEntity()))
473        if (Ctx == Entity->getPrimaryContext())
474          return S;
475  }
476
477  return 0;
478}
479
480/// \brief Enter a new function scope
481void Sema::PushFunctionScope() {
482  if (FunctionScopes.empty()) {
483    // Use the "top" function scope rather than having to allocate memory for
484    // a new scope.
485    TopFunctionScope.Clear(getDiagnostics().getNumErrors());
486    FunctionScopes.push_back(&TopFunctionScope);
487    return;
488  }
489
490  FunctionScopes.push_back(
491                      new FunctionScopeInfo(getDiagnostics().getNumErrors()));
492}
493
494void Sema::PushBlockScope(Scope *BlockScope, BlockDecl *Block) {
495  FunctionScopes.push_back(new BlockScopeInfo(getDiagnostics().getNumErrors(),
496                                              BlockScope, Block));
497}
498
499void Sema::PopFunctionOrBlockScope() {
500  if (FunctionScopes.back() != &TopFunctionScope)
501    delete FunctionScopes.back();
502  else
503    TopFunctionScope.Clear(getDiagnostics().getNumErrors());
504
505  FunctionScopes.pop_back();
506}
507
508/// \brief Determine whether any errors occurred within this function/method/
509/// block.
510bool Sema::hasAnyErrorsInThisFunction() const {
511  unsigned NumErrors = TopFunctionScope.NumErrorsAtStartOfFunction;
512  if (!FunctionScopes.empty())
513    NumErrors = FunctionScopes.back()->NumErrorsAtStartOfFunction;
514  return NumErrors != getDiagnostics().getNumErrors();
515}
516
517BlockScopeInfo *Sema::getCurBlock() {
518  if (FunctionScopes.empty())
519    return 0;
520
521  return dyn_cast<BlockScopeInfo>(FunctionScopes.back());
522}
523
524// Pin this vtable to this file.
525ExternalSemaSource::~ExternalSemaSource() {}
526