summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-07-24 20:28:49 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-07-24 20:28:49 +0000
commita5c335527d31859f8a87af0a6147a095accdfdd7 (patch)
tree9035de6639ce82604cbf90977c4c01ec7c06ff5d /clang
parent70fa4661ebd6a79570cc69c0a3d5a4991338a461 (diff)
downloadbcm5719-llvm-a5c335527d31859f8a87af0a6147a095accdfdd7.tar.gz
bcm5719-llvm-a5c335527d31859f8a87af0a6147a095accdfdd7.zip
More Sema check for constructor's member initializer along
with type conversion to fix ir-gen crash. llvm-svn: 77000
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp9
-rw-r--r--clang/test/SemaCXX/constructor-initializer.cpp10
3 files changed, 19 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 881e9d90a10..9031a6ec9cc 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -1664,6 +1664,8 @@ def error_multiple_base_initialization : Error <
def err_mem_init_not_member_or_class : Error<
"member initializer %0 does not name a non-static data member or base "
"class">;
+def err_mem_initializer_mismatch : Error<
+ "Too many arguments for member initializer %0">;
def warn_field_initialized : Warning<
"member '%0' will be initialized after">,
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index d5c8c3d3fce..7b0c9c6ca47 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -725,6 +725,15 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD,
C = PerformInitializationByConstructor(
FieldType, (Expr **)Args, NumArgs, IdLoc,
SourceRange(IdLoc, RParenLoc), Member->getDeclName(), IK_Direct);
+ else if (NumArgs != 1)
+ return Diag(IdLoc, diag::err_mem_initializer_mismatch)
+ << MemberOrBase << SourceRange(IdLoc, RParenLoc);
+ else {
+ Expr * NewExp = (Expr*)Args[0];
+ if (PerformCopyInitialization(NewExp, FieldType, "passing"))
+ return true;
+ Args[0] = NewExp;
+ }
// FIXME: Perform direct initialization of the member.
return new (Context) CXXBaseOrMemberInitializer(Member, (Expr **)Args,
NumArgs, C, IdLoc);
diff --git a/clang/test/SemaCXX/constructor-initializer.cpp b/clang/test/SemaCXX/constructor-initializer.cpp
index 71d38a1438b..3909cd984dd 100644
--- a/clang/test/SemaCXX/constructor-initializer.cpp
+++ b/clang/test/SemaCXX/constructor-initializer.cpp
@@ -98,8 +98,7 @@ struct Current : Derived {
};
// FIXME. This is bad message!
-struct M { // expected-note {{candidate function}} \
- // expected-note {{candidate function}}
+struct M {
M(int i, int j); // expected-note {{candidate function}} \
// // expected-note {{candidate function}}
};
@@ -115,4 +114,11 @@ struct P : M { // expected-error {{default constructor for 'struct M' is missin
M m; // expected-error {{default constructor for 'struct M' is missing in initialization of mamber}}
};
+struct Q {
+ Q() : f1(1,2), // expected-error {{Too many arguments for member initializer 'f1'}}
+ pf(0.0) { } // expected-error {{incompatible type passing 'double', expected 'float *'}}
+ float f1;
+
+ float *pf;
+};
OpenPOWER on IntegriCloud