From: David Blaikie Date: Sat, 13 Jul 2013 21:08:08 +0000 (+0000) Subject: Correctly classify pack expansions as NON_CANONICAL_UNLESS_DEPENDENT X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=226399ce18cdcbb1e83af7c5e644bdabb9d4f2f8;p=clang Correctly classify pack expansions as NON_CANONICAL_UNLESS_DEPENDENT Test coverage for non-dependent pack expansions doesn't demonstrate a failure prior to this patch (a follow-up commit improving debug info will cover this commit specifically) but covers a related hole in our test coverage. Reviewed by Richard Smith & Eli Friedman. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186261 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h index 1133d126c3..562243c123 100644 --- a/include/clang/AST/Type.h +++ b/include/clang/AST/Type.h @@ -4202,8 +4202,8 @@ public: return None; } - bool isSugared() const { return false; } - QualType desugar() const { return QualType(this, 0); } + bool isSugared() const { return !Pattern->isDependentType(); } + QualType desugar() const { return isSugared() ? Pattern : QualType(this, 0); } void Profile(llvm::FoldingSetNodeID &ID) { Profile(ID, getPattern(), getNumExpansions()); diff --git a/include/clang/AST/TypeNodes.def b/include/clang/AST/TypeNodes.def index a29ae231e9..3126f48c64 100644 --- a/include/clang/AST/TypeNodes.def +++ b/include/clang/AST/TypeNodes.def @@ -99,7 +99,7 @@ TYPE(Auto, Type) DEPENDENT_TYPE(InjectedClassName, Type) DEPENDENT_TYPE(DependentName, Type) DEPENDENT_TYPE(DependentTemplateSpecialization, Type) -DEPENDENT_TYPE(PackExpansion, Type) +NON_CANONICAL_UNLESS_DEPENDENT_TYPE(PackExpansion, Type) TYPE(ObjCObject, Type) TYPE(ObjCInterface, ObjCObjectType) TYPE(ObjCObjectPointer, Type) diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index e5fb06a743..11149f4792 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -2097,6 +2097,7 @@ llvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile Unit, case Type::TypeOf: case Type::Decltype: case Type::UnaryTransform: + case Type::PackExpansion: llvm_unreachable("type should have been unwrapped!"); case Type::Auto: Diag = "auto"; diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index bea13d4269..51b86f77e5 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -1344,6 +1344,7 @@ void CodeGenFunction::EmitVariablyModifiedType(QualType type) { case Type::UnaryTransform: case Type::Attributed: case Type::SubstTemplateTypeParm: + case Type::PackExpansion: // Keep walking after single level desugaring. type = type.getSingleStepDesugaredType(getContext()); break; diff --git a/test/CXX/temp/temp.decls/temp.alias/p3.cpp b/test/CXX/temp/temp.decls/temp.alias/p3.cpp index afd9b4b0de..2d46502e1d 100644 --- a/test/CXX/temp/temp.decls/temp.alias/p3.cpp +++ b/test/CXX/temp/temp.decls/temp.alias/p3.cpp @@ -9,5 +9,9 @@ template struct A { B b; template using U = int; + +template void f(U ...xs); +void g() { f(1, 2, 3); } + // FIXME: This is illegal, but probably only because CWG1044 missed this paragraph. template using U = U;