diff options
author | Volodymyr Sapsai <vsapsai@apple.com> | 2017-09-21 17:58:27 +0000 |
---|---|---|
committer | Volodymyr Sapsai <vsapsai@apple.com> | 2017-09-21 17:58:27 +0000 |
commit | ddf524c031947ffd495ff4fda9f78be28b05959f (patch) | |
tree | bcafdae05a2496cc0283cc90ca1a1ab8b1410ed0 | |
parent | 4c9e14f6c47a401d35e9e33bab19d5f36b1db2d2 (diff) | |
download | bcm5719-llvm-ddf524c031947ffd495ff4fda9f78be28b05959f.tar.gz bcm5719-llvm-ddf524c031947ffd495ff4fda9f78be28b05959f.zip |
[Sema] Fix using old initializer during switch statement transformation.
It fixes a crash in CodeGen when we are trying to generate code for
initializer expression created before template instantiation, like
CallExpr '<dependent type>'
|-UnresolvedLookupExpr '<overloaded function type>' lvalue (ADL) = 'parse'
`-DeclRefExpr 'Buffer<N>' lvalue ParmVar 'buffer' 'Buffer<N>'
rdar://problem/33888545
Reviewers: rsmith, ahatanak
Reviewed By: ahatanak
Subscribers: aemerson, kristof.beyls, cfe-commits
Differential Revision: https://reviews.llvm.org/D38009
llvm-svn: 313896
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 3 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx1z-init-statement-template.cpp | 32 |
2 files changed, 33 insertions, 2 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index ee67e15b9ae..6fb9eca9a9c 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6601,8 +6601,7 @@ TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { // Rebuild the switch statement. StmtResult Switch - = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), - S->getInit(), Cond); + = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); if (Switch.isInvalid()) return StmtError(); diff --git a/clang/test/SemaCXX/cxx1z-init-statement-template.cpp b/clang/test/SemaCXX/cxx1z-init-statement-template.cpp new file mode 100644 index 00000000000..cedd2c720d9 --- /dev/null +++ b/clang/test/SemaCXX/cxx1z-init-statement-template.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -std=c++1z -verify -emit-llvm-only %s +// expected-no-diagnostics + +// rdar://problem/33888545 +template <unsigned int BUFFER_SIZE> class Buffer {}; + +class A { +public: + int status; +}; + +template <unsigned int N> A parse(Buffer<N> buffer); + +template<unsigned int N> +void init_in_if(Buffer<N> buffer) { + if (A a = parse(buffer); a.status > 0) { + } +} + +template<unsigned int N> +void init_in_switch(Buffer<N> buffer) { + switch (A a = parse(buffer); a.status) { + default: + break; + } +} + +void test() { + Buffer<10> buffer; + init_in_if(buffer); + init_in_switch(buffer); +} |