diff options
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 6 | ||||
-rw-r--r-- | clang/test/SemaCXX/return-stack-addr-2.cpp | 22 |
2 files changed, 26 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 227079f342d..db29e720054 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -6144,8 +6144,10 @@ static const Expr *EvalVal(const Expr *E, // Array subscripts are potential references to data on the stack. We // retrieve the DeclRefExpr* for the array variable if it indeed // has local storage. - return EvalAddr(cast<ArraySubscriptExpr>(E)->getBase(), refVars, - ParentDecl); + const auto *ASE = cast<ArraySubscriptExpr>(E); + if (ASE->isTypeDependent()) + return nullptr; + return EvalAddr(ASE->getBase(), refVars, ParentDecl); } case Stmt::OMPArraySectionExprClass: { diff --git a/clang/test/SemaCXX/return-stack-addr-2.cpp b/clang/test/SemaCXX/return-stack-addr-2.cpp new file mode 100644 index 00000000000..ad27567fcd6 --- /dev/null +++ b/clang/test/SemaCXX/return-stack-addr-2.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -std=c++11 %s +// expected-no-diagnostics + +namespace PR26599 { +template <typename> +struct S; + +struct I {}; + +template <typename T> +void *&non_pointer() { + void *&r = S<T>()[I{}]; + return r; +} + +template <typename T> +void *&pointer() { + void *&r = S<T>()[nullptr]; + return r; +} +} + |