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