SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs, Owner,
StartingScope, InstantiatingVarTemplate);
- if (D->isNRVOVariable()) {
+ if (D->isNRVOVariable() && !Var->isInvalidDecl()) {
QualType RT;
if (auto *F = dyn_cast<FunctionDecl>(DC))
RT = F->getReturnType();
template X<int> test_dependent_invalid_decl<int>(); // expected-note {{requested here}}
} // namespace test_auto_variables
+
+namespace PR51708 {
+
+class a1; // expected-note 4 {{forward declaration of 'PR51708::a1'}}
+template <class> class A2; // expected-note 4 {{template is declared here}}
+using a2 = A2<int>;
+
+template <class b> b f() {
+ // expected-error@-1 {{incomplete result type 'PR51708::a1' in function definition}}
+ // expected-error@-2 {{implicit instantiation of undefined template 'PR51708::A2<int>}}
+
+ b d;
+ // expected-error@-1 {{variable has incomplete type 'PR51708::a1'}}
+ // expected-error@-2 {{implicit instantiation of undefined template 'PR51708::A2<int>}}
+
+ return d;
+}
+template a1 f<a1>(); // expected-note-re {{in instantiation {{.*}} requested here}}
+template a2 f<a2>(); // expected-note-re {{in instantiation {{.*}} requested here}}
+
+template <class b> b g() {
+ // expected-error@-1 {{incomplete result type 'PR51708::a1' in function definition}}
+ // expected-error@-2 {{implicit instantiation of undefined template 'PR51708::A2<int>}}
+
+ b d __attribute__((aligned(1)));
+ // expected-error@-1 {{variable has incomplete type 'PR51708::a1'}}
+ // expected-error@-2 {{implicit instantiation of undefined template 'PR51708::A2<int>}}
+
+ return d;
+}
+template a1 g<a1>(); // expected-note-re {{in instantiation {{.*}} requested here}}
+template a2 g<a2>(); // expected-note-re {{in instantiation {{.*}} requested here}}
+
+} // namespace PR51708