forked from OSchip/llvm-project
Push alias-declarations and alias-template declarations into scope even if
they're redeclarations. This is necessary in order for name lookup to correctly find the most recent declaration of the name (which affects default template argument lookup and cross-module merging, among other things). llvm-svn: 275612
This commit is contained in:
parent
f52a899f4a
commit
3cbf3f1f59
|
@ -8885,9 +8885,7 @@ Decl *Sema::ActOnAliasDeclaration(Scope *S,
|
|||
NewND = NewTD;
|
||||
}
|
||||
|
||||
if (!Redeclaration)
|
||||
PushOnScopeChains(NewND, S);
|
||||
|
||||
PushOnScopeChains(NewND, S);
|
||||
ActOnDocumentableDecl(NewND);
|
||||
return NewND;
|
||||
}
|
||||
|
|
|
@ -38,8 +38,8 @@ namespace VariableLengthArrays {
|
|||
using T = int[n]; // expected-error {{variable length array declaration not allowed at file scope}}
|
||||
|
||||
const int m = 42;
|
||||
using U = int[m]; // expected-note {{previous definition}}
|
||||
using U = int[42]; // ok
|
||||
using U = int[m];
|
||||
using U = int[42]; // expected-note {{previous definition}}
|
||||
using U = int; // expected-error {{type alias redefinition with different types ('int' vs 'int [42]')}}
|
||||
|
||||
void f() {
|
||||
|
|
|
@ -146,9 +146,9 @@ namespace dr616 { // dr616: no
|
|||
#if __cplusplus >= 201103L
|
||||
struct S { int n; } s;
|
||||
// FIXME: These should all be 'int &&'
|
||||
using T = decltype(S().n); // expected-note 2{{previous}}
|
||||
using T = decltype(S().n);
|
||||
using T = decltype(static_cast<S&&>(s).n);
|
||||
using T = decltype(S().*&S::n);
|
||||
using T = decltype(S().*&S::n); // expected-note 2{{previous}}
|
||||
using T = decltype(static_cast<S&&>(s).*&S::n); // expected-error {{different type}}
|
||||
using T = int&&; // expected-error {{different type}}
|
||||
#endif
|
||||
|
|
|
@ -102,10 +102,10 @@ using D1 = drop<3, int, char, double, long>::type;
|
|||
using D1 = types<long>;
|
||||
|
||||
using T2 = take<4, int, char, double, long>::type; // expected-note {{previous}}
|
||||
using T2 = types<int, char, double, long>;
|
||||
// FIXME: Desguar the types on the RHS in this diagnostic.
|
||||
// desired-error {{'types<void, void, void, void>' vs 'types<int, char, double, long>'}}
|
||||
using T2 = types<void, void, void, void>; // expected-error {{'types<void, void, void, void>' vs 'types<typename inner<_>::type, typename inner<_>::type, typename inner<_>::type, typename inner<_>::type>'}}
|
||||
using T2 = types<int, char, double, long>;
|
||||
using D2 = drop<4, int, char, double, long>::type;
|
||||
using D2 = types<>;
|
||||
|
||||
|
|
|
@ -58,6 +58,11 @@ G::A pre_ga // expected-error +{{must be imported}}
|
|||
decltype(G::h) pre_gh = G::h; // expected-error +{{must be imported}}
|
||||
// expected-note@defs.h:51 +{{here}}
|
||||
|
||||
int pre_h = H(); // expected-error +{{must be imported}}
|
||||
// expected-note@defs.h:56 +{{here}}
|
||||
using pre_i = I<>; // expected-error +{{must be imported}}
|
||||
// expected-note@defs.h:57 +{{here}}
|
||||
|
||||
J<> pre_j; // expected-error {{declaration of 'J' must be imported}}
|
||||
#ifdef IMPORT_USE_2
|
||||
// expected-error-re@-2 {{default argument of 'J' must be imported from one of {{.*}}stuff.use{{.*}}stuff.use-2}}
|
||||
|
@ -99,6 +104,8 @@ int post_ff = F<char>().f();
|
|||
int post_fg = F<char>().g<int>();
|
||||
G::A post_ga = G::a;
|
||||
decltype(G::h) post_gh = G::h;
|
||||
int post_h = H();
|
||||
using post_i = I<>;
|
||||
J<> post_j;
|
||||
template<typename T, int N, template<typename> class K> struct J;
|
||||
J<> post_j2;
|
||||
|
|
|
@ -35,8 +35,8 @@ namespace VariableLengthArrays {
|
|||
template<typename Z> using T = int[n]; // expected-error {{variable length array declaration not allowed at file scope}}
|
||||
|
||||
const int m = 42;
|
||||
template<typename Z> using U = int[m]; // expected-note {{previous definition}}
|
||||
template<typename Z> using U = int[42]; // ok
|
||||
template<typename Z> using U = int[m];
|
||||
template<typename Z> using U = int[42]; // expected-note {{previous definition}}
|
||||
template<typename Z> using U = int; // expected-error {{type alias template redefinition with different types ('int' vs 'int [42]')}}
|
||||
}
|
||||
|
||||
|
|
|
@ -221,3 +221,9 @@ namespace PR14858 {
|
|||
template<typename ...T, typename ...U> void h(X<T...> &) {}
|
||||
template<typename ...T, typename ...U> void h(X<U...> &) {} // ok, different
|
||||
}
|
||||
|
||||
namespace redecl {
|
||||
template<typename> using A = int;
|
||||
template<typename = void> using A = int;
|
||||
A<> a; // ok
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue