diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-05-30 06:31:56 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-05-30 06:31:56 +0000 |
| commit | 3bc6e4c72aa91604812b1a387b435a84c0489d4f (patch) | |
| tree | 8641951f48bea9eafb12c5b12e125b0a4a666953 | |
| parent | 2d042f1cf42297dbd9cf7ae9ef558a74dfc0be9e (diff) | |
| download | bcm5719-llvm-3bc6e4c72aa91604812b1a387b435a84c0489d4f.tar.gz bcm5719-llvm-3bc6e4c72aa91604812b1a387b435a84c0489d4f.zip | |
Printing for using directives, e.g.,
using namespace std::debug;
Extended UsingDirectiveDecl to store the nested-name-specifier that
precedes the nominated namespace.
llvm-svn: 72614
| -rw-r--r-- | clang/include/clang/AST/DeclCXX.h | 23 | ||||
| -rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/AST/DeclPrinter.cpp | 21 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 8 | ||||
| -rw-r--r-- | clang/test/Coverage/ast-printing.cpp | 6 | ||||
| -rw-r--r-- | clang/test/Coverage/c-language-features.inc | 1 | ||||
| -rw-r--r-- | clang/test/Coverage/cxx-language-features.inc | 12 |
7 files changed, 71 insertions, 6 deletions
diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h index 19adc6d8294..7a5233a6af9 100644 --- a/clang/include/clang/AST/DeclCXX.h +++ b/clang/include/clang/AST/DeclCXX.h @@ -878,6 +878,14 @@ class UsingDirectiveDecl : public NamedDecl { /// SourceLocation - Location of 'namespace' token. SourceLocation NamespaceLoc; + /// \brief The source range that covers the nested-name-specifier + /// preceding the namespace name. + SourceRange QualifierRange; + + /// \brief The nested-name-specifier that precedes the namespace + /// name, if any. + NestedNameSpecifier *Qualifier; + /// IdentLoc - Location of nominated namespace-name identifier. // FIXME: We don't store location of scope specifier. SourceLocation IdentLoc; @@ -898,16 +906,27 @@ class UsingDirectiveDecl : public NamedDecl { UsingDirectiveDecl(DeclContext *DC, SourceLocation L, SourceLocation NamespcLoc, + SourceRange QualifierRange, + NestedNameSpecifier *Qualifier, SourceLocation IdentLoc, NamespaceDecl *Nominated, DeclContext *CommonAncestor) : NamedDecl(Decl::UsingDirective, DC, L, getName()), - NamespaceLoc(NamespcLoc), IdentLoc(IdentLoc), + NamespaceLoc(NamespcLoc), QualifierRange(QualifierRange), + Qualifier(Qualifier), IdentLoc(IdentLoc), NominatedNamespace(Nominated? Nominated->getOriginalNamespace() : 0), CommonAncestor(CommonAncestor) { } public: + /// \brief Retrieve the source range of the nested-name-specifier + /// that qualifiers the namespace name. + SourceRange getQualifierRange() const { return QualifierRange; } + + /// \brief Retrieve the nested-name-specifier that qualifies the + /// name of the namespace. + NestedNameSpecifier *getQualifier() const { return Qualifier; } + /// getNominatedNamespace - Returns namespace nominated by using-directive. NamespaceDecl *getNominatedNamespace() { return NominatedNamespace; } @@ -929,6 +948,8 @@ public: static UsingDirectiveDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L, SourceLocation NamespaceLoc, + SourceRange QualifierRange, + NestedNameSpecifier *Qualifier, SourceLocation IdentLoc, NamespaceDecl *Nominated, DeclContext *CommonAncestor); diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index 5b806fae7b8..5fb2a016b64 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -402,11 +402,13 @@ LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, SourceLocation NamespaceLoc, + SourceRange QualifierRange, + NestedNameSpecifier *Qualifier, SourceLocation IdentLoc, NamespaceDecl *Used, DeclContext *CommonAncestor) { - return new (C) UsingDirectiveDecl(DC, L, NamespaceLoc, IdentLoc, - Used, CommonAncestor); + return new (C) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierRange, + Qualifier, IdentLoc, Used, CommonAncestor); } NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC, diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp index 6412f750ae9..bfd3dca3e6d 100644 --- a/clang/lib/AST/DeclPrinter.cpp +++ b/clang/lib/AST/DeclPrinter.cpp @@ -51,12 +51,15 @@ namespace { void VisitFieldDecl(FieldDecl *D); void VisitVarDecl(VarDecl *D); void VisitParmVarDecl(ParmVarDecl *D); + void VisitOriginalParmVarDecl(OriginalParmVarDecl *D); void VisitFileScopeAsmDecl(FileScopeAsmDecl *D); + void VisitOverloadedFunctionDecl(OverloadedFunctionDecl *D); + void VisitUsingDirectiveDecl(UsingDirectiveDecl *D); void VisitNamespaceDecl(NamespaceDecl *D); void VisitLinkageSpecDecl(LinkageSpecDecl *D); void VisitTemplateDecl(TemplateDecl *D); - void VisitObjCClassDecl(ObjCClassDecl *D); void VisitObjCMethodDecl(ObjCMethodDecl *D); + void VisitObjCClassDecl(ObjCClassDecl *D); void VisitObjCImplementationDecl(ObjCImplementationDecl *D); void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); @@ -402,6 +405,10 @@ void DeclPrinter::VisitParmVarDecl(ParmVarDecl *D) { VisitVarDecl(D); } +void DeclPrinter::VisitOriginalParmVarDecl(OriginalParmVarDecl *D) { + VisitVarDecl(D); +} + void DeclPrinter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) { Out << "__asm ("; D->getAsmString()->printPretty(Out, Context, 0, Policy, Indentation); @@ -411,6 +418,18 @@ void DeclPrinter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) { //---------------------------------------------------------------------------- // C++ declarations //---------------------------------------------------------------------------- +void DeclPrinter::VisitOverloadedFunctionDecl(OverloadedFunctionDecl *D) { + assert(false && + "OverloadedFunctionDecls aren't really decls and are never printed"); +} + +void DeclPrinter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { + Out << "using namespace "; + if (D->getQualifier()) + D->getQualifier()->print(Out, Policy); + Out << D->getNominatedNamespace()->getNameAsString(); +} + void DeclPrinter::VisitNamespaceDecl(NamespaceDecl *D) { Out << "namespace " << D->getNameAsString() << " {\n"; VisitDeclContext(D); diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 0bf97f560d5..cd722fe1693 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1711,8 +1711,12 @@ Sema::DeclPtrTy Sema::ActOnUsingDirective(Scope *S, while (CommonAncestor && !CommonAncestor->Encloses(CurContext)) CommonAncestor = CommonAncestor->getParent(); - UDir = UsingDirectiveDecl::Create(Context, CurContext, UsingLoc, - NamespcLoc, IdentLoc, + UDir = UsingDirectiveDecl::Create(Context, + CurContext, UsingLoc, + NamespcLoc, + SS.getRange(), + (NestedNameSpecifier *)SS.getScopeRep(), + IdentLoc, cast<NamespaceDecl>(NS), CommonAncestor); PushUsingDirective(S, UDir); diff --git a/clang/test/Coverage/ast-printing.cpp b/clang/test/Coverage/ast-printing.cpp new file mode 100644 index 00000000000..10d01c74374 --- /dev/null +++ b/clang/test/Coverage/ast-printing.cpp @@ -0,0 +1,6 @@ +// RUN: clang-cc --fsyntax-only %s && +// RUN: clang-cc --ast-print %s && +// RUN: clang-cc --ast-dump %s +// FIXME: clang-cc --ast-print-xml -o %t %s + +#include "cxx-language-features.inc" diff --git a/clang/test/Coverage/c-language-features.inc b/clang/test/Coverage/c-language-features.inc index 5258040cc11..bcf4127299f 100644 --- a/clang/test/Coverage/c-language-features.inc +++ b/clang/test/Coverage/c-language-features.inc @@ -140,6 +140,7 @@ void f4(int a0, int a1, int a2, va_list ap) { int t32 = __real (t32_cond ? t32_a : t32_b); struct { int x, y; } t33, *t34, t35[12], t36(int, float); + float t37, *t38, t39[9], t40(double); } // Extended vectors diff --git a/clang/test/Coverage/cxx-language-features.inc b/clang/test/Coverage/cxx-language-features.inc new file mode 100644 index 00000000000..92c9fd6f27c --- /dev/null +++ b/clang/test/Coverage/cxx-language-features.inc @@ -0,0 +1,12 @@ +//-*- C++ -*- + +// Intended to exercise all syntactic parts of the C++ language that +// aren't part of C. + +namespace std { + namespace debug { + } +} + +using namespace std::debug; +using namespace std; |

