Preserve numeric literal suffixes during type canonicalization.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 20 Nov 2014 03:37:32 +0000 (03:37 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 20 Nov 2014 03:37:32 +0000 (03:37 +0000)
Patch by Pierre Gousseau! Test cases altered significantly by me.

llvm-svn: 222404

clang/lib/AST/StmtProfile.cpp
clang/test/CodeGenCXX/mangle-literal-suffix.cpp [new file with mode: 0644]
clang/test/SemaTemplate/canonical-expr-type.cpp

index 647b643..d1f25d6 100644 (file)
@@ -501,6 +501,7 @@ void StmtProfiler::VisitPredefinedExpr(const PredefinedExpr *S) {
 void StmtProfiler::VisitIntegerLiteral(const IntegerLiteral *S) {
   VisitExpr(S);
   S->getValue().Profile(ID);
+  ID.AddInteger(S->getType()->castAs<BuiltinType>()->getKind());
 }
 
 void StmtProfiler::VisitCharacterLiteral(const CharacterLiteral *S) {
@@ -513,6 +514,7 @@ void StmtProfiler::VisitFloatingLiteral(const FloatingLiteral *S) {
   VisitExpr(S);
   S->getValue().Profile(ID);
   ID.AddBoolean(S->isExact());
+  ID.AddInteger(S->getType()->castAs<BuiltinType>()->getKind());
 }
 
 void StmtProfiler::VisitImaginaryLiteral(const ImaginaryLiteral *S) {
diff --git a/clang/test/CodeGenCXX/mangle-literal-suffix.cpp b/clang/test/CodeGenCXX/mangle-literal-suffix.cpp
new file mode 100644 (file)
index 0000000..7a3e8ad
--- /dev/null
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -triple mips-none-none -emit-llvm -o - %s | FileCheck %s
+
+template <class T> void g3(char (&buffer)[sizeof(T() + 5.0)]) {}
+template void g3(char (&)[sizeof(double)]);
+// CHECK: _Z2g3IdEvRAszplcvT__ELd4014000000000000E_c
+
+template <class T> void g4(char (&buffer)[sizeof(T() + 5.0L)]) {}
+template void g4(char (&)[sizeof(long double)]);
+// CHECK: _Z2g4IeEvRAszplcvT__ELe4014000000000000E_c
+
+template <class T> void g5(char (&buffer)[sizeof(T() + 5)]) {}
+template void g5(char (&)[sizeof(int)]);
+// CHECK: _Z2g5IiEvRAszplcvT__ELi5E_c
+
+template <class T> void g6(char (&buffer)[sizeof(T() + 5L)]) {}
+template void g6(char (&)[sizeof(long int)]);
+// CHECK: _Z2g6IlEvRAszplcvT__ELl5E_c
index 4770c4f..f8d7d7e 100644 (file)
@@ -47,3 +47,11 @@ struct X2 {
   void f0(type2);
   void f0(type3); // expected-error{{redeclared}}
 };
+
+// Test canonicalization doesn't conflate different literal suffixes.
+template<typename T> void literal_suffix(int (&)[sizeof(T() + 0)]) {}
+template<typename T> void literal_suffix(int (&)[sizeof(T() + 0L)]) {}
+template<typename T> void literal_suffix(int (&)[sizeof(T() + 0LL)]) {}
+template<typename T> void literal_suffix(int (&)[sizeof(T() + 0.f)]) {}
+template<typename T> void literal_suffix(int (&)[sizeof(T() + 0.)]) {}
+template<typename T> void literal_suffix(int (&)[sizeof(T() + 0.l)]) {}