diff options
author | Wei Pan <wei.pan@intel.com> | 2013-09-16 13:57:27 +0000 |
---|---|---|
committer | Wei Pan <wei.pan@intel.com> | 2013-09-16 13:57:27 +0000 |
commit | 3312933e244d820c1c6fec83c4c0c0f67f42d25b (patch) | |
tree | de5a1bb3493083cc0792ad589906ea46c46b0dbc /test/CodeGenCXX/predefined-expr.cpp | |
parent | 84f007b17399ef90f234ef0cef6e3f2495a12f10 (diff) | |
download | clang-3312933e244d820c1c6fec83c4c0c0f67f42d25b.tar.gz |
Handle PredefinedExpr with templates and lambdas
Summary:
- lambdas, blocks or captured statements in templates were not
handled which causes codegen crashes.
Differential Revision: http://llvm-reviews.chandlerc.com/D1628
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190784 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/predefined-expr.cpp')
-rw-r--r-- | test/CodeGenCXX/predefined-expr.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/test/CodeGenCXX/predefined-expr.cpp b/test/CodeGenCXX/predefined-expr.cpp index 24ead8f8f4..9062ee095c 100644 --- a/test/CodeGenCXX/predefined-expr.cpp +++ b/test/CodeGenCXX/predefined-expr.cpp @@ -9,6 +9,8 @@ // CHECK: private unnamed_addr constant [57 x i8] c"void NonTypeTemplateParam<42>::size() const [Count = 42]\00" // CHECK: private unnamed_addr constant [122 x i8] c"static void ClassWithTemplateTemplateParam<char, NS::ClassTemplate>::staticMember() [T = char, Param = NS::ClassTemplate]\00" // CHECK: private unnamed_addr constant [106 x i8] c"void OuterClass<int *>::MiddleClass::InnerClass<float>::memberFunction(T, U) const [T = int *, U = float]\00" +// CHECK: private unnamed_addr constant [51 x i8] c"void functionTemplateWithCapturedStmt(T) [T = int]\00" +// CHECK: private unnamed_addr constant [76 x i8] c"auto functionTemplateWithLambda(int)::<anonymous class>::operator()() const\00" // CHECK: private unnamed_addr constant [65 x i8] c"void functionTemplateWithUnnamedTemplateParameter(T) [T = float]\00" // CHECK: private unnamed_addr constant [60 x i8] c"void functionTemplateExplicitSpecialization(T) [T = double]\00" @@ -376,6 +378,23 @@ void functionTemplateWithUnnamedTemplateParameter(T t) } template <typename T> +void functionTemplateWithLambda(T t) +{ + []() { + printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); + } (); +} + +template <typename T> +void functionTemplateWithCapturedStmt(T t) +{ + #pragma clang __debug captured + { + printf("__PRETTY_FUNCTION__ %s\n\n", __PRETTY_FUNCTION__); + } +} + +template <typename T> class OuterClass { public: @@ -500,6 +519,9 @@ int main() { functionTemplateExplicitSpecialization(0.0); functionTemplateWithUnnamedTemplateParameter<int, float>(0.0f); + functionTemplateWithLambda<int>(0); + functionTemplateWithCapturedStmt<int>(0); + OuterClass<int *>::MiddleClass::InnerClass<float> omi; omi.memberFunction(0, 0.0f); |