forked from OSchip/llvm-project
[Sema] Add a comment on an identified bug on default arguments.
Summary: The mis-compile is triggered by internal code, but I haven't reduced it to a small piece of code. Add a FIXME here, since a decent fix doesn't seem to be trivial. The decent fix can be changing Decl::Init to PointerUnion<Stmt *, EvaluatedStmt *, ParamVarDecl *>, and make setUninstantiatedDefaultArg take a ParamVarDecl *, which contains the Expr * as the default argument. This way, getTemplateInstantiationArgs can take that ParamVarDecl and do the right thing. Reviewers: rsmith Subscribers: sanjoy, cfe-commits Differential Revision: https://reviews.llvm.org/D36253 llvm-svn: 309908
This commit is contained in:
parent
2c27daf7c0
commit
1efd2229f0
|
@ -4477,6 +4477,22 @@ bool Sema::CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD,
|
|||
*this, ExpressionEvaluationContext::PotentiallyEvaluated, Param);
|
||||
|
||||
// Instantiate the expression.
|
||||
//
|
||||
// FIXME: Pass in a correct Pattern argument, otherwise
|
||||
// getTemplateInstantiationArgs uses the lexical context of FD, e.g.
|
||||
//
|
||||
// template<typename T>
|
||||
// struct A {
|
||||
// static int FooImpl();
|
||||
//
|
||||
// template<typename Tp>
|
||||
// // bug: default argument A<T>::FooImpl() is evaluated with 2-level
|
||||
// // template argument list [[T], [Tp]], should be [[Tp]].
|
||||
// friend A<Tp> Foo(int a);
|
||||
// };
|
||||
//
|
||||
// template<typename T>
|
||||
// A<T> Foo(int a = A<T>::FooImpl());
|
||||
MultiLevelTemplateArgumentList MutiLevelArgList
|
||||
= getTemplateInstantiationArgs(FD, nullptr, /*RelativeToPrimary=*/true);
|
||||
|
||||
|
|
Loading…
Reference in New Issue