forked from OSchip/llvm-project
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
This commit is contained in:
parent
ab277d6400
commit
66ed89d07f
|
@ -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());
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>;
|
||||
|
|
Loading…
Reference in New Issue