summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-07-22 20:25:36 +0000
committerDouglas Gregor <dgregor@apple.com>2009-07-22 20:25:36 +0000
commit7ac44f4cfb4ddf9940e8e3ec0bfd20f31bde3dfa (patch)
treed281c2a8c26b32ec4b6f5f2041ffbb9407facfaa
parentf87fbc058d7c4c889eb6aaef98bd9df68991d6f3 (diff)
downloadbcm5719-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.cpp3
-rw-r--r--clang/test/SemaTemplate/temp_class_spec.cpp18
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;
};
OpenPOWER on IntegriCloud