SemaCXXScopeSpec.cpp revision 39a8de10c18365bde7062d8959b7ed525449c561
13d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet//===--- SemaCXXScopeSpec.cpp - Semantic Analysis for C++ scope specifiers-===//
23d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet//
33d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet//                     The LLVM Compiler Infrastructure
43d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet//
53d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet// This file is distributed under the University of Illinois Open Source
63d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet// License. See LICENSE.TXT for details.
73d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet//
83d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet//===----------------------------------------------------------------------===//
93d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet//
103d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet// This file implements C++ semantic analysis for scope specifiers.
113d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet//
123d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet//===----------------------------------------------------------------------===//
133d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
143d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet#include "Sema.h"
153d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet#include "clang/AST/ASTContext.h"
163d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet#include "clang/Parse/DeclSpec.h"
173d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet#include "llvm/ADT/STLExtras.h"
183d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venetusing namespace clang;
193d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
203d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
213d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// ActOnCXXGlobalScopeSpecifier - Return the object that represents the
223d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// global scope ('::').
233d658640abc128dcc84a5a5201456395c86c4fa6Cedric VenetSema::CXXScopeTy *Sema::ActOnCXXGlobalScopeSpecifier(Scope *S,
243d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet                                                     SourceLocation CCLoc) {
253d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  return cast<DeclContext>(Context.getTranslationUnitDecl());
263d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet}
273d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
283d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// ActOnCXXNestedNameSpecifier - Called during parsing of a
293d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// nested-name-specifier. e.g. for "foo::bar::" we parsed "foo::" and now
303d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// we want to resolve "bar::". 'SS' is empty or the previously parsed
313d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// nested-name part ("foo::"), 'IdLoc' is the source location of 'bar',
323d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// 'CCLoc' is the location of '::' and 'II' is the identifier for 'bar'.
333d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// Returns a CXXScopeTy* object representing the C++ scope.
343d658640abc128dcc84a5a5201456395c86c4fa6Cedric VenetSema::CXXScopeTy *Sema::ActOnCXXNestedNameSpecifier(Scope *S,
353d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet                                                    const CXXScopeSpec &SS,
363d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet                                                    SourceLocation IdLoc,
373d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet                                                    SourceLocation CCLoc,
383d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet                                                    IdentifierInfo &II) {
393d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  NamedDecl *SD = LookupParsedName(S, &SS, &II, LookupNestedNameSpecifierName);
403d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
413d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  if (SD) {
423d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    if (TypedefDecl *TD = dyn_cast<TypedefDecl>(SD)) {
433d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet      if (const RecordType* Record = TD->getUnderlyingType()->getAsRecordType())
443d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet        return cast<DeclContext>(Record->getDecl());
453d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    } else if (isa<NamespaceDecl>(SD) || isa<RecordDecl>(SD)) {
463d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet      return cast<DeclContext>(SD);
473d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    }
483d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
493d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    // FIXME: Template parameters and dependent types.
503d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    // FIXME: C++0x scoped enums
513d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
523d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    // Fall through to produce an error: we found something that isn't
533d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    // a class or a namespace.
543d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  }
553d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
563d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  // If we didn't find anything during our lookup, try again with
573d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  // ordinary name lookup, which can help us produce better error
583d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  // messages.
593d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  if (!SD)
603d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    SD = LookupParsedName(S, &SS, &II, LookupOrdinaryName);
613d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  unsigned DiagID;
623d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  if (SD)
633d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    DiagID = diag::err_expected_class_or_namespace;
643d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  else if (SS.isSet())
653d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    DiagID = diag::err_typecheck_no_member;
663d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  else
673d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    DiagID = diag::err_undeclared_var_use;
683d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
693d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  if (SS.isSet())
703d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    Diag(IdLoc, DiagID) << &II << SS.getRange();
713d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  else
723d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    Diag(IdLoc, DiagID) << &II;
733d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
743d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  return 0;
753d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet}
763d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
7739a8de10c18365bde7062d8959b7ed525449c561Douglas GregorSema::CXXScopeTy *Sema::ActOnCXXNestedNameSpecifier(Scope *S,
7839a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor                                                    const CXXScopeSpec &SS,
7939a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor                                                    TypeTy *Ty,
8039a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor                                                    SourceRange TypeRange,
8139a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor                                                    SourceLocation CCLoc) {
8239a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor  QualType Type = QualType::getFromOpaquePtr(Ty);
8339a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor  assert(Type->isRecordType() &&
8439a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor         "Types in a nested-name-specifier always refer to a record type");
8539a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor  return cast<DeclContext>(Type->getAsRecordType()->getDecl());
8639a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor}
8739a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor
883d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
893d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// scope or nested-name-specifier) is parsed, part of a declarator-id.
903d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// After this method is called, according to [C++ 3.4.3p3], names should be
913d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// looked up in the declarator-id's scope, until the declarator is parsed and
923d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// ActOnCXXExitDeclaratorScope is called.
933d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// The 'SS' should be a non-empty valid CXXScopeSpec.
943d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venetvoid Sema::ActOnCXXEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS) {
953d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  assert(SS.isSet() && "Parser passed invalid CXXScopeSpec.");
963d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  assert(PreDeclaratorDC == 0 && "Previous declarator context not popped?");
973d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  PreDeclaratorDC = static_cast<DeclContext*>(S->getEntity());
983d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  CurContext = static_cast<DeclContext*>(SS.getScopeRep());
993d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  S->setEntity(CurContext);
1003d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet}
1013d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
1023d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
1033d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
1043d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
1053d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// Used to indicate that names should revert to being looked up in the
1063d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet/// defining scope.
1073d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venetvoid Sema::ActOnCXXExitDeclaratorScope(Scope *S, const CXXScopeSpec &SS) {
1083d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  assert(SS.isSet() && "Parser passed invalid CXXScopeSpec.");
1093d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  assert(S->getEntity() == SS.getScopeRep() && "Context imbalance!");
1103d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  S->setEntity(PreDeclaratorDC);
1113d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  PreDeclaratorDC = 0;
1123d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet
1133d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  // Reset CurContext to the nearest enclosing context.
1143d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  while (!S->getEntity() && S->getParent())
1153d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet    S = S->getParent();
1163d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet  CurContext = static_cast<DeclContext*>(S->getEntity());
1173d658640abc128dcc84a5a5201456395c86c4fa6Cedric Venet}
118