aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-12 22:11:34 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-12 22:11:34 +0000
commit9370c8f4af43a98a6f16e65f5d88d58db846e374 (patch)
treea0d157cc29c5314243f6e0a1ea3e4ebf40de01d5
parentac6c09917eaf32a35d2c7c95856864d877ef1963 (diff)
Add IR generation support for SizeOfPackExpr.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123332 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/CGExprScalar.cpp5
-rw-r--r--test/CodeGenCXX/variadic-templates.cpp12
2 files changed, 17 insertions, 0 deletions
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 6b22fc48d4..f80304d6de 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -195,6 +195,11 @@ public:
return Builder.CreateBitCast(V, ConvertType(E->getType()));
}
+ Value *VisitSizeOfPackExpr(SizeOfPackExpr *E) {
+ return llvm::ConstantInt::get(ConvertType(E->getType()),
+ E->getPackLength());
+ }
+
// l-values.
Value *VisitDeclRefExpr(DeclRefExpr *E) {
Expr::EvalResult Result;
diff --git a/test/CodeGenCXX/variadic-templates.cpp b/test/CodeGenCXX/variadic-templates.cpp
new file mode 100644
index 0000000000..5faeba4057
--- /dev/null
+++ b/test/CodeGenCXX/variadic-templates.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++0x -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
+
+template<typename ...Types>
+int get_num_types(Types...) {
+ return sizeof...(Types);
+}
+
+// CHECK: define weak_odr i32 @_Z13get_num_typesIJifdEEispT_
+// CHECK: ret i32 3
+template int get_num_types(int, float, double);
+
+