diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-07-22 20:25:36 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-07-22 20:25:36 +0000 |
| commit | 7ac44f4cfb4ddf9940e8e3ec0bfd20f31bde3dfa (patch) | |
| tree | d281c2a8c26b32ec4b6f5f2041ffbb9407facfaa | |
| parent | f87fbc058d7c4c889eb6aaef98bd9df68991d6f3 (diff) | |
| download | bcm5719-llvm-7ac44f4cfb4ddf9940e8e3ec0bfd20f31bde3dfa.tar.gz bcm5719-llvm-7ac44f4cfb4ddf9940e8e3ec0bfd20f31bde3dfa.zip | |
Canonicalize the types produced by template argument deduction.
llvm-svn: 76777
| -rw-r--r-- | clang/lib/Sema/SemaTemplateDeduction.cpp | 3 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/temp_class_spec.cpp | 18 |
2 files changed, 20 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 4e6d0f4dd16..deb5457d857 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -361,7 +361,8 @@ DeduceTemplateArguments(ASTContext &Context, assert(TemplateTypeParm->getDepth() == 0 && "Can't deduce with depth > 0"); unsigned Quals = Arg.getCVRQualifiers() & ~Param.getCVRQualifiers(); - QualType DeducedType = Arg.getQualifiedType(Quals); + QualType DeducedType + = Context.getCanonicalType(Arg.getQualifiedType(Quals)); if (Deduced[Index].isNull()) Deduced[Index] = TemplateArgument(SourceLocation(), DeducedType); diff --git a/clang/test/SemaTemplate/temp_class_spec.cpp b/clang/test/SemaTemplate/temp_class_spec.cpp index db154f6076b..b1053fe3cb7 100644 --- a/clang/test/SemaTemplate/temp_class_spec.cpp +++ b/clang/test/SemaTemplate/temp_class_spec.cpp @@ -136,6 +136,24 @@ struct get_array_size<T[N]> { int array_size0[get_array_size<int[12]>::value == 12? 1 : -1]; template<typename T> +struct remove_extent { + typedef T type; +}; + +template<typename T> +struct remove_extent<T[]> { + typedef T type; +}; + +template<typename T, unsigned N> +struct remove_extent<T[N]> { + typedef T type; +}; + +int remove_extent0[is_same<remove_extent<int[][5]>::type, int[5]>::value? 1 : -1]; +int remove_extent1[is_same<remove_extent<const int[][5]>::type, const int[5]>::value? 1 : -1]; + +template<typename T> struct is_unary_function { static const bool value = false; }; |

