diff options
| author | David Blaikie <dblaikie@gmail.com> | 2013-07-13 21:08:08 +0000 |
|---|---|---|
| committer | David Blaikie <dblaikie@gmail.com> | 2013-07-13 21:08:08 +0000 |
| commit | 66ed89d07ffd6d5c372e4bb566216da30844a796 (patch) | |
| tree | 8ff080a8cdeb96adc0b7290c567a6288f38c5c28 | |
| parent | ab277d64003cdc42ae74b1ff5bca9d869ec55a33 (diff) | |
| download | bcm5719-llvm-66ed89d07ffd6d5c372e4bb566216da30844a796.tar.gz bcm5719-llvm-66ed89d07ffd6d5c372e4bb566216da30844a796.zip | |
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.
llvm-svn: 186261
| -rw-r--r-- | clang/include/clang/AST/Type.h | 4 | ||||
| -rw-r--r-- | clang/include/clang/AST/TypeNodes.def | 2 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 1 | ||||
| -rw-r--r-- | clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp | 4 |
5 files changed, 9 insertions, 3 deletions
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 1133d126c3e..562243c1239 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/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/clang/include/clang/AST/TypeNodes.def b/clang/include/clang/AST/TypeNodes.def index a29ae231e94..3126f48c644 100644 --- a/clang/include/clang/AST/TypeNodes.def +++ b/clang/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/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index e5fb06a7437..11149f47929 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/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/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index bea13d42698..51b86f77e59 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/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/clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp b/clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp index afd9b4b0de3..2d46502e1d9 100644 --- a/clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp +++ b/clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp @@ -9,5 +9,9 @@ template<class T> struct A { B<short> b; template<typename T> using U = int; + +template<typename ...T> void f(U<T> ...xs); +void g() { f<void,void,void>(1, 2, 3); } + // FIXME: This is illegal, but probably only because CWG1044 missed this paragraph. template<typename T> using U = U<T>; |

