mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 17:26:07 +00:00

By storing the instantiated expression back in the ParmVarDecl, we remove the last need for separately storing the sub-expression of a CXXDefaultArgExpr. This makes PCH/Modules merging quite simple: CXXDefaultArgExpr records are serialized as references to the ParmVarDecl, and we ignore redundant attempts to overwrite the instantiated expression. This has some extremely marginal impact on user-facing semantics. However, the major effect is that it avoids IRGen errors about conflicting definitions due to lambdas in the argument being instantiated multiple times while sharing the same mangling. It should also slightly improve memory usage and module file size. rdar://23810407 llvm-svn: 256983
51 lines
1.3 KiB
C++
51 lines
1.3 KiB
C++
// Test default argument instantiation in chained PCH.
|
|
|
|
// Without PCH
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -include %s -include %s %s
|
|
|
|
// With PCH
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s -chain-include %s -chain-include %s
|
|
|
|
// With modules
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -fmodules %s -chain-include %s -chain-include %s
|
|
|
|
// expected-no-diagnostics
|
|
|
|
#ifndef HEADER1
|
|
#define HEADER1
|
|
//===----------------------------------------------------------------------===//
|
|
// Primary header.
|
|
|
|
namespace rdar23810407 {
|
|
template<typename T> int f(T t) {
|
|
extern T rdar23810407_variable;
|
|
return 0;
|
|
}
|
|
template<typename T> int g(int a = f([] {}));
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
#elif not defined(HEADER2)
|
|
#define HEADER2
|
|
#if !defined(HEADER1)
|
|
#error Header inclusion order messed up
|
|
#endif
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Dependent header.
|
|
|
|
inline void instantiate_once() {
|
|
rdar23810407::g<int>();
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
#else
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
void test() {
|
|
rdar23810407::g<int>();
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
#endif
|